20

オーディオ/ビデオ ストリームから「スクリーン共有」ストリームに変更したい:

peerConnection.removeStream(streamA) // __o_j_sep... in Screenshots below
peerConnection.addStream(streamB)  // SSTREAM in Screenshots below
  • streamAカメラとマイクからのビデオ/オーディオ ストリームです。
  • streamB拡張機能から取得したスクリーンキャプチャです。
  • どちらも次のようなMediaStreamオブジェクトです。

ストリームA

ストリームB

※1 備考

しかし、上記のように削除するstreamAと、peerConnectionaddStream(streamB)も起こらないようです。

以下は期待どおりに機能します (両端のストリームが削除され、再度追加されます)。

peerConnection.removeStream(streamA) // __o_j_sep...
peerConnection.addStream(streamA) // __o_j_sep...

詳細

「逆」(スクリーンキャプチャからカメラによるオーディオ/ビデオへの切り替え)を行うこの例を見つけましたが、大きな違いを見つけることはできません。

peerConnection RTCPeerConnectionオブジェクトは、実際には、ここで入手できる SIPML ライブラリ ソース コードによって作成さ ます。そして、私は次のようにアクセスします:

var peerConnection = stack.o_stack.o_layer_dialog.ao_dialogs[1].o_msession_mgr.ao_sessions[0].o_pc

(はい、これは正しくないように見えますが、ピア接続にアクセスする公式の方法はありません。ここでの説明を参照してください) およびここ.

もともと、 の videoTracks を の videoTrack で (交換) 変更しようとしましstreamAstreamBここで質問を参照してくださいaddTrack は再ネゴシエーションをトリガーしないため、(ストリームを削除/追加して) ピア接続の再ネゴシエーションを試行するように提案されました。

私もここで助けを求めましたが、メンテナーはとても忙しいようで、まだ応答する機会がありませんでした.


※1備考:なぜ物件streamBを持っていないのですか?videoTracksストリームは HTML<video>要素で再生され、「動作」しているように見えます。これが私がそれを得る方法です:

navigator.webkitGetUserMedia({
  audio: false,
  video: {
    mandatory: {
      chromeMediaSource:  'desktop',
      chromeMediaSourceId: streamId,
      maxWidth: window.screen.width,
      maxHeight: window.screen.height
      //,   maxFrameRate: 3
    }
  }
  // success callback
}, function(localMediaStream) {
  SSTREAM = localMediaStream; //streamB

  // fail callback
}, function(error) {
  console.log(error);
});

それはまた持っているようですvideoTrack

streamB の videoTrack

私は走っています:

  • OS X 10.9.3
  • Chrome バージョン 35.0.1916.153
4

2 に答える 2

11

最初の質問に答えるために、アクティブなピア接続で MediaStream を変更すると、ピア接続オブジェクトがonnegotiationneededイベントを発生させます。そのイベントを処理し、SDP を再交換する必要があります。この背後にある主な理由は、両当事者間でどのようなストリームが送信されているかを両当事者が認識できるようにするためです。SDP が交換されると、mediaStream ID が含まれ、新しい ID を持つ新しいストリーム (他のすべてが等しいイベント) がある場合、再ネゴシエーションを行う必要があります。

2 番目の質問 ( についてSSTREAM) について。実際にはビデオ トラックが含まれていますが、 の videotrack 属性はありませんwebkitMediaStreams。ただし、ID を介してトラックを取得することはできます。

メディア タイプごとに多数のトラックが存在する可能性があるため、ビデオ トラックまたはオーディオ トラックには単一の属性はなく、そのようなものの配列があります。この.getVideoTracks()呼び出しは、現在の videoTracks の配列を返します。そのため、 index を示すことで特定のビデオ トラックを取得できます.getVideoTracks()[0]

于 2014-06-17T15:54:22.567 に答える
1

ボタンをクリックすると、アクティブなストリームが削除され、他のストリームが追加されます。

これが私のやり方であり、私にとっては完璧に機能します。

_this.rtc.localstream.stop();
_this.rtc.pc.removeStream(_this.rtc.localstream);

gotStream = function (localstream_aud){
var constraints_audio={
    audio:true
   }

_this.rtc.localstream_aud = localstream_aud;
_this.rtc.mediaConstraints= constraints_audio;   
_this.rtc.createOffer();
}
getUserMedia(constraints_audio, gotStream);

gotStream = function (localstream){
var constraints_screen={
        audio:false,
        video:{
            mandatory:{
                chromeMediaSource: 'screen'
            }
        }
    }
  _this.rtc.localstream = localstream;
  _this.rtc.mediaConstraints=constraints_video;


  _this.rtc.createStream();  
  _this.rtc.createOffer();
}
getUserMedia(constraints_video, gotStream);

Chrome では「画面」と一緒にオーディオを使用できないため、別のストリームを作成します。古いビデオ ストリームに戻すか、実際に必要な他のストリームに切り替えるには、逆の操作を行う必要があります。

お役に立てれば

于 2014-09-17T13:47:07.893 に答える