joemtz88 Ответов: 0

видео на 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

0 Ответов