2010-04-22 15 views
12

Tengo el siguiente código que descarga el contenido de vídeo:¿Cómo transmitir contenido de video en 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(); 
    } 
} 

Pero el problema es que todo el archivo se descarga antes de que se está reproduciendo. ¿Cómo puedo hacer que se reproduzca y se reproduzca, ya que todavía se está descargando? ¿O esto depende de la aplicación del cliente/receptor para administrar?

Respuesta

17

Usted está leyendo el archivo entero en una sola memoria intermedia, entonces el envío de toda la matriz de bytes a la vez.

Debe leer en un búfer más pequeño en un bucle while.

Por ejemplo:

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, eso es todo! Gracias. De hecho, intenté algo así, pero comparando mi código que no funciona con el tuyo, me di cuenta de que estaba haciendo un uso incorrecto de Response.Flush(). Gracias de nuevo, SLaks. – Kon

3

¿Has mirado Smooth Streaming?

Mira código de ejemplo here

+0

El enlace al código de ejemplo está muerto. Es por eso que las respuestas deben contener/copiar el código al que se refieren. – mbomb007

2

Esto es más eficiente para usted especialmente si usted necesita para transmitir un video desde un archivo en el servidor o incluso este archivo está alojado en otro servidor

archivo en su servidor:

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

del archivo de servidor externo:

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

bien, pero aún tiene que implementar almacenamientos intermedios fragmentados, de lo contrario, el contenedor de video esperará hasta que todo se descargue. matando a su navegador ... – ppumkin

Cuestiones relacionadas