Автовоспроизведение аудио в мобильном сафари

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

Тем не менее, мой вопрос: кто-нибудь еще нашел хитрый обходной путь? Я просто хочу воспроизвести звук запуска при запуске игры, и в настоящее время мне приходится ждать, пока пользователь щелкнет где-нибудь, прежде чем я смогу воспроизвести звук. Кто-то из вас, умников, должно быть, уже заработал?


person Simple Simon    schedule 07.11.2012    source источник
comment
Я хотел сделать что-то подобное несколько недель назад, и мои поиски были бесплодны...   -  person boz    schedule 07.11.2012
comment
Я искал эту проблему до смерти и не нашел ничего полезного. Пожалуйста, Stackoverflow, вы моя единственная надежда...   -  person Simple Simon    schedule 07.11.2012
comment
Я нашел обходной путь для Firefox и Chrome с помощью AudioContext, но я не пробовал в Safari (пожалуйста, подтвердите, работает ли он, если у вас есть Safari Mobile). См. мой ответ на аналогичный вопрос stackoverflow.com/a/46485784/2342518 [Будем надеяться, что @boz был последним, кто имел бесплодные искать с этого момента ☺ ]   -  person Xenos    schedule 29.09.2017
comment
gist.github.com/ufologist/50b4f2768126089c3e11   -  person Alex Ivasyuv    schedule 15.02.2018
comment
Opera Mini в iOS поддерживает автовоспроизведение по умолчанию, в то время как Chrome, Firefox и Safari не поддерживают и не предлагают варианты включения.   -  person anonymous    schedule 07.05.2018


Ответы (4)


В мобильных браузерах нет возможности заставить автовоспроизведение работать. Android и iOS не позволяют этого, и лично я думаю, что это возможное ограничение! Представьте себе, что каждый второй сайт, который вы открываете, играет и уродливо звучит при запуске!

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

  1. Вам НЕОБХОДИМО взаимодействие с пользователем, чтобы запустить звук. Итак, ваше приложение или игра может иметь начальный экран или кнопку приветствия, которую нужно щелкнуть, чтобы перейти в главное меню или запустить игру. Привяжите к пользовательскому событию (допустимые события: «щелчок», «касание», «двойной щелчок» и «нажатие клавиши») и вызовите метод load() для вашего <audio>.

  2. Привяжите к событию canplaythrough файла <audio>. Это событие запускается, когда ваш источник готов к воспроизведению. Теперь вы можете вызывать play(), pause() или ждать других взаимодействий. Итак, звук готов, но теперь у вас есть полный контроль, когда включать или выключать звук.

  3. Также советую использовать аудио спрайты на мобильных клиентах. iOS (и Android?) внутренне реализовала поддержку звука через Singleton. Это означает, что вы не можете, как в настольном браузере, иметь 10 аудиоэлементов и одновременно воспроизводить разные звуки. Вы можете воспроизвести только один файл! Поэтому смена источника для разных звуков занимает много времени. С помощью звукового спрайта вы можете запускать свои спрайты, когда пользователь впервые взаимодействует с вашим веб-сайтом или игрой. Приостановите свой спрайт, и когда вам нужно воспроизвести звук, вы должны установить currentTime в начало спрайта и приостановить спрайт, когда currentTime вашего файла достигнет конца вашего спрайта. Существует событие timeupdate, где вы можете проверить текущее время вашего спрайта.

Если вам больше интересно, я могу подготовить для вас свой проигрыватель аудиоспрайтов javascript !!

person Simon Franzen    schedule 27.02.2013
comment
Спасибо за ответ, к сожалению, наша игра должна запускаться без дополнительного взаимодействия с пользователем, поэтому ваш «хак» нам не подойдет. Мы уже используем звуковые спрайты, и это прекрасно работает (в основном!). Я дам вам правильный ответ, поскольку кажется, что сейчас нет другого решения... - person Simple Simon; 01.03.2013
comment
Есть шанс использовать AudioContext; см. мой ответ stackoverflow.com/a/46485784/2342518 - person Xenos; 29.09.2017
comment
Знаете ли вы, могу ли я загружать несколько разных аудиоэлементов, когда пользователь нажимает кнопку? - person maracuja-juice; 29.10.2017
comment
@Marimba это работает только на рабочем столе. Как я уже писал: внутренняя поддержка звука реализована в виде синглтона (для iOS). Так что здесь нет возможности обмануть - person Simon Franzen; 13.12.2017
comment
@SimonFranzen Я узнал, что это неправда. На самом деле вы можете загрузить несколько аудиоэлементов в Safari. Вам нужно воспроизвести их, затем поставить на паузу и сохранить где-нибудь для последующего использования. - person maracuja-juice; 14.12.2017
comment
Ваши идеи кажутся многообещающими. Почему бы не привести несколько примеров кода? Это было бы оценено. - person Cymro; 21.02.2019

Единственное решение, которое я видел до сих пор, — это создать приложение-оболочку и поместить веб-приложение в UIWebView.

http://flowz.com/2011/03/apple-disabled-audiovideo-playback-in-html5/

UIWebView.allowsInlineMediaPlayback = YES;
UIWebView.mediaPlaybackRequiresUserAction = NO;

Я также очень хотел бы знать, как это сделать в обычном веб-приложении.

person Jason    schedule 30.01.2013
comment
К сожалению, весь смысл создания HTML5-версий нашего текущего портфолио в том, что они не должны зависеть от устройства. Обертывание его в UIWebView означает только iOS :-( Спасибо за ответ, хотя... - person Simple Simon; 31.01.2013

Я считаю, что я только что решил это для своего собственного приложения.

Шаги,

Контроллер загружается,

Затем .... в представленииDidLoad

пусть ваше веб-представление загрузит HTML: loadHTMLString:htmlFile baseURL:[self getBasePath]];

ТОГДА... установите mediaPlaybackRequiresUserAction = NO в веб-просмотре.

Если вы установите его слишком рано, я думаю, что загрузка для html сбрасывает его.

person user3799852    schedule 24.07.2014

У меня есть приложение для чата с ботом, в котором есть голосовые сообщения, и мне нужно, чтобы они автоматически воспроизводились всякий раз, когда это необходимо... вот что сработало для меня в моем приложении angular:

просто прикрепите прослушиватель событий кликов к документу и вызовите player.load(), после чего всякий раз, когда вы устанавливаете player.src = x;, он будет воспроизводиться автоматически.

<audio id="voicePlayer" controls autoplay playsinline #voicePlayer></audio>

@ViewChild('voicePlayer', { read: ViewContainerRef }) voicePlayerRef: ViewContainerRef;

...

  ngAfterContentInit(): void {
    this.voicePlayer = this.voicePlayerRef.element.nativeElement;
    document.addEventListener('click', this._onDocumentClick.bind(this));
  }

  _onDocumentClick() {
    this.voicePlayer.load();
    document.removeEventListener('click', this._onDocumentClick);
  }

...


this.voicePlayer.src = 'x';
person Exlord    schedule 01.01.2020