局部变量到全局javascript

时间:2015-04-13 11:07:47

标签: javascript callback stream webrtc kurento

我遇到了JavaScript,webRTC和Kurento的问题。我自己无法解决这个问题。我试图将来自本地变量的远程流放在全局变量中,但是我遇到了一些麻烦。我尝试解释所有解决问题的步骤: 第一步,我有Kurento webRtcEndpoint函数:

webRtcPeer = kurentoUtils.WebRtcPeer.startRecvOnly(videoElement, onPlayOffer, onError);

它调用函数" onPlayOffer"那就是:

function onPlayOffer(sdpOffer) {
co(function * () {
    try {
        if (!client) client = yield kurentoClient(args.ws_uri);

        pipeline = yield client.create('MediaPipeline');
        var webRtc = yield pipeline.create('WebRtcEndpoint');
        var player = yield pipeline.create('PlayerEndpoint', { uri: args.file_uri });

        yield player.connect(webRtc);
        var sdpAnswer = yield webRtc.processOffer(sdpOffer);
        webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);

        console.log('DEBUG: ok, AGAIN, localStream: ');
        console.log(localStream);

        yield player.play();

我已经编辑了函数processSdpAnswer以这种方式获取流:

WebRtcPeer.prototype.processSdpAnswer = function(sdpAnswer, callbackEvent, successCallback) {
//WebRtcPeer.prototype.processSdpAnswer = function(sdpAnswer, successCallback) {
var answer = new RTCSessionDescription({
    type : 'answer',
    sdp : sdpAnswer,
});

console.log('Kurento-Utils: SDP answer received, setting remote description');
var self = this;
self.pc.onaddstream = function(event) {
    var objectURL = URL.createObjectURL(event.stream);
    //Added the string below to create the callback
    callbackEvent(event.stream);
};

self.pc.setRemoteDescription(answer, function() {
    if (self.remoteVideo) {
        var stream = self.pc.getRemoteStreams()[0];
        //console.log('Kurento-Utils: Second self.pc');
        //console.log(self.pc)
        self.remoteVideo.src = URL.createObjectURL(stream);
    }
    if (successCallback) {
        successCallback();
    }
}, this.onerror);

因此,在这种情况下,回调是函数recordVideo,它被传递" event.stream"

function recordVideo(stream) {
console.log("DEBUG: called function recordVideo()");
localStream = stream;
console.log("DEBUG: Copied stream -> localStream:");
console.log(localStream);
console.log("DEBUG: the stream object contains:");
console.log(stream);}

所以我希望在函数" onPlayOffer"我可能将对象localStream(全局声明)作为流的副本(即本地)。变量" stream"是正确的,变量" localStream"相反,它是未定义的。

你可以帮我理解为什么吗? 我已经读过,问题可能是控制台,但是我试图评论所有console.log行没有成功。你能帮助我吗?谢谢大家!

(如果有人知道在全球范围内采用event.stream对象的更快方式,我将感谢您的帮助!)

2 个答案:

答案 0 :(得分:2)

你是对的,你的问题是异步的,

最简单的纠正方法是,将任何必须遵循异步调用的代码/逻辑作为该异步调用的回调,

可以通过更改

来完成
    ...
    webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);

    console.log('DEBUG: ok, AGAIN, localStream: ');
    console.log(localStream);

    yield player.play();
    ...

进入

    ...
    var callback = function (){
        console.log('DEBUG: ok, AGAIN, localStream: ');
        console.log(localStream);

        yield player.play();
    };
    webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo.bind({callback: callback})); // through bind, we are setting the `this` value of the recordVideo.

并将recordVideo修改为

function recordVideo(stream) {
    ...
    this.callback();    // extra line added.
}

答案 1 :(得分:1)

你错过了收益率,这就是下面的代码:

webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);

在recordVideo之前执行

解决它只是改为

yield webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);