4

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);

したがって、この場合、コールバックは「event.stream」に渡される関数 recordVideo です。

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 オブジェクトをグローバルに取得するより高速な方法を誰かが知っている場合は、助けに感謝します!)

4

2 に答える 2

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.
}
于 2015-04-14T02:02:17.457 に答える
1

収量がありません。これにより、以下のコードが作成されます。

webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);

記録ビデオの前に実行する

それを解決するには、代わりに置くだけです

yield webRtcPeer.processSdpAnswer(sdpAnswer, recordVideo);
于 2015-04-14T08:23:15.933 に答える