在 Roku 中播放视频前置广告时遇到问题
Trouble playing vid pre-roll ad in Roku
我正在尝试将 VAST 视频前置广告添加到 SThree sample Roku SDK project("Simple Grid with Video and Details page (.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)
我在这里做错了什么? component.xml中的onChange="onItemSelected"
调用方法时能不播放广告吗?
更新:尤金的是正确的,我是这样解决问题的:
了解 scene graph threads, events and handling application events. Once that is done read this post on passing data between the Render thread and main thread. You will need to understand scene graph data scoping。
基本上你观察 components/screens/DetailsScreen/DetailsScreen.xml
中的 itemSelected
字段:
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
中被调用
我正在尝试将 VAST 视频前置广告添加到 SThree sample Roku SDK project("Simple Grid with Video and Details page (.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)
我在这里做错了什么? component.xml中的onChange="onItemSelected"
调用方法时能不播放广告吗?
更新:尤金的
了解 scene graph threads, events and handling application events. Once that is done read this post on passing data between the Render thread and main thread. You will need to understand scene graph data scoping。
基本上你观察 components/screens/DetailsScreen/DetailsScreen.xml
中的 itemSelected
字段:
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