Как потоковое видео в asp.net?
У меня есть следующий код, который загружает видеоконтент:
WebRequest wreq = (HttpWebRequest)WebRequest.Create(url);
using (HttpWebResponse wresp = (HttpWebResponse)wreq.GetResponse())
using (Stream mystream = wresp.GetResponseStream())
{
using (BinaryReader reader = new BinaryReader(mystream))
{
int length = Convert.ToInt32(wresp.ContentLength);
byte[] buffer = new byte[length];
buffer = reader.ReadBytes(length);
Response.Clear();
Response.Buffer = false;
Response.ContentType = "video/mp4";
//Response.BinaryWrite(buffer);
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.End();
}
}
Но проблема в том, что весь файл загружается перед воспроизведением. Как я могу сделать его потоком и играть по мере его загрузки? Или это зависит от приложения клиента/получателя?
Ответы
Ответ 1
Вы читаете весь файл в один буфер, а затем отправляете весь массив байтов сразу.
Вы должны прочитать в меньший буфер в цикле while
.
Например:
byte[] buffer = new byte[4096];
while(true) {
int bytesRead = myStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
Response.OutputStream.Write(buffer, 0, bytesRead);
}
Ответ 2
Вы посмотрели Smooth Streaming?
Посмотрите пример кода здесь
Ответ 3
Это более эффективно для вас, особенно если вам нужно потоковое видео из файла на вашем сервере или даже этот файл размещен на другом сервере
Файл На вашем сервере:
context.Response.BinaryWrite(File.ReadAllBytes(HTTPContext.Current.Server.MapPath(_video.Location)));
Файл на внешнем сервере:
var wc = new WebClient();
context.Response.BinaryWrite(wc.DownloadData(new Uri("http://mysite/video.mp4")));