Как бы я go об упаковке mp3-файла в контейнер mp4? - PullRequest
0 голосов
/ 23 февраля 2020

Итак, вот проблема, которая у меня сейчас есть. Мне нужен аудиоплеер для 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 разбить файл на части.

1 Ответ

2 голосов
/ 24 февраля 2020

Есть ли способ «обмануть» сафари, думая, что мой mp3-файл - mp4

mp4-файлы недоступны для поиска, потому что клиент «думает», что он mp4. У них есть индекс в файле, который необходим для поиска работы. Этот индекс волшебным образом не существует, потому что тип mime был изменен.

есть ли способ упаковать mp3-файл в контейнер mp4 (Клиентская сторона ...

Да, конечно. Но вы должны написать код, и это очень сложно. Вы можете прочитать документ ISO 14496-12, чтобы понять, как структурированы файлы mp4. И ISO 11172-3 и ISO 13818-3, чтобы разобрать Mp3 в кадры, которые могут записываться в MP4

...