【问题标题】:why vimeo HTML player interrupt my app audio session?为什么 vimeo HTML 播放器会中断我的应用程序音频会话?
【发布时间】:2020-05-10 11:22:48
【问题描述】:

在我的应用程序(音频基础应用程序)中,我正在播放远程音频。

在开始播放之前我设置了以下类别

AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])

所以当我播放音频时,我也在WKWebView 中播放 vimeo 视频,这会导致音频中断。如何避免这种行为?

<!DOCTYPE html>
        <html>
        <body>
        <style type="text/css">
        body, html {width: 100%; height: 100%; margin: 0; padding: 0;background:black}
        .main {position: absolute;top: 0; left: 0; right: 0; background-color: #101010;height:100%;}
        .main iframe {display: block; width: 100%; height: 100%; border: none;}
        </style>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
        <script src="https://player.vimeo.com/api/player.js"></script>
        <div class="main">
        <iframe src=\(url)></iframe>
        </div>

        <script src="https://player.vimeo.com/api/player.js"></script>
        <script>
        var iframe = document.querySelector('iframe');
        var player = new Vimeo.Player(iframe);

        player.on('play', function() {
        window.webkit.messageHandlers.play.postMessage("play")
        });

        player.on('pause', function() {
        window.webkit.messageHandlers.pause.postMessage("pause")
        });

        player.on('ended', function(data) {
        window.webkit.messageHandlers.ended.postMessage("ended")
        });

        player.on('bufferstart', function(data) {
        window.webkit.messageHandlers.bufferstart.postMessage("bufferstart")
        });

        player.on('bufferend', function(data) {
        window.webkit.messageHandlers.bufferend.postMessage("bufferend")
        });

        Promise.all([player.getVideoWidth(), player.getVideoHeight()]).then(function(dimensions) {
        window.webkit.messageHandlers.dimensions.postMessage(dimensions)
        });

        player.getDuration().then(function(duration) {
            window.webkit.messageHandlers.duration.postMessage(duration);
        });

        player.ready().then(function () {
        player.setVolume(1)
        window.webkit.messageHandlers.ready.postMessage("ready");
        });

        function play() {
        player.play();
        }

        function pause() {
        player.pause();
        }

        function destroy() {
        player.destroy();
        }

        </script>

        </body>
        </html>

【问题讨论】:

  • 您使用了错误的类别 - 请改用AVAudioSessionCategory.ambient

标签: ios html5-video wkwebview vimeo vimeo-player


【解决方案1】:

发生中断是因为WKWebview 声音由不同的进程和单独的AVAudioSession 处理。 WKWebview AVAudioSessionCategory 类别将切换到.playback,同时通过&lt;audio&gt;&lt;video&gt; 标签(或其对应的javascript)播放声音。这必须是您的 vimeo 播放使用的底层机制(否则不会发生中断)。

您可以走两条主要路线:

1) 如果您的主应用程序声音(不是 WKWebView 的声音)与任何其他 iOS 声音(如 iPod 音乐播放)混合没有问题,那么请按照评论中的 @Rog 建议使用 @ 987654329@ 用于您的主要应用音频会话类别。 (这也会导致您的应用主音频会话在硬件静音开关处于关闭位置时不发出声音。

2) 一个更灵活但需要仔细计时处理的方法是为您的主应用程序音频会话.playback 类别另外设置.mixWithOthers 选项。一旦你检测到WKWebView 播放完它自己的声音,你就会删除.mixWithOthers。从用户的角度来看,它会显示为您的应用一直在使用.playback

我在回答here中涉及了一些相关的话题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多