2013-05-07 22 views
5

Dönüştürülmüş videoların oynatılmasına izin verecek bir HTML5 VIDEO etiketi içerecek bir test sayfası oluşturmaya çalışıyorum. Videoları dönüştürüp bunları yerel olarak sunucuda depolayabiliyorum, ancak tüm videoları başka bir .aspx sayfası üzerinden aktarabilirim..NET HTML5 üzerinden MP4 videosu akışı

, ben Video ikili sağlamak dışında hiçbir şey yapacak HTML kodu ve getvideo.aspx sayfayı içerecek bir player.aspx sayfası vardır varsayarsak ben aşağıdaki kod benim player.aspx sayfasında iyi çalışır düşünüyordu:

Response.clearheaders 
Response.AddHeader("Content-Type", "video/mp4") 
Response.AddHeader("Content-Disposition", "inline;filename=""newvideo.mp4""") 

dim Err as string = "" 
Dim iStream As System.IO.Stream 

' Buffer to read 10K bytes in chunk: 
Dim buffer(buffersize) As Byte 
' Length of the file: 
Dim length As Integer 

' Total bytes to read: 
Dim dataToRead As Long 

' Identify the file to download including its path. 
Dim filepath As String = "./outout/videos/newvideo.mp4" 

' Identify the file name. 
Dim filename As String = System.IO.Path.GetFileName(filepath) 

' Open the file. 
try 
    iStream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) 
catch ex as exception 
    throw new exception("Could not create FileStream for [" & filepath & "], error follows." & vbcrlf & ex.toString) 
end try 

Try 
    ' Total bytes to read: 
    dataToRead = iStream.Length 

    ' Read the bytes. 
    While dataToRead > 0 
     ' Verify that the client is connected. 
     If system.web.httpcontext.current.Response.IsClientConnected Then 
      ' Read the data in buffer 
      length = iStream.Read(buffer, 0, buffersize) 
      ' Write the data to the current output stream. 
      system.web.httpcontext.current.Response.OutputStream.Write(buffer, 0, length) 
      ' Flush the data to the HTML output. 
      system.web.httpcontext.current.Response.Flush() 

      ReDim buffer(buffersize) ' Clear the buffer 
      dataToRead = dataToRead - length 
     Else 
      'prevent infinite loop if user disconnects 
      dataToRead = -1 
     End If 
    End While 

Catch ex As Exception 
    ' Trap the error, if any. 
    err = "Error accessing " & filepath & " : " & ex.tostring 
Finally 
    If IsNothing(iStream) = False Then 
     ' Close the file. 
     iStream.Close() 
    End If 
End Try 

if err<>"" then throw new exception(err) 

