2015-07-22 4 views
1

Итак, я получил HLS для работы с моим ящиком roku и выяснил, как писать и кодировать его с помощью XML-файла. Но я пытаюсь написать, если заявление, чтобы определить, когда поток HLS отсутствует что-то вроде isStreamStarted() или, возможно, с isRequestFailed(), так что-то вроде:Roku HLS Offline Detection

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" 

Если вы хотите увидеть код, я могу отправить, что, как ну, но я действительно не внес много изменений из оригинального шаблона видеоплеер.

ответ

1

Я решил аналогичную проблему, выполнив отдельный запрос roUrlTransfer к URL-адресу манифеста HLS, чтобы проверить, доступен ли манифест, прежде чем что-либо делать с видеоплеером.

Информация, полученная вами через 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 
+0

Можете ли вы предоставить мне с кодом, что вы были в состоянии сделать это с? Я нашел roUrlTransfer, но я не совсем уверен, что редактировать. –

+0

Я обновил ответ, чтобы включить пример кода. Код не входит в полную информацию, но должен предоставить вам достаточно информации. –

Смежные вопросы