【问题标题】:Opentok : How to kill streams / publishers properly?Opentok:如何正确杀死流/发布者?
【发布时间】:2014-08-08 15:34:22
【问题描述】:

我在为我的移动应用程序使用 OpenTok 时遇到问题(我使用 Phonegap 并在 Android 上测试该应用程序)。

我已成功创建发布者流和订阅者流。

当我关闭会话并尝试重新打开它时,有几个问题:

  • 似乎之前的流仍在运行(我可以看到 2 个与订阅者会话关联的活动流),但屏幕上没有显示视频,只有音频处于活动状态;
  • 当我第二次关闭会话时,发布者流仍然显示在应用程序上。

如您所见,我尝试了不同的方法来完全关闭流:disconnect ()、unpublish ()、publisher.destroy (),但它没有按我的意愿工作。

这是我的 .js 脚本:

function connexionOpenTok() {   
var sessionSub;
var sessionPub;
var publisher;

    $('#visioStopBtn').click(function () {

        console.log('Arret de la Visio...');
        $('#Collaboratif_mobilecontainer').show();
        $('#visioContainer').hide();
        if(sessionPub) {

        if (publisher) {
                sessionPub.unpublish(publisher);
            }
            sessionPub.publisher.destroy();
            sessionPub.disconnect();    
            sessionPub.forceDisconnect();
            sessionPub.forceUnpublish();
        }   
        if(sessionSub) {    
            sessionSub.disconnect();
            sessionSub.forceDisconnect();           
        }       
    });


    var subDiv = '<div id="visioSubscriber"></div>'
    var subPub = '<div id="visioPublisher"></div>'

    $('#visioContainer').append(subDiv).append(subPub); 

    var apiKey = "KEY"; 

    var sessionId = "ID";
    var subToken = 'TOKEN';
    var pubToken = 'TOKEN';

    // Initialize session, set up event listeners, and connect
    var width = $(window).width();
    var height = $(window).height();




    //publisher 
    setTimeout(function (){

        sessionPub = OT.initSession(apiKey, sessionId);

        sessionPub.connect(pubToken, function(error) {
            publisher = OT.initPublisher("visioPublisher", {width: width/5, height: height/5, zIndex: 3} );
            sessionPub.publish(publisher);
        }); 
    }, 1000);   

    //subscriber
    setTimeout(function (){
        sessionSub = OT.initSession(apiKey, sessionId);

        sessionSub.once("streamCreated", function(event) {

            sessionSub.subscribe(event.stream,"visioSubscriber", {width: width, height: height*0.8, zIndex: 2} );   
        });

        sessionSub.connect(subToken, function () {
        });
    }, 5000);   
}

这是我的 CSS:

#visioSubscriber {
    position:absolute;
    z-index:2;
    bottom: 65px;
    left: 0px;
    }

#visioStopBtn {
    position:absolute;
    z-index:10;
    width: 85%;
    margin: 5px 3% 5px 3%;
    bottom : 8px;
}


#visioPublisher {
    display:block;
    z-index:  3;
    position: absolute;
    bottom: 65px;
    left: 3%;
}   

#visioContainer {
    background-color: black;
    width : 100%;
    height: 100%;
    z-index:  1;
    position: absolute;
    bottom:0px;
}

这是关于 Opentok 的 html 部分:

<div id="visioContainer">           
        <a data-role="button" class="button"
    id="visioStopBtn" data-corners="true" data-icon="none" data-iconpos='nowhere' data-mini="false" data-theme="b">
    ARRETER LA VISIO
    </a>
</div>

【问题讨论】:

  • 我有一个类似的问题,问题是我在重新连接时,创建了更多的事件监听器(基本上使用相同的处理程序,只是运行了多次)

标签: javascript cordova opentok


【解决方案1】:

在JS库(TokBox官方维护)上,调用session.disconnect()后会自动清理所有发布者和订阅者。 Cordova(又名 PhoneGap)是一个社区维护的项目(不是由 TokBox 官方维护的),悬空的发布者/订阅者似乎是 cordova 插件中的一个错误。

几天前有一个拉取请求,您可以尝试更新cordova插件,看看问题是否消失了吗? https://github.com/songz/cordova-plugin-opentok/pull/79

如果没有,您应该在项目页面上提出问题:https://github.com/songz/cordova-plugin-opentok/issues

【讨论】:

  • 感谢您的回答。更新没有解决我的问题。最后我们决定创建 2 个插件,并为 Opentok 使用 android 和 ios 原生库,这在移动设备上更加稳定。
猜你喜欢
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2013-02-05
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多