Вопрос:

Аудио голос за кадром, когда iPhone заблокирован

ios swift audio nstimer voiceover

54 просмотра

2 ответа

9 Репутация автора

Я работаю над запущенным приложением, которое дает инструкцию по озвучке в начале каждого упражнения. Он работает, как задумано, когда устройство активно, но не работает, когда телефон заблокирован. [ Текущее аудио продолжается, но не воспроизводится в будущем. ]

Вопрос: Как я могу начать проигрывать аудио закадровый голос, пока пользователь iPhone заблокирован.

В настоящее время я отслеживаю тренировку, используя Timer.scheduledTimer2 таймера, которые я отображаю [текущая активность и общая тренировка]. Когда таймер достигает заданного времени ближе к концу одного действия, закадровый звук воспроизводится, чтобы ввести следующее действие. Таймер запускает звук, и я считаю, что это проблема . Я могу приостановить тренировки, пропустить разделы и все работает нормально - пока устройство не заблокировано.

Если при нажатии кнопки «Домой» или блокировке iPhone воспроизводится голос закадрового звука, он продолжает воспроизводиться, как и ожидалось. Проблема в том, что таймер не срабатывает, поэтому следующая звуковая передача голоса (скажем, 90 секунд) никогда не воспроизводится.

В некоторых ответах и ​​комментариях, которые я прочитал, сказано, что эта функциональность просто невозможна в iOS. Приложение Couch to 5k https://itunes.apple.com/gb/app/one-you-couch-to-5k/id1082307672?mt=8 использует эту функциональность, поэтому я знаю, что этого можно достичь, я просто не знаю, как они это делают. [Это будет специальный участник, который скачает его, чтобы понять, что я имею в виду :)]

Из поиска SO Я много читал пост о том , что Timerили NSTimerне может работать , когда приложение работает в фоновом режиме или телефон заблокирован. Любые сообщения, которые говорят, что это может работать, старые и основаны на iOS4 / 5

Я читал о предложениях по использованию молчания и по сути иметь 1 длинный аудиофайл. Хотя это может создать некоторые новые проблемы для пропуска разделов в тренировке, я также прочитал комментарии, в которых говорится, что такое поведение не пройдет тестирование Apple приложения для AppStore. Третий недостаток - увеличение размера моего аудиофайла.

Опция, которую я видел, - это локальные уведомления, однако мне еще предстоит увидеть пример того, который использовался для воспроизведения звука за кадром, когда приложение находится в фоновом режиме.

Как я могу достичь той же функциональности, что и приложение Couch to 5k?

Спасибо

Автор: Steve Hancocks Источник Размещён: 29.01.2019 11:19

Ответы (2)


0 плюса

1011 Репутация автора

Мое понимание VoiceOver приводит меня к тому, что только приложение переднего плана может контролировать то, что оно считывает.

Вам нужно сфокусироваться с VoiceOver, чтобы заставить его говорить, и вы ничего не фокусируете, когда устройство заблокировано или ваше приложение находится в фоновом режиме.

Я предлагаю взглянуть на синтез речи или класс AVAudioSession, чтобы включить фоновый звук : оба могут быть хорошими обходными путями в фоновом режиме: попробуйте и дайте нам знать. ; о)

Автор: XLE_22 Размещён: 05.06.2019 07:57

0 плюса

9 Репутация автора

Хорошо, я разработал решение для воспроизведения звуковых подсказок для пользователя в течение 30-минутной тренировки, даже если iPhone заблокирован или приложение находится в фоновом режиме. Приложение было отправлено и одобрено для AppStore .

Чтобы приложение работало должным образом, я использую 2 AVAudioPlayers; один воспроизводит голос за кадром, другой воспроизводит 15-минутную дорожку молчания (так как это отдельная дорожка, и она просто тихая, это низкое качество .mp3 и только добавило 900 КБ к размеру приложения). 15 минут хорошо превышают любой интервал между озвучиванием, поэтому он работает идеально

Когда пользователь начинает упражнение, воспроизводится первая звуковая подсказка. С этого момента, пока пользователь не остановит упражнение, в фоновом режиме будет воспроизводиться звук. Поскольку воспроизводится фоновый звук, таймер все еще работает.

Когда голос за кадром заканчивается, audioPlayerDidFinishPlayingвызывается метод делегата . В рамках этого метода я сбрасываю свойства звука [я объясню почему в ближайшее время], создаю экземпляр моего молчания AVAudioPlayerи начинаю воспроизведение 15-минутной дорожки молчания. Воспроизведение другой дорожки с использованием этого метода делегата означает, что в фоновом звуке нет реального перерыва, поэтому приложение остается в живых. С приложением «живой» таймер продолжает обратный отсчет. Когда пришло время для другого наложения голоса, таймер вызывает метод, который сбрасывает категорию аудио, создает мой голос за кадром AVAudioPlayerи воспроизводит голос за кадром. Этот процесс повторяется до окончательного озвучивания. Когда это завершится, дальнейшее молчание не будет воспроизведено, и приложение можно смело фонировать.

Голос за кадром должен звучать как утка музыки пользователя [уменьшает громкость музыки, чтобы звук был четко слышен]. Тихий звук не должен этого делать, музыка должна продолжать играть на полной громкости. Поскольку оба AVAudioPlayers используют AVAudioSession.sharedInstanceI, я обнаружил, что мне пришлось деактивировать sharedInstance, сбросить свойства с или без .duckOthers, а затем повторно активировать sharedInstance перед созданием моего AVAudioSession. Это тогда дало мне желаемый результат. Постоянный фоновый звук, который только приглушал музыку пользователя, когда воспроизводился голос за кадром.

do{
    try AVAudioSession.sharedInstance().setActive(false)
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.interruptSpokenAudioAndMixWithOthers, .duckOthers])
    try AVAudioSession.sharedInstance().setActive(true)
} catch{
        print(error.localizedDescription)
}

Я знаю, что некоторые утверждают, что Apple не допускает тихий звук, однако в этом случае тихий звук воспроизводится только на время выполнения упражнения. Как только оно заканчивается, приложение может завершить работу, тем самым не поддерживая приложение дольше, чем необходимо.

Автор: Steve Hancocks Размещён: 12.06.2019 09:11
Вопросы из категории :
32x32