2010-04-22 32 views
12

Tôi có đoạn mã sau đó tải nội dung video:Làm cách nào để truyền trực tuyến nội dung video trong 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(); 
    } 
} 

Nhưng vấn đề là các tập tin toàn bộ tải trước khi được chơi. Làm thế nào tôi có thể làm cho nó dòng và chơi như nó vẫn đang tải xuống? Hoặc là điều này lên đến ứng dụng khách/nhận để quản lý?

Trả lời

17

Bạn đang đọc toàn bộ tập tin vào một bộ đệm duy nhất, sau đó gửi toàn bộ mảng byte cùng một lúc.

Bạn nên đọc vào bộ đệm nhỏ hơn trong vòng lặp while.

Ví dụ:

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, đúng vậy! Cảm ơn bạn. Tôi thực sự đã thử một cái gì đó như thế, nhưng so sánh mã không làm việc của tôi với bạn, tôi nhận thấy rằng tôi đã lạm dụng Response.Flush(). Cảm ơn một lần nữa, SLaks. – Kon

3

Bạn đã xem Smooth Streaming chưa?

Nhìn vào mẫu mã here

+0

Liên kết đến mã mẫu đã chết. Đó là lý do tại sao câu trả lời nên chứa/sao chép bất kỳ mã nào mà chúng tham chiếu đến. – mbomb007

2

Đây là hiệu quả hơn cho bạn đặc biệt nếu bạn cần stream video từ một tập tin trên máy chủ của bạn hoặc thậm chí tập tin này được lưu trữ tại máy chủ khác

File Trên của bạn server:

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

tập tin trên máy chủ bên ngoài:

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

tuyệt vời- nhưng bạn vẫn phải triển khai bộ đệm bị ngăn cách nếu không vùng chứa video sẽ đợi cho đến khi toàn bộ nội dung được tải xuống. giết chết trình duyệt của bạn .. – ppumkin

Các vấn đề liên quan