Streaming de vídeo MP4 através do .NET HTML5
Estou tentando criar uma página de teste que contenha uma tag HTML5 VIDEO, que permitirá a reprodução de vídeos convertidos. Consigo converter os vídeos e armazená-los localmente no servidor, mas gostaria de poder transmitir todos os vídeos por meio de outra página .aspx.
Supondo que eu tenha uma página player.aspx que conterá o código HTML e a página getvideo.aspx que não farão nada exceto fornecer o vídeo binário, eu pensei que o seguinte código funcionaria bem na minha página player.aspx:
<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>
A página getvideo.aspx contém o seguinte código vb.net:
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 )
Tudo o que eu obtenho na saída da minha página é um player de vídeo em HTML (player básico do chrome) que parece expirar e o botão PLAY fica cinza. A ferramenta Rede nas ferramentas do desenvolvedor do Google Chrome mostra que ele está fazendo o download de 45 MB e obtém um código de 200 respostas. Isso sugere para mim que está funcionando bem. Embora eu receba uma segunda solicitação GET com o status "Cancelado"?
Se eu visitar www.mywebsite.com/output/videos/myvideo.mp4, isso será reproduzido no navegador, então sei que o IIS está configurado para transmitir o vídeo corretamente.
Além disso, se eu alterar a disposição do conteúdo da resposta para "anexo", o navegador forçará corretamente o download do vídeo quando for para a minha página ASPX, mas isso também não é reproduzido corretamente no player HTML. Existe algo 'inteligente' acontecendo com a tag HTML5 VIDEO que está impedindo que um arquivo .aspx exiba o vídeo via .net? Ou estou faltando um cabeçalho de resposta?
Obrigado!