首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebRTC改变/移动视频元素而不停止流

WebRTC改变/移动视频元素而不停止流
EN

Stack Overflow用户
提问于 2017-02-11 20:25:36
回答 1查看 3.5K关注 0票数 3

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

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

代码语言:javascript
复制
newElement.appendChild(originalWebRTCVideoTag);

除了杀死整个溪流并重新启动之外,我还有什么选择?

更新

对于这两种方法,videoTag都是一个通用的DOM视频标记,webrtc是WebRTC对象的一个实例,其工作连接是通过SimpleWebRTC (simpleWebRtc.webrtc,SimpleWebRTC包装)建立的。我现在正在为那些想要查看实际代码的人准备一个JSFiddle,但是这应该是足够的信息来再现这些代码。

代码语言:javascript
复制
// 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
});
代码语言:javascript
复制
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;
}
代码语言:javascript
复制
<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:

代码语言:javascript
复制
// note that I can just as easily use remote streams here
videoTag.srcObject = webrtc.localStreams[0]

具有讽刺意味的是,在更多地干扰这种方法的同时,我意外地重叠了webRTC元素的视频区域和生成的视频区域( videoTag ),尽管webRTC在后台,但它重叠的那个角落确实是实时运行的,与继续在3-5 FPS上运行的其他元素不同。这使我相信,这里的问题是硬件加速。我可以以某种方式为videoTag启用它吗?

方法2

代码语言:javascript
复制
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中的一个bug,一种黑客式的解决方法似乎是确保新生成的视频元素与原始视频元素完全重叠(即使原始视频元素设置为在所有其他元素后面的背景上呈现(以及在不透明的背景后面)。这似乎会导致硬件加速。

EN

回答 1

Stack Overflow用户

发布于 2017-02-11 20:36:57

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42180845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档