2010-04-22 14 views
12

Mam następujący kod, który pobiera treści wideo:Jak przesyłać strumieniowo treści wideo w 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(); 
    } 
} 

Ale problemem jest to, że całe pliki do pobrania plików przed odtwarzane. Jak mogę go przesyłać strumieniowo i odtwarzać w trakcie pobierania? A może to zależy od aplikacji klienta/odbiornika do zarządzania?

Odpowiedz

17

Czytasz cały plik do jednego bufora, a następnie wysyłając całą tablicę bajtów na raz.

Powinieneś przeczytać mniejszy bufor w pętli while.

Na przykład:

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

Ahh, to jest to! Dziękuję Ci. Tak naprawdę spróbowałem czegoś takiego, ale porównując mój niedziałający kod z twoim, zauważyłem, że niewłaściwie użyłem Response.Flush(). Jeszcze raz dziękuję, SLaks. – Kon

3

Czy obejrzałeś Smooth Streaming?

Spójrz na przykładowy kod here

+0

Link do przykładowego kodu jest martwy. Dlatego odpowiedzi powinny zawierać/kopiować kod, do którego się odnoszą. – mbomb007

2

To jest bardziej wydajne dla Ciebie szczególnie jeśli trzeba strumień wideo z pliku na serwerze lub nawet ten plik znajduje się na serwerze innym serwerze

pliku na dysku serwer:

context.Response.BinaryWrite(File.ReadAllBytes(HTTPContext.Current.Server.MapPath(_video.Location))); 

plików na zewnętrznym serwerze:

var wc = new WebClient(); 
    context.Response.BinaryWrite(wc.DownloadData(new Uri("http://mysite/video.mp4"))); 
+0

fajne - ale nadal musisz zaimplementować buforowane bufory, w przeciwnym razie pojemnik wideo będzie czekał aż wszystko zostanie pobrane. zabicie przeglądarki – ppumkin

Powiązane problemy