локальная переменная в глобальный javascript

У меня проблема с 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 (объявленный глобально) как копия потока (то есть локального). Переменная «поток» верна, вместо этого переменная «localStream» НЕ ОПРЕДЕЛЕНА.

Можете ли вы помочь мне понять, почему? Я читал, что, возможно, проблема будет в консоли, но я безуспешно пытался прокомментировать всю строку console.log. Вы можете помочь мне? Спасибо всем!

(если кто-нибудь знает более быстрый способ получить объект event.stream глобально, я буду благодарен за помощь!)


person MrDjToto    schedule 13.04.2015    source источник
comment
Обновление: это проблема асинхронной функции: функция recordVideo возвращает переменную localVideo, после чего печатается журнал консоли. Кто-нибудь знает, как дождаться полного выполнения функции?   -  person MrDjToto    schedule 13.04.2015


Ответы (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.

и измените запись Video на

function recordVideo(stream) {
    ...
    this.callback();    // extra line added.
}
person mido    schedule 14.04.2015

Вам не хватает выхода, и это делает код ниже:

webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);

выполнить перед записьюВидео

Чтобы решить эту проблему, просто поставьте вместо этого

yield webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);
person lulop    schedule 14.04.2015