3

我将各种内容放在 index.html 的div标记中。其中之一是视频。从菜单中选择视频时,我放置播放器和音频对象并初始化它们:

var html_data = '<object id="pluginPlayer" border=0 classid="clsid:SAMSUNG-INFOLINK-PLAYER"></object>';
html_data += '<object id="pluginAudio" border=0 classid="clsid:SAMSUNG-INFOLINK-AUDIO"></object>';
widgetAPI.putInnerHTML($('#main-content')[0], html_data);

我用它们初始化它们

Player.init();
Audio.init();
Player.setVideoURL(url);
Player.playVideo();

视频开始播放,当我尝试使用+-音量键控制音量时,我得到以下跟踪:

Error Detail: Uncaught TypeError: Object #<HTMLObjectElement> has no method 'SetVolumeWithKey'

另一方面,播放器(以相同方式初始化和使用)的方法没有问题。

这是代码:

索引.html

<script type="text/javascript" language="javascript" src="$MANAGER_WIDGET/Common/API/Widget.js"></script>
<script type="text/javascript" language="javascript" src="$MANAGER_WIDGET/Common/API/TVKeyValue.js"></script>
<script type="text/javascript" language="javascript" src="$MANAGER_WIDGET/Common/API/Plugin.js"></script>
<script type="text/javascript" language="javascript" src='$MANAGER_WIDGET/Common/jquery.js'></script>
...
<script language="javascript" type="text/javascript" src="app/javascript/Main.js"></script>
<script language="javascript" type="text/javascript" src="app/javascript/Player.js"></script>
<script language="javascript" type="text/javascript" src="app/javascript/Audio.js"></script>

主.js

Main.keyDown = function()
{
    var keyCode = event.keyCode;
    switch(keyCode){
    ...
        case tvKey.KEY_VOL_DOWN:
        case tvKey.KEY_PANEL_VOL_DOWN:
            alert("VOL_DOWN");
            Audio.setRelativeVolume(1);
        break; 
    }
    ...
}

音频.js

var Audio =
{
    plugin : null
}

Audio.init = function(){
    var success = true;
    this.plugin = document.getElementById("pluginAudio");
    if (!this.plugin)
    {
        success = false;
    }
    return success;
}

Audio.setRelativeVolume = function(delta){
    //error reports here 
    this.plugin.SetVolumeWithKey(delta);
}

Audio.getVolume = function(){
    alert("Volume : " +  this.plugin.GetVolume());
    return this.plugin.GetVolume();
}

我尝试在 .js 调用之前和之后将 pluginAudio 对象添加到 html 的头部,尝试注册/取消注册键

Main.onLoad = function(){

    window.onshow = function () {
        //pluginAPI.registKey(tvKey.KEY_VOL_UP);
        //pluginAPI.registKey(tvKey.KEY_VOL_DOWN);
        //pluginAPI.registKey(tvKey.KEY_PANEL_VOL_UP);
        //pluginAPI.registKey(tvKey.KEY_PANEL_VOL_DOWN);
        //pluginAPI.unregistKey(tvKey.KEY_VOL_UP);
        //pluginAPI.unregistKey(tvKey.KEY_VOL_DOWN);
    }
}

甚至从开发论坛尝试了三星测试应用程序,在尝试音量键时我得到了同样的错误。

请问有什么问题吗?我需要使用音量增大和减小键(键值 7 和 11 - 如果没有记错的话)来控制自定义视频(不是电视节目)音量。

4

1 回答 1

4

事实证明,解决方案非常简单。我会回答问题,以防其他人遇到像我一样的问题。

首先,我需要index.html头部中的其他对象(并在那里移动音频):

<object id="pluginAudio" border=0 classid="clsid:SAMSUNG-INFOLINK-AUDIO"></object>
<object id="pluginObjectTVMW" border="0" classid="clsid:SAMSUNG-INFOLINK-TVMW"></object>
<object id="pluginObjectNNavi" border=0 classid="clsid:SAMSUNG-INFOLINK-NNAVI"></object>

pluginObjectTVMW 可以声明在:

var Main =
{
    pluginAPI: null
};

主要区别是我在尝试window.onshow,但它必须是window.onLoad,所以应该是这样的(模块有时间加载):

Main.onLoad = function(){

    window.onLoad = function () {
        Main.pluginAPI = document.getElementById("pluginObjectTVMW");
        Audio.init();
        NNaviPlugin = document.getElementById("pluginObjectNNavi");

        NNaviPlugin.SetBannerState(1);

        pluginAPI.unregistKey(tvKey.KEY_VOL_UP);
        pluginAPI.unregistKey(tvKey.KEY_VOL_DOWN);
        //unregister other keys as explained in NNavi module below
    }
}

Playing Embedded MP3 with TV Volume On-screen Display教程中的NNavi模块说明:

NNavi 模块控制 DTV 平台中的三星智能电视特定功能(例如 DUID 和 ServerType )。NNavi 模块的 SetBannerState(nState) 函数显示电视音量。nState 设置为“1”以显示音量 OSD。为了在屏幕上显示音量 OSD,使用 Common.API.Plugin 的 unregist() 函数取消注册音量键、静音、退出、菜单和 Internet@TV 键。

音频的变化是:

Audio.setRelativeVolume = function(delta){
    this.plugin.SetVolumeWithKey(delta);
    //apply volume to player
    Player.plugin.audioVol(this.plugin.GetVolume);
}

最后一点是我已经将音频插件移动到head标签,而不是像播放器那样“按需”插入它,就像我在开始时所说的那样。

基本上就是这样。不等待完全加载东西的初学者错误,但我被 Player ( pluginPlayer) 立即准备好欺骗了。

问候

于 2013-06-25T08:06:25.550 回答