gpt4 book ai didi

javascript - WebRTC 在不停止流的情况下更改/移动视频元素

转载 作者:行者123 更新时间:2023-11-29 15:22:54 27 4
gpt4 key购买 nike

当我在 Chrome 中使用 WebRTC 时,我注意到这些流的持久性仍然有些不稳定。我需要在显示它的元素显示之前创建一个视频流(从技术上讲,我最初只需要音轨,但没有 replaceTrack() 的重新协商本身就是一个问题,所以我现在同时启用两者).

元素随后由 JavaScript 动态呈现,需要开始接收 WebRTC 视频。问题是,在 WebRTC 创建时,我想要显示的视频元素尚不存在。我没有看到告诉 WebRTC 在流开始后更改正在呈现的视频元素的方法,这可能吗?我主要玩的是 SimpleWebRTC,但我对直接使用 WebRTC 持开放态度——通过查看文档,我也找不到使用原始 WebRTC 的方法。我还尝试将原始视频元素移动到新元素中,但这会导致视频流中断/停止:

newElement.appendChild(originalWebRTCVideoTag);

除了终止整个流并重新启动,我还有什么选择?

更新:

对于这两种方法,videoTag 是一个通用的 DOM 视频标签,webrtc 是 WebRTC 对象的一个​​实例,它具有通过 SimpleWebRTC(simpleWebRtc.webrtc,SimpleWebRTC 环绕)建立的工作连接。我现在正在为那些想要查看实际代码的人整理一个 JSFiddle,但这应该足以重现它。

// this doesn't seem to be working in stackoverflow, probably because it rejects video camera capture

var simplertc = new SimpleWebRTC({
localVideoEl: 'webrtc-local',
remoteVideosEl: 'webrtc-remote',
media: {"audio": true, "video": {
"optional": [{"minWidth": "640"}, {"minHeight": "480"}], "mandatory": {}
}},
autoRequestMedia: true
});
var webrtc = simplertc.webrtc;

// this portion is overly simplified, in this case there is no point
// in creating this dynamically, in the app I'm working on this element
// is generated much later
$('#dynamic').appendTo('<video id="dynamic-video"></video>');
var videoTag = $('#dynamic-video')[0];

simplertc.on('readyToCall', function() {
simplertc.joinRoom('my-room-875385864'); // random name

// by this time the local video should be ready, we don't need remote ones for our test
// test case 1 (replace with logic from test case 2 if needed)
videoTag.srcObject = webrtc.localStreams[0];
// end test case
});
video {
border: 1px solid red;
width: 200px;
}

/* overlap with original video is intentional to show hardware acceleration effect */
#dynamic {
position: absolute;
border: 1px solid black;
width: 200px;
height: 200px;
left: 100px;
top:50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://simplewebrtc.com/latest-v2.js"></script>
<div id='webrtc'>
<video id='webrtc-local'></video>
<div id='webrtc-remote'></div>
</div>
<div id='dynamic'>
</div>

方法 1,在尝试方法 2 时偶然发现了这个

尝试了以下方法,它有效但比我想要的慢得多,大约 5 FPS:

// note that I can just as easily use remote streams here
videoTag.srcObject = webrtc.localStreams[0]

具有讽刺意味的是,虽然我更多地搞砸了这种方法,但我不小心重叠了 webRTC 元素和生成的视频区域 (videoTag),即使 webRTC 在后台,videoTag 重叠的那个 Angular 落确实实时运行,与继续以 3-5 FPS 运行的元素的其余部分不同。这让我相信这里的问题是硬件加速。我能以某种方式为 videoTag 启用它吗?

方法二

var media = new MediaSource();
videoTag.src = URL.createObjectURL(media);
// guessing mimetype from a few WebRTC tutorials I stumbled upon
var srcBuf = media.addSourceBuffer(‘video/webm;codecs=”vp8, vorbis”’);

// need to convert webrtc.localStreams[0] or its video track to a buffer somehow???
srcBuf.appendBuffer(/* buffer */);

进一步研究

这可能是 Chrome 中的一个错误,一个似乎有效的黑客式解决方法是确保新生成的视频元素与原始视频元素完全重叠(即使原始视频元素设置为在后面的背景上呈现所有其他元素(以及在非透明背景后面)。这似乎启动了硬件加速。

最佳答案

您可以使用 MediaSourcesourceopen 事件、.addSourceBuffer().appendBuffer()。参见 HTML5 audio streaming: precisely measure latency? , Unable to stream video over a websocket to Firefox

关于javascript - WebRTC 在不停止流的情况下更改/移动视频元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com