无法控制三星智能电视应用中的音量

时间:2013-06-20 14:56:58

标签: javascript samsung-smart-tv

我将各种内容放在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'

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

以下是代码:

的index.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>

Main.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; 
    }
    ...
}

Audio.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 - 如果不是错误的话)。

1 个答案:

答案 0 :(得分: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标签,而不是像播放器那样“按需”插入,就像我在开头所说的那样。

基本上就是这样。初学者因为没有等到完全加载东西而犯了错误,但我被玩家(pluginPlayer)立即准备好了。

此致