Однако при малейшем падении соединения звук останавливается и не восстанавливается.
Вы можете восстановить соединение с вашим собственным кодом, обработав событие error
в элементе Audio. https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/onerror
Не говоря уже о том, что если я нажму паузу, поток продолжит использовать данные в фоновом режиме.
Да, вы захотите создать свой собственный интерфейс для управления этим элементом. Когда кто-то делает паузу, вам нужно вместо этого позвонить .stop()
. По умолчанию аудиоэлемент принимает обычный аудиофайл, который заканчивается в какой-то момент.
Сторонний плагин ...
Плагин не требуется.
... лучшее управление буферизацией и игровой опыт?
С двумя предложениями, которые я сделал в этом ответе, вы можете получить полезный опыт для своих пользователей. Однако есть еще две проблемы, которые вы еще не затронули, с которыми вы можете столкнуться.
Во-первых, обычные метаданные ICY не запрашиваются и не декодируются браузером.
Вторая проблема заключается в том, что, поскольку браузер обрабатывает ваш поток как обычный аудиофайл, он также буферизует все эти аудиоданные в память. Это не очень полезно для прямой трансляции, где вы никогда не вернетесь и не воспроизведите ранее воспроизведенное аудио. (Это редкая проблема, с которой вы сталкиваетесь, поскольку аудиоданные требуют относительно небольшого объема памяти, но проблема существует.)
Обе эти проблемы решаются с помощью MediaSource Extensions . С MSE у вас есть прямой контроль над извлечением данных, демультиплексированием метаданных и передачей данных в буфер для воспроизведения. Поскольку ваш код находится под контролем, вы можете выполнять потоковую передачу неограниченно без утечки памяти.