Воспроизведение звуков в веб-приложении Flutter

Для воспроизведения звука на iOS или Android с помощью Flutter большинство людей будут использовать специальные пакеты из репозитория pub.dev.
К сожалению, они не помечены как поддерживаемые на веб-платформе.
На момент написания этой статьи я не мог легко настроить воспроизведение звука в своем веб-приложении (хотя я пробовал большинство пакетов, связанных со звуком), не используя ту же технику, которую я использовал для воспроизведения видео в нем.
Мы рассмотрим решение, которое позволяет нам воспроизводить аудио за 3 простых шага:
1. Нам нужно отредактировать файл шаблона index.html по умолчанию, который находится в папке web. С этими изменениями мы загружаем Аудиоплеер Howler и пишем функцию JavaScript, которая позаботится о фактическом воспроизведении нашего звука.
Вот как будет выглядеть наш index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="Flutter Web Audio Player.">
<!-- iOS meta tags & icons -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="Flutter Web Audio Player">
<link rel="apple-touch-icon" href="/icons/Icon-192.png">
<title>Flutter Web Audio Player</title>
<link rel="manifest" href="/manifest.json">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/howler.min.js"></script>
<script type="application/javascript">
var audio;
function playAudio(path) {
audio= new Howl({
src: [path]
});
audio.play();
}
</script>
</head>
<body>
<script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
2. Затем мы пишем функцию Dart с именем playAudio, которая будет вызывать ранее написанную функцию JS со страницы index.html, используя основной пакет dart:js, и передавать аудио путь или URL-адрес, который мы хотим воспроизвести:
import 'dart:js' as js;
void playAudio(String path) {
if(kIsWeb) {
js.context.callMethod('playAudio', [path]);
} else {
// not on the web so we must use a mobile/desktop library...
}
}
Код просто вызывает метод playAudio из контекста, передавая путь в качестве параметра.
3. Звук будет воспроизводиться мгновенно. Это полезно, когда мы хотим добавить звуки взаимодействия к нашим действующим элементам пользовательского интерфейса.
playAudio('https://freesound.org/data/previews/147/147597_2173181-lq.mp3');
// or
playAudio('/some/path/to/my/awesome.mp3');
Я решил немного поиграть и изменил проект по умолчанию, который мы получаем, когда создаем веб-проект Flutter для этой демонстрации:

Весь проект можно найти в этом репозитории GitHub, и вы можете похлопать здесь.
Есть и другие действия, которые мы можем выполнять с помощью Howler API. Он обещает и обеспечивает:
- упрощенный API
- аудио спрайты
- пространственный звук
- полная поддержка кодеков (все файлы для браузера: MP3, MPEG, OPUS, OGG, OGA, WAV, AAC, CAF, M4A, MP4, WEBA, WEBM, DOLBY, FLAC)
- работает везде (включая IE9)
- предлагает полный контроль
- автоматическое кеширование
- это модульный
- не имеет никаких зависимостей (howler.js весит всего 7 КБ в сжатом виде и не имеет внешних зависимостей или плагинов)
Я говорю, что он ставит много флажков, и более подробную информацию можно найти на его специальной странице.

В заключение отметим, что таким образом можно использовать любой аудиоплеер HTML / JS. Я выбрал Howler, потому что мне понравились его простота, мощность и легкость (для вышеуказанных базовых функций вы можете использовать только базовую библиотеку).
Недавно я наткнулся на порт Dart библиотеки Howler:
Если вас интересует также воспроизведение видео, вы можете проверить это:
Это все!