видео на iOS не работает
У меня есть веб-страница .NET с включенным видеоплеером html5. Источником видео является класс, возвращающий запрос частичного диапазона. Он работает в настольных браузерах и android, но не работает на устройствах iOS.
Что я уже пробовал:
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 System.IO.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, System.IO.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