почему проигрыватель vimeo HTML прерывает аудио-сессию моего приложения? - PullRequest
0 голосов
/ 24 января 2020

В моем приложении (приложение аудио базы) я играю удаленное аудио.

перед началом воспроизведения я установил следующую категорию

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

, поэтому во время воспроизведения звука я также воспроизводю видео vimeo в WKWebView, что вызывает прерывание звука. как избежать этого поведения?

<!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>

1 Ответ

1 голос
/ 26 января 2020

Прерывание происходит из-за того, что WKWebview звук обрабатывается другим процессом и отдельным AVAudioSession. Категория WKWebview AVAudioSessionCategory переключится на .playback, когда звуки воспроизводятся через теги <audio> или <video> (или их аналоги javascript). Это должен быть базовый механизм, который использует ваше воспроизведение vimeo (в противном случае прерывания не произойдут).

Существует 2 основных маршрута, которые вы можете go:

1) Если вы в порядке с вашими звуками основного приложения (не * WKWebView), смешивающимися с любыми другими iOS звуками (такими как воспроизведение iPod musi c), затем go с предложением @Rog из комментария использовать .ambient для Ваша основная категория аудиосессии приложения. (Это также приведет к тому, что основной аудиосеанс вашего приложения не будет издавать звук, когда аппаратный переключатель тишины находится в выключенном положении.)

2) Более гибкий, но требующий тщательной обработки синхронизации, - дополнительно установить опции .mixWithOthers Ваше главное приложение аудиосессии .playback категория. Вы удалите .mixWithOthers, как только обнаружите, что WKWebView завершил воспроизведение своего собственного звука. С точки зрения пользователя это будет выглядеть, поскольку ваше приложение все время использует .playback.

В своем ответе я рассмотрел несколько связанных топи c здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...