Итак, вот проблема, которая у меня сейчас есть. Мне нужен аудиоплеер для iOS, который будет воспроизводить mp3. На первый взгляд, это может показаться тривиальной проблемой, просто создайте тег audio
и присвойте ему URL-адрес mp3-файла. Хотя это технически работает, в принципе его невозможно использовать, поскольку iOS необходимо загрузить весь файл перед началом его воспроизведения. Это приводит к очень длительному времени ожидания при попытке воспроизведения больших mp3-файлов (может приблизиться к минуте). Поэтому первое, что я попробовал, это вручную имитировать c блок, который chrome делает для воспроизведения mp3-файлов. Сначала я отправил запрос HEAD
, чтобы получить длину аудиофайла в байтах. Использовали эту длину / длительность в секундах, чтобы получить средние байты в секунду и использовать эти данные для запроса чанков в зависимости от того, куда пользователь ищет. Это не сработало, поскольку иногда mp3-файлы содержат метаданные, которые сбрасывают вычисления (например, изображение обложки). Кроме того, иногда в mp3-файлах используется VBR (переменная скорость передачи битов), и тогда я в полном порядке.
Так что это привело меня к мысли, что Safari не может потребовать от конечного пользователя загрузки всего файла mp4. прежде чем играть в нее. Поэтому я взял mp3-файл, преобразовал его в mp4 в онлайн-конвертере и проверил мою теорию. Вуаля, это сработало. Safari транслировал файл mp4 порциями, и время ожидания приблизилось к 0. Хорошо, теперь все, что мне нужно сделать, - это конвертировать mp3-файлы в mp4-файлы. Проблема в том, что у меня есть требование не использовать мой сервер для конвертации этих файлов. Я хочу переложить эту дорогую операцию на клиента. Оглядевшись немного, я нашел несколько wasm
библиотек для этого, отлично! Нет. Эти wasm
библиотеки огромны (24 МБ) и добавят неприемлемое количество к моим уже большим пакетам файлов. Так что это подводит меня к моему вопросу. Есть ли способ обмануть сафари, думая, что мой mp3-файл - mp4. Что я уже пробовал:
При событии изменения ввода -> получить файл -> клонировать его в новый BLOB-объект с mimeType video/mp4
и затем загрузить этот файл на сервер. Chrome воспроизводит этот файл без проблем (возможно, потому что он обнаруживает, что это файл mp3), однако в Safari он не может воспроизвести файл.
Так что мой вопрос, есть ли способ упаковать файл mp3 в контейнер mp4 (Клиентская сторона! важно), чтобы «заставить» Safari разбить файл на части.