Apple 声称从 iOS 11 和新的桌面 Safari 开始支持 WebRTC。然而,媒体播放的锁定次数让我怀疑是否真的支持“WebRTC”。
我的应用程序以前可以在这些设备上运行。现在不是了。
代码,在别处工作:
GlobalRTCObject.onaddstream = function(event){
Player.srcObject = event.stream;
Player.play();
};
来自苹果的错误信息:
Unhandled Promise Rejection: NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.
Apple 认可的流媒体接收方式是什么?用户已经点击了各种按钮以达到这一点。 Apple 不断破坏这些应用程序以保护人们免受自身伤害,这真的很荒谬——有一个后退按钮和一个红色 X 可以留下播放声音的不需要的页面。
此外,假设有一个修复程序,浏览器中是否存储了一个属性以支持“锁定所有内容,使某些东西不起作用”的“功能”?我不希望我的所有用户都必须点击 100 个按钮才能让一切正常,但我宁愿做一个比用户代理更准确的功能检测。
理想的修复方法适用于将来可能在没有用户输入的情况下添加的媒体流。有些事件还没有及时发生。想想天气警报或直播电视节目之类的事情。当这些东西最终存在时,用户应该能够留在播放这些东西的页面上。
最佳答案
这是我目前所知道的,但我不会将其标记为正确的,因为它涉及太多的用户干预。
这会捕获 html5audio.play()
上的 Apple media lockout promise rejection 错误,并为用户提供一些可以点击的内容,即使他们真的不想再次点击,只是想听听他们的流一旦连接。他们真的厌倦了点击,因为他们不得不点击很多次,包括允许麦克风访问,这样即使它是单向流,也会为 ICE 候选人提供。用户体验真的很差,看完这篇文章,如果 Apple 再次破解它,我真的会哭。
<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 音频控件在启动时并不总是可靠。更有趣的是,如果您循环播放/暂停 native 控件,它通常会大大提高音量水平,这很好,因为之前它太软了,如果没有放大耳机就无法使用。
我希望这对其他人有帮助,但我仍然希望有更好的解决方案。
关于ios - 如何在 Safari 和 iOS 11 上播放 WebRTC 媒体流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045640/