我有一个RTCPeerConnection
的实例,ontrack
已定义:
newConnection.ontrack = receivedStream // remote
SDP交换完成后,对等体添加其本地流:
connection.addStream(stream); // local
我看到每个流调用receivedStream
两次 - 检查e.track
向我显示第一次调用是audio
曲目,第二次是video
曲目。
奇怪的是,检查e.streams[0]
并在此处调用getTracks
会给我两个MediaStreamTracks
- 一个用于音频,另一个用于视频:
所以尽管只调用了MediaStreamTracks
一次,但我在receivedStream
的两次调用中净四 addStream
。
receivedStream
在这里:
function receivedStream(e) {
var stream = e.streams[0]; // this gets invoked twice when adding one stream!
if (!stream) {
throw new Error("no stream found");
};
// this gets me the corresponding connection
waitForStream(stream.id).then(function (connection) {
// get element
targetVideoElement[0].srcObject = stream; // this now gets called twice per stream - once for audio, once for video
}).catch(function (error) {
// log
});
}
答案 0 :(得分:1)
您可以为每个MediaStreamTrack
执行相同的过程,即将MediaStreamTrack
添加到MediaStream
个实例,然后设置.srcObject
的{{1}}
HTMLMediaElement
答案 1 :(得分:1)
可能您在远程对等点中添加了不止一首曲目,如下所示:
localStream.getTracks().forEach(track => peer.addTrack(track, localStream));
远程 Peer 中对 peer.addTrack( ) 的每次调用都会在本地 peer.ontrack = () 中产生和事件
答案 2 :(得分:1)
track
事件为每个 MediaStreamTrack 触发一次。因此,如果 MediaStream 中有两个不同的轨道,例如音频和视频,则 ontrack 事件将触发两次。两个事件的事件的 stream
属性将相同,您可以将流附加到同一个音频或视频元素两次而不会产生任何后果。