Проблемы с воспроизведением видеорекламы в начале ролика в Roku

Я пытаюсь добавить видеорекламу VAST в начале ролика в SThree образец проекта Roku SDK (версия «Простая сетка со страницей видео и сведений (.zip)»).

Я могу заставить его работать при запуске приложения, поместив следующий код в main.brs:

library "Roku_Ads.brs"
...
Sub RunUserInterface()
    ...
    raf = Roku_Ads() 
    raf.setAdPrefs(false)       'disable back-filled ads
    raf.setDebugOutput(true)
    raf.setAdUrl("http://pubads.g.doubleclick.net/gampad/ads?slotname=/82114269/Video/fallbacktest&sz=1920x1080&url=[http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID]http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID") 
    adPods = raf.getAds()
    shouldPlayContent = raf.showAds(adPods)

Однако я не хочу воспроизводить рекламу при запуске, я хочу воспроизвести рекламу перед воспроизведением видео. Итак, я полагаю, что могу просто добавить строки выше в components/screens/DetailsScreen/DetailsScreen.brs:

' on Button press handler
Sub onItemSelected()
    ' first button is Play
    if m.top.itemSelected = 0
        'START ADDING FOR PRE-ROLL
        raf = Roku_Ads() 
        raf.setAdPrefs(false)       'disable back-filled ads
        raf.setDebugOutput(true)
        raf.setAdUrl("http://pubads.g.doubleclick.net/gampad/ads?slotname=/82114269/Video/fallbacktest&sz=1920x1080&url=[http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID]http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID") 
        adPods = raf.getAds()
        shouldPlayContent = raf.showAds(adPods)
        'END ADDING FOR PRE-ROLL

        if shouldPlayContent
            m.videoPlayer.visible = true
            m.videoPlayer.setFocus(true)
            m.videoPlayer.control = "play"
            m.videoPlayer.observeField("state", "OnVideoPlayerStateChange")
        end if
    end if
End Sub

Когда я запускаю это, я получаю сообщение об ошибке:

Roku_Ads Framework version 1.8
BRIGHTSCRIPT: ERROR: roAppInfo: class PLUGIN|MARKUP on thread RENDER: roku_ads_lib:/Roku_Ads.brs(527)
'Dot' Operator attempted with invalid BrightScript Component or interface reference. (runtime error &hec) in roku_ads_lib:/Roku_Ads.brs(528)
528: ??
Backtrace:
#4  Function roku_ads_util_getappid(key_ As String) As String
   file/line: roku_ads_lib:/Roku_Ads.brs(528)
#3  Function roku_ads_checkallowedfeature(keytype_ As String, util_ As Object) As Boolean
   file/line: roku_ads_lib:/Roku_Ads.brs(1287)
#2  Function roku_ads_constructor() As Object
   file/line: roku_ads_lib:/Roku_Ads.brs(264)
#1  Function roku_ads() As Object
   file/line: roku_ads_lib:/Roku_Ads.brs(32)
#0  Function onitemselected() As Void
   file/line: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(75)

Что я здесь делаю не так? Разве вы не можете воспроизвести рекламу, когда метод вызывается из onChange="onItemSelected" в component.xml?

Обновление: ответ ниже Юджина верен. Вот как я решил проблему:

Прочтите о потоках графа сцены, события и обработка событий приложения. Как только это будет сделано, прочтите этот пост о передаче данных. между потоком рендеринга и основным потоком. Вам нужно будет понять объем данных графа сцены.

По сути, вы наблюдаете поле itemSelected в components/screens/DetailsScreen/DetailsScreen.xml:

m.DetailsScreen = scene.findNode("DetailsScreen")
m.DetailsScreen.observeField("itemSelected", m.port)

Затем в цикле событий основного потока вы обрабатываете roSGNodeEvent:

while true
    msg = wait(0, m.port)        
    msgType = type(msg)

    ? ">>>Main Thread Msg: ";msgType

    if msgType = "roSGScreenEvent"
        if msg.isScreenClosed() then return
    else if msgType = "roSGNodeEvent"
        fieldName = msg.getField()
        fieldData = msg.getData()
        ? "> node: "; msg.getNode()
        ? "> field name: "; fieldName
        ? "> data: "; fieldData

        if (fieldName = "itemSelected" and fieldData = 0)   'User pressed play
            'wait for 0.5 second before proceeding to RAF
            sleep(500)
            PlayAd()
        endif
    end if
end while

PlayAd() устанавливает m.DetailsScreen.videoPlayerVisible = true ЕСЛИ рекламы не было или ее воспроизведение закончилось. Это вызывает вызов onVideoVisibleChange в components/screens/DetailsScreen/DetailsScreen.brs


person rynop    schedule 10.11.2016    source источник


Ответы (1)


Вы не можете использовать RAF в потоке рендеринга. Вы должны отправить событие в главный поток и показывать там рекламу. Вы можете найти образцы интеграции RAF в Scene Graph здесь. Дополнительную информацию о потоках в Scene Graph можно найти здесь.

person Eugene Smoliy    schedule 11.11.2016
comment
Спасибо @ eugene-smoliy, это имеет смысл, как и документация высокого уровня по темам, на которые вы ссылаетесь. Где я могу найти документацию о передаче сообщений? Глядя на FullRAFSceneGraphSample, похоже, что основной поток ожидает их в цикле событий. Я могу попытаться выяснить это методом проб и ошибок, но предпочитаю читать документы по теме, которые мне трудно найти ... - person rynop; 11.11.2016
comment
Я нашел его, sdkdocs.roku.com/display/sdkdoc/Handling+Application+ События Я обновлю эту SO, указав, что нужно добавить в образец SThree, чтобы показывать рекламу, как только она заработает. - person rynop; 11.11.2016