Roku HLS离线检测

时间:2015-07-22 20:19:20

标签: video-streaming offline hls roku brightscript

所以我已经让HLS使用我的roku盒子了,并且已经找到了如何使用XML文件编写和编码它。但是我试着编写一个if语句来检测HLS流何时离线,例如isStreamStarted()或isRequestFailed(),如下所示:

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

这会有用吗?如果是这样,您建议放置哪个和哪个Source文件? 我们正在为我们的频道使用视频播放器模板。

当我连接到调试控制台时 - 我点击其中一个离线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"

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

1 个答案:

答案 0 :(得分:1)

我通过先对HLS清单网址发出单独的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