历史:
我们通过http部分请求流传输.mp4视频。它在iPad / iPhone上工作正常,我们已经遵循了为iOS设备编码.mp4文件的所有推荐程序,因此问题不在于文件本身。视频文件存储在Web服务器的根目录之外,因此我们编写了代码以根据请求打开和流式传输视频。我们的测试使我们达到了比较我们的“流式”视频(工作但不在IOS中)和直接链接到文件的标题(在所有实例中工作但不是可能的解决方案,因为我们需要在Web之外存储文件)根)。以下是工作与非工作标题的比较。
直接链接到文件(为IOS工作):
请求1
状态代码200 OK
接受-范围:字节
内容长度:62086289
内容类型:视频/ MP4
日期:2015年7月26日星期日08:11:15 GMT
ETag的: “60be3570ae7ed01:0”
最后修改时间:2015年4月24日星期五16:48:06 GMT
服务器:Microsoft-IIS / 7.0
X-已启动通过:ASP.NET
请求2
状态代码:206部分内容
接受-范围:字节
内容长度:62086289
内容范围:字节0-62086288 / 62086289
内容类型:视频/ MP4
日期:2015年7月26日星期日08:11:16 GMT
ETag的: “60be3570ae7ed01:0”
最后修改时间:2015年4月24日星期五16:48:06 GMT
服务器:Microsoft-IIS / 7.0
X-已启动通过:ASP.NET
打开流媒体文件(不适用于IOS)
请求1
状态代码200 OK
接受-范围:字节
缓存控制:私人
内容长度:62086289
内容范围:字节0-62086289 / 62086289
内容类型:视频/ MP4
日期:2015年7月26日星期日16:55:22 GMT
服务器:Microsoft-IIS / 7.0
X-ASPNET-版本:4.0.30319
X-已启动通过:ASP.NET
请求2
状态代码200 OK
接受-范围:字节
缓存控制:私人
内容长度:62086289
内容范围:字节0-62086289 / 62086289
内容类型:视频/ MP4
日期:2015年7月26日星期日16:55:22 GMT
服务器:Microsoft-IIS / 7.0
X-ASPNET-版本:4.0.30319
X-已启动通过:ASP.NET
请注意,非工作版本的第二个请求保留在状态码200,并且不会更改为206.这是我们关注的可能是问题,但是处于亏损状态。下面是打开文件并发送到服务器的代码。请注意我们设置标题的方式。
Dim iStream As System.IO.Stream
' Buffer to read 10K bytes in chunk:
Dim buffer(10000) As Byte
' Length of the file:
Dim length As Integer=0
' Total bytes to read:
Dim dataToRead As Long=0
Dim isPartialFile As Boolean = False
Dim totalDelivered As Long = 0
Dim totalFileSize As Long = 0
Dim filename As String
filename = fileID & file.Extension
iStream = New System.IO.FileStream(filePath, System.IO.FileMode.Open,IO.FileAccess.Read, IO.FileShare.Read)
' Total bytes to read:
dataToRead = iStream.Length
totalFileSize = iStream.Length
Response.ContentType = "video/mp4"
Response.AddHeader("Accept-Ranges", "bytes")
Response.AddHeader("Content-Range", "bytes 0-" + totalFileSize.ToString + "/" + totalFileSize.ToString)
Response.AddHeader("Content-Length", totalFileSize.ToString)
' Read the bytes.
While dataToRead > 0
' Verify that the client is connected.
If Response.IsClientConnected Then
' Read the data in buffer
length = iStream.Read(buffer, 0, 10000)
' Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length)
' Flush the data to the HTML output.
Response.Flush()
ReDim buffer(10000) ' Clear the buffer
dataToRead = dataToRead - length
Else
isPartialFile = True
'record the data read in the database HERE (partial file)
'totalDelivered = totalFileSize - dataToRead
'prevent infinite loop if user disconnects
dataToRead = -1
End If
End While
iStream.Close()
Response.End()
我们如何修改上述代码以使其与IOS设备一起使用,假设问题与206响应头有关?