如何在 Safari 和 iOS 11 上播放 WebRTC 媒体流
Posted
技术标签:
【中文标题】如何在 Safari 和 iOS 11 上播放 WebRTC 媒体流【英文标题】:How to play WebRTC media stream on Safari and iOS 11 【发布时间】:2017-10-31 22:50:18 【问题描述】:Apple 声称从 ios 11 和新的桌面 Safari 开始支持 WebRTC。但是,媒体播放的锁定次数让我怀疑是否真的支持“WebRTC”。
我的应用程序以前可以在这些设备上运行。现在没有了。
代码,在别处工作:
GlobalRTCObject.onaddstream = function(event)
Player.srcObject = event.stream;
Player.play();
;
来自苹果的错误信息:
Unhandled Promise Rejection: NotAllowedError: 在当前上下文中,用户代理或平台不允许请求,可能是因为用户拒绝了权限。
Apple 认可的接收流媒体的方式是什么?用户已经点击了各种按钮来达到这一点。 Apple 不断破坏这些应用程序以保护人们免受自己的侵害,这真的很荒谬——有一个后退按钮和一个红色 X 来留下不需要的播放声音的页面。
另外,假设有一个修复,是否有一个属性存储在浏览器中,用于“锁定所有东西以使东西不起作用”的“功能”支持?我不希望我的所有用户都必须点击 100 个按钮才能让事情正常工作,但我宁愿做一个比用户代理更准确的功能检测。
一个理想的解决方案适用于将来可能在没有用户输入的情况下添加的媒体流。有些事件没有及时发生。想想天气警报或电视直播活动之类的事情。当这些东西最终存在时,用户应该能够留在播放这些东西的页面上。
【问题讨论】:
为了清楚起见,我应该添加Player
是一个 html5 音频标签。
很高兴再次“见到”你 ;-) WebRTC 是真正得到 Apple 的支持。你用latest adapter吗?为了测试,我使用了来自 Google 的codelab,除了一些例外情况外,它工作正常。有关这些例外情况,请参阅 my post。至少 safari-safari 在所有情况下都对我有用。希望我能帮助你了解这些信息!
【参考方案1】:
这是我目前所拥有的,但我不会将其标记为正确,因为它涉及太多的用户干预。
这会捕获html5audio.play()
上的 Apple 媒体锁定承诺拒绝错误,并为用户提供一些可以点击的内容,即使他们真的不想再次点击并且只想在连接后听到他们的流。他们真的厌倦了点击,因为他们不得不点击很多,包括允许麦克风访问,因此即使它是单向流,也会提供 ICE 候选人。用户体验真的很差,如果苹果在阅读这篇文章后再次打破这一点,我真的会哭。
<script>
// Play audio stream once it arrives
GlobalRTCObject.onaddstream = function(event)
Player.srcObject = event.stream;
var AppleHack = Player.play();
if (AppleHack !== undefined)
AppleHack.catch(function(error)
document.getElementById("UserControl").innerHTML = '<div id="StartPlaying">Play</div>';
document.getElementById("StartPlaying").addEventListener("click", StartPlaying, true);
).then(function()
// If you want to do something every time it starts playing
);
;
</script>
这是基于我不久前在网上找到的关于 iOS 11 的内容。
我还有一大块红色的文字来解释事情,这样用户就会意识到他们需要点击更多的事情。
我发现原生 HTML5 音频控件在启动时并不总是可靠的。更有趣的是,如果您循环播放/暂停原生控件,它通常会大幅提高音量,这很好,因为在没有放大耳机的情况下它太软了无法使用。
我希望这对其他人有所帮助,但我仍然希望有更好的解决方案。
【讨论】:
以上是关于如何在 Safari 和 iOS 11 上播放 WebRTC 媒体流的主要内容,如果未能解决你的问题,请参考以下文章
在 Safari iOS 14.2 上自动播放视频 HTML
带有自定义控件的视频无法在 iOS 上播放(Safari 和 Chrome)