Предупреждение: этот вопрос почти идентичен вопросу здесь: Создание одиночного сегмента MPEG-Dash с помощью ffmpeg, но кажется, что ffmpeg обновлялся со временем, и теперь ответ, предоставленный Coumeu, больше неактуален.
С помощью ffmpeg я пытаюсь «лениво создавать» сегменты, необходимые для воспроизведения MPEG DASH. У меня есть статический манифест (MPD), который включает SegmentTemplates для 1 видео- и 1 аудиопотока.
Сегмент будет сгенерирован только тогда, когда будет достигнут конечный пункт, указанный в SegmentTemplate для инициализирующих или медиасегментов. Иными словами, ничего не обрабатывается заранее.
Я создаю инициализирующий сегмент с помощью следующих movflags:
+frag_keyframe+faststart+skip_trailer
Я создаю медиа-сегмент с помощью следующих movflags:
+frag_keyframe+default_base_moof+delay_moov+skip_trailer+dash+global_sidx
И следующих дополнительных команд для любого типа сегмента:
-map_metadata -1 -copyts -start_at_zero -map 0:${streamIndex}
В результате получается воспроизводимое видео с правильной продолжительностью, но, похоже, оно довольно быстро переключает фрагменты. В среднем один фрагмент в секунду. Когда я убираю флаг delay_moov, видео также начинает глючить, как будто оно перескакивает через I-кадры.
Мои наблюдения при просмотре контейнеров:
- earliest_presentation_time (коробка sidx) равен 0 для всех сегментов
- base_media_decode_time (коробка moof->traf->tfdt) равен 0 для всех сегментов
Я ищу либо правильную командную строку для создания сегментов на лету, либо хитрые способы сделать это правильно, если ffmpeg не предоставляет этого из коробки. Даже информация о том, на что обратить внимание, была бы полезна, потому что мои знания о mp4 и MPEG-DASH иссякают.
Ответ
Чтобы создать сегменты MPEG-DASH "по запросу" с использованием FFmpeg, необходимо правильно настроить параметры создания начального и медийного сегментов в вашей статической манифестной таблице (MPD). Ниже приведен пример команды, которая может помочь в этой задаче, а также объяснение параметров.
Шаг 1: Создание начального сегмента (init segment)
Вы можете использовать следующую команду, чтобы создать начальный сегмент:
ffmpeg -i input.mp4 -movflags +frag_keyframe+faststart+skip_trailer -f dash init.mp4
Шаг 2: Создание медийного сегмента (media segment)
Для создания медийного сегмента используйте следующую команду:
ffmpeg -i input.mp4 -movflags +frag_keyframe+default_base_moof+delay_moov+skip_trailer+dash+global_sidx -map_metadata -1 -copyts -start_at_zero -map 0:${streamIndex} -f dash segment.m4s
Настройки FFmpeg
frag_keyframe
— создает фрагменты на ключевых кадрах, что позволяет получить более корректные потоки.default_base_moof
— устанавливает базовый moof для фрагментов, что увеличивает их совместимость с DASH.delay_moov
— задерживает создание moov-таблицы до создания первого сегмента, что иногда может помочь избежать глитчей при воспроизведении.skip_trailer
— пропускает окончание файла, что позволяет избежать ненужных данных в выходном потоке.global_sidx
— добавляет общий sidx, который помогает в управлении сессией потоковых данных.
Ошибки и проблемы
Если вы столкнулись с такими проблемами, как "слишком быстрое переключение фрагментов", это может быть связано с неправильными временными метками в ваших сегментах. Обратите внимание на следующее:
- Убедитесь, что
earliest_presentation_time
иbase_media_decode_time
корректно задаются во время сегментации. Это часто означает, что ваш оригинальный файл должен быть корректно закодирован и временные метки должны быть синхронизированы. - Обратите внимание на использование кодека. Используйте кодеки, поддерживающие параметр "faststart", чтобы ваш стриминг отображался без задержек.
Альтернативные решения
Если FFmpeg не предоставляет желаемых результатов, вы можете рассмотреть использование других инструментов для генерации DASH содержимого, таких как MP4Box
из состава GPAC. Этот инструмент имеет более гибкие возможности для создания DASH MPD и сегментов.
Пример использования GPAC:
MP4Box -dash 4000 -rap -frag-rap -profile live -out manifest.mpd input.mp4
Используйте приведенные выше команды в зависимости от ваших потребностей. Если ваша цель заключается в том, чтобы создавать сегменты в реальном времени, рассмотрите возможность реализации запроса на серверной стороне, который активирует процесс кодирования при запросе медиа-содержимого.
Заключение
С помощью этих инструментов и настроек вы сможете улучшить процесс создания сегментов MPEG-DASH "по запросу". Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь сообщать о них, и я помогу вам разобраться.