【问题标题】:WebRTC changing/moving video element without stopping streamWebRTC 在不停止流的情况下更改/移动视频元素
【发布时间】:2017-02-11 20:25:36
【问题描述】:

当我在 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 的那个角落确实会实时运行,与继续以 3-5 FPS 运行的其余元素不同。这让我相信这里的问题是硬件加速。我可以以某种方式为 videoTag 启用它吗?

方法 2

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

【问题讨论】:

  • 在 chrome, chromium 你应该可以在Settings启用硬件加速
  • 它已经启用,这个问题是特定于这个元素,而不是其他视频标签。
  • 你做错了什么。一个流,无论是远程的还是其他的,都完全独立于可能正在播放它的任何视频元素,或者是否有任何视频元素正在播放它。这与 WebRTC 无关。看到这个example
  • srcObjectDOM 属性,而不是 jQuery 属性,请使用 videoTag[0].srcObject。仍然不确定是什么问题?
  • @guest271314 谢谢,这是一个错字,我知道它与 jQuery 无关。我在输入上面的示例时忘记了[0],在我的原始代码中它就在那里。

标签: javascript webrtc simplewebrtc


【解决方案1】:

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

【讨论】:

  • 谢谢,我已经使用在线教程解释了您提到的方法(也检查了您的方法)。现在我唯一的问题是将 webRTC 中的 MediaStream 转换为 MediaSource.appendBuffer() 可以使用的缓冲区,我没有看到办法,也查看了 MediaStream 中的视频 MediaStreamTrack,它似乎也没有暴露缓冲区。我假设缓冲区(基于规范的 ArrayBuffer)是流的底层像素数组?
  • 您能否将您在 Question 中尝试过的javascript 包含在内?
  • 好的,刚刚想出了另一种方法,但它像糖蜜一样慢,所以如果缓冲方法更高效,我想了解它。我目前的方法不使用 .appendBuffer() 或 .addSourceBuffer()。我改为这样做:video.srcObject = webrtc.localStreams[0];
  • “慢”是什么意思?
  • 大约 3-5 FPS,而原始 WebRTC 视频元素似乎是实时的。此外,用我迄今为止尝试过的部分方法更新问题(如前所述,我无法使用您的方法找到有效的解决方案,因此它不会成为有效的代码)。
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2017-11-14
  • 2011-05-05
相关资源
最近更新 更多