如何在Safari和iOS 11上播放WebRTC媒体流

时间:2017-10-31 22:50:18

标签: ios safari webrtc

Apple声称支持iOS 11中的WebRTC和新的桌面Safari。然而,媒体播放的锁定次数让我怀疑“WebRTC”是否真的受到支持。

我的应用程序以前在这些设备上工作过。现在它没有。

代码,在别处工作:

GlobalRTCObject.onaddstream = function(event){
    Player.srcObject = event.stream;
    Player.play();
};

来自苹果的错误消息:

  

未处理的承诺拒绝:NotAllowedError:当前上下文中的用户代理或平台不允许该请求,可能是因为用户拒绝了权限。

Apple批准的接收流的方式是什么?用户已经点击了各种按钮来达到这一点。苹果公司不断破坏这些应用程序以保护人们不受自己的影响,这真是非常荒谬 - 有一个后退按钮和一个红色X可以留下不需要的页面播放声音。

此外,假设有一个修复,是否有一个属性存储在浏览器中“功能”支持“锁定一切,所以东西不起作用”?我不希望我的所有用户都必须单击100个按钮才能使用工作,但我宁愿做一个比用户代理更准确的功能检测。

理想的修复方法适用于未来可能在没有用户输入的情况下添加的媒体流。有些事件没有及时发生。想想天气警报或电视直播活动。用户应该能够在最终存在时停留在播放这些内容的页面上。

1 个答案:

答案 0 :(得分:0)

这是我到目前为止所做的,但我不会将此标记为正确,因为它涉及过多的用户干预。

这可以捕获html5audio.play()上的Apple媒体锁定承诺拒绝错误,并为用户提供点击的内容,即使他们真的不想再次点击并且只想在连接时听到他们的流。他们真的厌倦了点击,因为他们不得不点击很多,包括允许麦克风访问,因此即使它是单向流,也会提供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音频控件在启动时并不总是可靠的。更有趣的是,如果您播放/暂停本机控制,它通常会大幅提升音量,这很好,因为在没有放大耳机的情况下它太软了以至于没用。

我希望这有助于其他人,但我仍然希望有更好的解决方案。