Angular と SIPjs を使用して WebRTC の実装を行っています。リモート メディアは正常に動作しますが、MediaStreamTrack オブジェクトが適切に格納されていると思われるのではなく、送信者のトラック プロパティが null を返すため、ローカル メディアを追加する際に問題が発生します。
SIPjs 0.13.6 を使用していますが、少なくとも Chrome、バージョン 73.0.3683.86 (公式ビルド) (64 ビット)、および Firefox 65.0.2 (64 ビット) の両方で問題が発生します。SIP サーバーは Docker 内のアスタリスクです。
var localStream = new MediaStream();
pc.getSenders().forEach(function(sender) {
localStream.addTrack(sender.track); //throws error because it says is null
});
これらのテストを次の結果で行いました。トラックはおそらくそこにありますが、アクセスしようとするとnullです...
console.log("peer connection array og sender objects:");
console.log(pc.getSenders());
結果、getSenders() メソッドによって返された配列の最初の要素内の 1 つの mediaStreamTrack のようです。
もっと評判が必要なので写真を投稿することはできません。
[RTCRtpSender]
0: RTCRtpSender
dtmf: RTCDTMFSender {ontonechange: null, canInsertDTMF: false, toneBuffer: ""}
track: MediaStreamTrack {kind: "audio", id: "26f1da43-56f3-48d8-882f-
03f9b4dad7d5", label: "Default - External Microphone (Conexant ISST
Audio)", enabled: true, muted: false, …}
__proto__: RTCRtpSender
length: 1
__proto__: Array(0)
次に、その配列の最初のオブジェクトにアクセスします。
console.log("first element of the array sender objects");
console.log(pc.getSenders()[0]);
結果、ご覧のとおり、ここから (私にとって) 奇妙なことが始まります。オブジェクトには null トラックがあるようですが、オブジェクトを表示すると、MediaStreamTrack オブジェクトが存在するように見えます...
RTCRtpSender {track: null, dtmf: RTCDTMFSender}
dtmf: RTCDTMFSender {ontonechange: null, canInsertDTMF: false,
toneBuffer: ""}
track: MediaStreamTrack {kind: "audio", id: "26f1da43-56f3-48d8-882f-
03f9b4dad7d5", label: "Default - External Microphone (Conexant ISST
Audio)", enabled: true, muted: false, …}
__proto__: RTCRtpSender
3 番目に行ったのは、トラックのプロパティ値にアクセスすることでした。
console.log("the track of the sender above is");
console.log(pc.getSenders()[0].track);
そしてそれはnullを示しています:
null
次に、 getSenders() の結果を反復処理して各送信者のトラックを取得し、投稿の最初のコードに示すように MediaStream オブジェクトに追加しようとすると、エラーがスローされます