我正在尝试在移动设备和计算机之间开发一个webrtc视频呼叫系统。移动设备将他的视频流发送到计算机。
在移动设备中,用户界面只显示通过相机录制的视频,在android中,这一切都很好,但在iOS中(我用最新iOS版本的两款不同iPhone进行了测试(,视频没有开始,显示为黑色,认为它可以毫无问题地传输到计算机。
我尝试了我在网上找到的一切,在视频元素中添加控件,删除控件,在线添加自动播放。。。,请求getUserMedia卸载并根据用户手势再现流,但似乎什么都不起作用,我甚至没有在手机控制台上收到任何错误。我在不同的浏览器safari和chrome上进行了测试。更奇怪的是,有时它是从你在浏览器上打开的选项卡列表开始的,然后你回到页面
这是视频元素的代码
<video class='user-virtual-assessment-video' id='virtualAssessmentVideo' autoplay muted playsinline>
</video>
<button id='startVirtualAssessment' class='action-button'>
<svg ...>
</button>
当用户点击按钮时执行的代码
e.stopPropagation();
e.preventDefault();
const videoElement = document.getElementById('virtualAssessmentVideo')
videoElement.srcObject = stream;
videoElement.play()
startVirtualAssessment()
函数startVirtualAssessment基本上启动rtc连接,iPhone的用户媒体在页面加载时被请求并存储在流变量上
navigator.mediaDevices.getUserMedia({video: { facingMode: 'environment', aspectRatio: {exact: 16/9}, frameRate: { ideal: 10, max: 15 } }}).then((streamObject) => {
stream = streamObject;
})
也许有一些明显的东西我遗漏了或不理解,但我并没有真正看到代码的问题。
非常感谢:(
我们认为我们已经确定了这个问题的原因:在移动safari上(仅限(有一个限制,即对于同一媒体类型,不能多次请求getUserMedia
。
如果您在连接到其他人之前调用getUserMedia
一次,让用户看到他/她自己,然后让webRTC库(在我们的情况下,如mediasoup(再次调用getUserMedia
,则第一个请求将被静音(导致黑屏(,然后第二个请求将优先(让其他人看到用户(。
一种解决方法似乎是第一次检索媒体流时.clone()
,而不是第二次调用getUserMedia
。
另请参阅此webkit错误报告:https://bugs.webkit.org/show_bug.cgi?id=179363