【问题标题】:Roku HLS Offline DetectionRoku HLS 离线检测
【发布时间】:2015-09-27 02:46:29
【问题描述】:

所以我已经让 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"

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

【问题讨论】:

    标签: video-streaming offline http-live-streaming roku brightscript


    【解决方案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
    

    【讨论】:

    • 你能提供我能做到这一点的代码吗?我找到了 roUrlTransfer,但我不太确定要编辑什么。
    • 我已更新答案以包含示例代码。代码没有详细介绍,但应该为您提供足够的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2018-03-04
    • 2019-07-15
    • 2017-05-13
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多