Транскодирование ресурсов для расширений Media Source
При работе с расширениями Media Source, скорее всего, вам потребуется подготовить ваши ресурсы перед их потоковой передачей. Эта статья ознакомит вас с требованиями и покажет цепочку инструментов, которую вы можете использовать для соответствующего кодирования ваших ресурсов.
Начало работы
- Первым и наиболее важным шагом является обеспечение того, что ваши файлы состоят из контейнера и кодека, поддерживаемых браузерами пользователей.
- В зависимости от кодека, вам может потребоваться фрагментировать файл для соответствия спецификации ISO BMFF.
- (Необязательно) Если вы решите использовать динамическую адаптивную потоковую передачу через HTTP (DASH) для адаптивной потоковой передачи с различной скоростью передачи данных, вам нужно транскодировать ваши ресурсы в несколько разрешений. Большинство клиентов DASH ожидают соответствующий манифест файла описания медиа-представления (MPD), который обычно генерируется при создании файлов ресурсов с несколькими разрешениями.
Ниже мы рассмотрим все эти шаги, но сначала давайте посмотрим на цепочку инструментов, которые мы можем использовать для этого довольно легко.
Образец медиа
Если вы хотите выполнить шаги, указанные здесь, но не имеете медиа для экспериментов, вы можете загрузить трейлер Big Buck Bunny. Big Buck Bunny, являющийся собственностью Blender Foundation, лицензирован по лицензии Creative Commons Attribution 3.0. В этом руководстве вы увидите имя файла trailer_1080p.mov, который является загружаемым файлом.
Необходимые инструменты
При работе с MSE необходимы следующие инструменты:
- ffmpeg — Утилита командной строки для транскодирования ваших медиа в требуемые форматы. Вы можете загрузить версию для вашей системы на странице загрузки FFmpeg. Извлеките исполняемый файл из архива и добавьте его расположение в вашу переменную PATH. Пользователи OSX также могут использовать homebrew для установки ffmpeg.
-
Bento4 — Набор утилит командной строки для получения метаданных ресурсов и создания контента для DASH. Для установки вам необходимо самостоятельно скомпилировать приложение из предоставленных файлов проекта/исходных файлов, в зависимости от вашей ОС и предпочтений. См. инструкции по сборке для получения более подробной информации. Предварительно собранный файл находится здесь. Поместите содержимое каталога
binв одно место с ffmpeg. - python2 — используется Bento4.
Установите их успешно, прежде чем переходить к следующему шагу.
Образец медиа должен быть помещен в каталог Bento4 utils и обрабатываться здесь.
Примечание: Предварительно собранный ffmpeg не включает libfdk_aac из-за лицензионных ограничений. Bento4 использует его по умолчанию, поэтому вам необходимо скомпилировать ffmpeg, если это необходимо. Если вам это не нужно, добавьте --audio-codec=aac в командную строку mp4-dash-encode.py.
Поддержка контейнера и кодека
Как указано в разделе 1.1 спецификации MSE: Цели, MSE разработан таким образом, чтобы не требовать поддержки какого-либо конкретного формата медиа или кодека. Хотя это верно на бумаге, поддержка браузерами варьируется для конкретных комбинаций контейнер/кодек.
Чтобы проверить, поддерживает ли браузер определенный контейнер, вы можете передать строку MIME-типа методу MediaSource.isTypeSupported():
MediaSource.isTypeSupported("audio/mp3"); // false
MediaSource.isTypeSupported("video/mp4"); // true
MediaSource.isTypeSupported('video/mp4; codecs="avc1.4D4028, mp4a.40.2"'); // true
Строка — это MIME-тип контейнера, необязательно с последующим списком кодеков. Хотя MIME-тип довольно просто определить, мы можем получить строку кодека с помощью утилиты mp4info.
В настоящее время контейнеры MP4 с видеокодеком H.264 и аудиокодеком AAC поддерживаются во всех современных браузерах, в то время как другие браузеры их не поддерживают.
Чтобы преобразовать наш образец медиа из контейнера QuickTime MOV в контейнер MP4, мы можем использовать ffmpeg. Поскольку аудиокодек в контейнере MOV уже AAC, а видеокодек — h.264, мы можем указать ffmpeg не выполнять транскодирование. Вместо этого он просто скопирует аудио- и видеодорожки без выполнения какого-либо транскодирования, что относительно быстрее, чем выполнение транскодирования.
ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy bunny.mp4
Проверка фрагментации
Для правильной потоковой передачи MP4 нам нужен ресурс в формате ISO BMF MP4. Без надлежащей фрагментации любой файл MP4 не гарантированно будет работать с MSE. Это означает, что метаданные в контейнере распределены, а не сгруппированы.
Чтобы проверить, является ли файл MP4 правильным потоковым MP4, вы снова можете использовать утилиту mp4info для отображения атомов MP4.
Примечание: Фрагментированная версия немного больше, чем исходная, из-за дополнительных метаданных, распределенных по всему файлу. Обычно это увеличение размера файла на 1% или меньше.
Фрагментация
Если у вас есть ресурс, который не является MP4, ffmpeg может обрабатывать выпуск фрагментированного MP4 во время процесса транскодирования с флагом командной строки -movflags frag_keyframe+empty_moov.
ffmpeg -i trailer_1080p.mov -c:v copy -c:a copy -movflags frag_keyframe+empty_moov bunny_fragmented.mp4
Если у вас уже есть MP4, но он не фрагментирован должным образом, вы снова можете использовать ffmpeg:
ffmpeg -i non_fragmented.mp4 -movflags frag_keyframe+empty_moov fragmented.mp4
В обоих случаях Chrome может потребовать установки дополнительного флага фильма:
-movflags frag_keyframe+empty_moov+default_base_moof
Наличие должным образом фрагментированного файла MP4 — все, что вам нужно для начала работы. Если вы хотите использовать адаптивную потоковую передачу с различной скоростью передачи данных, вам придется создать кодирования с несколькими разрешениями. Хотя MSE достаточно гибко, чтобы позволить вам реализовать это, настоятельно рекомендуется использовать существующий клиент DASH, так как DASH — это хорошо определенный протокол приложения.
Создание контента для DASH
Учитывая, что ffmpeg и утилиты Bento4 доступны через ваш $PATH, вы можете запустить скрипт Python Bento4 mp4-dash-encode.py для генерации нескольких кодирований вашего контента с различными разрешениями. Скрипт Python Bento4 mp4-dash.py может затем использоваться для генерации соответствующего файла MPD, необходимого клиентам.
Выполните следующие команды:
python mp4-dash-encode.py -b 5 -v bunny_fragmented.mp4 python mp4-dash.py video_0*
Это должно вывести следующие файлы:
output
├── audio
│ └── und
├── stream.mpd
└── video
├── 1
├── 2
├── 3
├── 4
└── 5
Примечание: mp4-dash-encode.py не отображает сообщения об ошибках ffmpeg. Вы можете увидеть их, указав опцию -d.
Примечание: Если "Invalid duration specification for force_key_frames: 'expr:eq(mod(n" отображается как сообщение об ошибке, измените mp4-dash-encode.py и удалите два "'" из "-force_key_frames 'expr:eq(mod(n,%d),0)'".
Заключение
После правильного кодирования вашего видео и генерации медиа с адаптивной скоростью передачи данных вы готовы начать адаптивную потоковую передачу с различной скоростью передачи данных в веб-приложении с использованием DASH и MSE.
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API/Transcoding_assets_for_MSE