benim sayfa çıktısı almak Bütün bir HTML Video zaman aşımına görünüyor çalar (Chrome'un temel çalar) ve geçerli:

<div style="text-align:center"> 
<video controls autoplay id="video1" width="920"> 
    <source src="http://www.mywebsite.com/getvideo.aspx?getvideo=1" type="video/mp4"> 
    Your browser does not support HTML5 video. 
</video> 

getvideo.aspx sayfası aşağıdaki vb.net kodunu içeren PLAY düğmesi griye gider. Chrome Geliştirici araçlarındaki Ağ aracı, 45mb indirmenin ve 200 yanıt kodu aldığını gösterir. Bu bana iyi çalıştığını gösteriyor. "İptal" durumuyla ikinci bir GET talebi alsam da mı?

www.mywebsite.com/output/videos/myvideo.mp4 adresini ziyaret edersem, bu tarayıcıda düzgün bir şekilde oynatılır, dolayısıyla IIS'nin videoyu doğru şekilde akışa alacak şekilde yapılandırıldığını biliyorum.

Ben tepki içerik yapısını değiştirmek Ayrıca eğer benim ASPX sayfasına giderek, ancak bu da doğru HTML player oynamak vermediğinde "eki" ardından tarayıcı doğru videonun indirilmesini zorlar. .net üzerinden video yayınlamak için bir .aspx dosyası durduran HTML5 VIDEO etiketi ile 'zeki' oluyor mu? Yoksa cevap başlığını mı kaçırıyorum?

Teşekkürler!

+0

araştırmak için devam hala iki URL de aynı ve Scott Mitchell yazılan her ikisi noktası bu – JLo

cevap

3

SABİT!

Buradaki problem, muhtemelen, dizi-isteklerinin HTML5 video uygulamasıyla ilgili bir şeydir. Videoyu HİZMET için kullanılan sayfasında menzil-istekleri destekleyen olmadan, onlar sadece çalışmaz. http://dotnetslackers.com/articles/aspnet/Range-Specific-Requests-in-ASP-NET.aspx

Ve çözüm için C# uygulanmasını temin Chris Coulson diğerine yararlı yazı:

Ben Scott durumda beni set Mitchell bu çok yararlı sonrası oldu! http://blogs.visigo.com/chriscoulson/easy-handling-of-http-range-requests-in-asp-net/

Chris bulunan kod Benim vb.net portu basitçe sayfanıza koymak uygulamak, aşağıdaki gibidir:

VB.NET KOD
system.web.httpcontext.current.Response.ContentType = "video/" & convertFormat.toString 
RangeDownload(convertedVideo, system.web.httpcontext.current) 

:

private sub RangeDownload(fullpath as string, context as HttpContext) 

    dim size as long 
    dim start as long 
    dim theend as long 
    dim length as long 
    dim fp as long =0 
    using reader as new StreamReader(fullpath) 
     size = reader.BaseStream.Length 
     start = 0 
     theend = size - 1 
     length = size 
     '/ Now that we've gotten so far without errors we send the accept range header 
     '* At the moment we only support single ranges. 
     '* Multiple ranges requires some more work to ensure it works correctly 
     '* and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2 
     '* 
     '* Multirange support annouces itself with: 
     '* header('Accept-Ranges: bytes'); 
     '* 
     '* Multirange content must be sent with multipart/byteranges mediatype, 
     '* (mediatype = mimetype) 
     '* as well as a boundry header to indicate the various chunks of data. 
     '*/ 
     context.Response.AddHeader("Accept-Ranges", "0-" + size) 
     '// header('Accept-Ranges: bytes') 
     '// multipart/byteranges 
     '// http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2 

     if (not String.IsNullOrEmpty(context.Request.ServerVariables("HTTP_RANGE"))) then 
      dim anotherStart as long = start 
      dim anotherEnd as long = theend 
      dim arr_split as string() = context.Request.ServerVariables("HTTP_RANGE").Split("=") 'new char[] { Convert.ToChar("=") }) 
      dim range as string = arr_split(1) 

      '// Make sure the client hasn't sent us a multibyte range 
      if (range.IndexOf(",") > -1) then 
       '// (?) Shoud this be issued here, or should the first 
       '// range be used? Or should the header be ignored and 
       '// we output the whole content? 
       context.Response.AddHeader("Content-Range", "bytes " & start & "-" & theend & "/" & size) 
       throw new HttpException(416, "Requested Range Not Satisfiable") 
      end if 

      '// If the range starts with an '-' we start from the beginning 
      '// If not, we forward the file pointer 
      '// And make sure to get the end byte if spesified 
      if (range.StartsWith("-")) then 
       '// The n-number of the last bytes is requested 
       anotherStart = size - Convert.ToInt64(range.Substring(1)) 
      else 
       arr_split = range.Split("-") 
       anotherStart = Convert.ToInt64(arr_split(0)) 
       dim temp as long = 0 
       if (arr_split.Length > 1 andalso Int64.TryParse(arr_split(1).ToString(), temp)) then 
        anotherEnd = Convert.ToInt64(arr_split(1)) 
       else 
        anotherEnd = size 
       end if 
      end if 
      '/* Check the range and make sure it's treated according to the specs. 
      ' * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 
      ' */ 
      '// End bytes can not be larger than $end. 
      if (anotherEnd > theend) then 
       anotherEnd = theend 
      else 
       anotherEnd = anotherEnd 
      end if 
      '// Validate the requested range and return an error if it's not correct. 
      if (anotherStart > anotherEnd or anotherStart > size - 1 or anotherEnd >= size) then 
       context.Response.AddHeader("Content-Range", "bytes " + start + "-" + theend + "/" + size) 
       throw new HttpException(416, "Requested Range Not Satisfiable") 
      end if 

      start = anotherStart 
      theend = anotherEnd 

      length = theend - start + 1 '// Calculate new content length 
      fp = reader.BaseStream.Seek(start, SeekOrigin.Begin) 
      context.Response.StatusCode = 206 
     end if 
    end using 

    '// Notify the client the byte range we'll be outputting 
    context.Response.AddHeader("Content-Range", "bytes " & start & "-" & theend & "/" & size) 
    context.Response.AddHeader("Content-Length", length.ToString()) 
    '// Start buffered download 
    context.Response.WriteFile(fullpath, fp, length) 
    context.Response.End() 
end sub 
+0

ilişkin bir kararı yok. Belki de Chris Coulson bu mu? http://blogs.visigo.com/chriscoulson/easy-handling-of-http-range-requests-in-asp-net/ – Jairo

+0

Whoops! Teşekkürler, gerçekten biriydi - Yanıtı güncelleyeceğiz :) – JLo

İlgili konular