1

所以我已经让 HLS 与我的 roku 盒子一起工作,并且已经弄清楚如何使用 XML 文件编写和编码它。但是我正在尝试编写一个 if 语句来检测 HLS 流何时离线,使用 isStreamStarted() 或 isRequestFailed() 之类的东西,例如:

if isRequestFailed() = -5
print "The stream is currently offline"
end if

这行得通吗?如果是这样,您会推荐将其放置在哪里和哪个源文件?我们正在为我们的频道使用视频播放器模板。

当我连接到调试控制台时 - 我单击其中一个离线 HLS 流,它会给我输出

"ButtonPressed
showHomeScreen | msg = ConnectionContext failure | index = 0
Video status: 0 0
showHomeScreen | msg = Unspecified or invalid track path/url. | index = 0
Video status: 0 0
showHomeScreen | msg = | index = -5
Video request failure: -5 1
showHomeScreen | msg = | index = 0
Screen closed"

如果您需要查看代码,我也可以发布,但我确实没有对原始视频播放器模板进行太多更改。

4

1 回答 1

1

我通过首先对 HLS 清单 url 执行单独的roUrlTransfer请求来解决类似的问题,以检查清单是否可用,然后再对视频播放器执行任何操作。

根据我的经验,您通过roUrlEvent回调获得的信息比您从roVideoPlayerEvent获得的信息更加清晰和完整。

这种方法的缺点是,如果没有问题,您只是对您的视频平台做了一个额外的清单请求,当您之后启动它以进行实际视频播放时,视频播放器将重复该请求。这略微增加了视频平台的负载。

另一个缺点是这种方法不会测试或检测清单中视频块的可用性的任何问题。这仍然取决于视频播放器。

示例代码:

Sub playVideo()

    'Request the manifest.
    resultObject = performUrlTransfer("http://urlofyourvideostream.com/hls.m3u8")

    if (resultObject.responseCode = 200)
        'TODO: Play the video in roVideoScreen.
    else
        'TODO: Show an error message.
    end if

End Sub


Function performUrlTransfer(urlString as String) as Object

    urlTransfer = CreateObject("roUrlTransfer")
    urlTransfer.SetMessagePort(CreateObject("roMessagePort"))
    urlTransfer.SetUrl(urlString)                                   'Set the url.
    urlTransfer.EnableEncodings(true)                               'Enable gzip compression.
    urlTransfer.RetainBodyOnError(true)                             'Also return the response body in case of errors.
    urlTransfer.SetCertificatesFile("common:/certs/ca-bundle.crt")  'Enable https.
    urlTransfer.InitClientCertificates()                            'Enable https.

    'Perform a HTTP GET.
    urlTransfer.AsyncGetToString()

    'Prepare the object that is to be returned.
    resultObject = CreateObject("roAssociativeArray")

    while true
        message = wait(0, urlTransfer.GetMessagePort())

        if (type(message) = "roUrlEvent")

            resultObject.responseCode = message.GetResponseCode()
            resultObject.failureReason = message.GetFailureReason()
            resultObject.bodyString = message.GetString()

            exit while
        end if
    end while

    return resultObject

End Function
于 2015-08-24T14:17:37.300 回答