Streaming von MP4-Videos über .NET HTML5
Ich versuche eine Testseite zu erstellen, die ein HTML5 VIDEO-Tag enthält, mit dem konvertierte Videos abgespielt werden können. Ich kann die Videos erfolgreich konvertieren und lokal auf dem Server speichern, möchte jedoch alle Videos über eine andere ASPX-Seite streamen können.
Angenommen, ich habe eine player.aspx-Seite, die den HTML-Code enthält, und eine getvideo.aspx-Seite, die nichts anderes tut, als die Videobinärdatei bereitzustellen, dachte ich, dass der folgende Code in meiner player.aspx-Seite gut funktionieren würde:
<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>
Die Seite getvideo.aspx enthält den folgenden vb.net-Code:
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 )
Alles, was ich auf meiner Seite bekomme, ist ein HTML-Videoplayer (der grundlegende Player von Chrome), der eine Zeitüberschreitung aufweist und der PLAY-Button wird grau. Das Tool "Netzwerk" in den Chrome Developer-Tools zeigt, dass 45 MB heruntergeladen werden und ein 200-Antwortcode abgerufen wird. Dies deutet darauf hin, dass es gut funktioniert. Obwohl ich eine zweite GET-Anfrage mit dem Status "Abgebrochen" erhalte?
Wenn ich www.mywebsite.com/output/videos/myvideo.mp4 besuche, wird dies im Browser einwandfrei wiedergegeben, sodass ich weiß, dass IIS für das korrekte Streamen von Videos konfiguriert ist.
Wenn ich die Disposition des Antwortinhalts in "Anhang" ändere, erzwingt der Browser beim Aufrufen meiner ASPX-Seite einen korrekten Download des Videos, der jedoch auch auf dem HTML-Player nicht korrekt wiedergegeben wird. Geht mit dem HTML5-VIDEO-Tag etwas „Kluges“ vor, das verhindert, dass eine ASPX-Datei Videos über .NET bereitstellt? Oder fehlt mir ein Antwortheader?
Vielen Dank!