Генерация одиночного сегмента MPEG-Dash с помощью ffmpeg - PullRequest
0 голосов
/ 04 июля 2019

Я пытался реализовать Plex-подобный видеопроигрыватель, который перекодирует произвольный видеофайл по требованию и воспроизводит его с помощью MPEG-Dash на веб-странице.Мне удалось реализовать проигрыватель на стороне клиента с эталонной реализацией dash.js, поэтому он будет динамически запрашивать сегменты с сервера (используя SegmentTemplate в файле mpd).

Но у меня возникли некоторые проблемыгенерировать эти куски в режиме реального времени.Ffmpeg позволяет мне установить -ss и -t, чтобы определить границы сегмента, который мне нужен, но они не воспроизводятся должным образом в проигрывателе, потому что это «полные» видеофайлы, а не сегменты Dash.

Так как мне настроить мою команду ffmpeg, чтобы она перекодировала только ту часть, которая мне нужна как сегмент Dash, без необходимости заранее генерировать сегменты для всего видеофайла?

Входной видеофайл может быть любого формата,поэтому нельзя предполагать, что это кодек, совместимый с mp4 / dash.Поэтому необходимо перекодирование (с помощью ffmpeg или аналогичного инструмента).

Моя текущая команда ffmpeg выглядит так (после долгих попыток):

ffmpeg -ss 10 -t 5 -i video.mkv -f mp4 -c:a aac -c:v h264 -copyts -movflags empty_moov+frag_keyframe temp/segment.mp4

Игрок на стороне клиента должен иметь возможностьбуферизуйте следующие X сегменты, и пользователь должен иметь возможность просматривать текущую позицию на панели длительности и искать другую позицию.Поэтому рассматривать его как прямой эфир невозможно.

1 Ответ

0 голосов
/ 05 июля 2019

Похоже, что вы описываете потоковую передачу, а не VOD - прямые потоки являются непрерывными, обычно это видеопотоки в реальном времени, а VOD, как правило, представляет собой видеофайл, который подается, когда пользователь запрашивает его.

Обычный способ создания VOD в более крупных решениях состоит в том, чтобы сначала сегментировать видео, а затем упаковать его по требованию в требуемый потоковый протокол, обычно в это время HLS или DASH. Это позволяет оператору минимизировать различные форматы, которые им необходимо поддерживать.

Появляющийся стандарт CMAF помогает поддерживать это, используя один и тот же формат для сегментов как для HLS, так и для DASH. Если вы ищете «CMAF», вы увидите много объяснений истории, и официальная страница также здесь: https://www.iso.org/standard/71975.html

Существуют инструменты с открытым исходным кодом, которые помогут вам конвертировать файл MP4 прямо в DASH - MP4Box является одним из наиболее распространенных: https://gpac.wp.imt.fr/mp4box/dash/

ffmpeg также включает в документацию информацию для поддержки VOD: https://www.ffmpeg.org/ffmpeg-formats.html#dash-2, включая пример:

ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264 \
-b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline \
-profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 \
-b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 \
-window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash /path/to/out.mpd

Если на самом деле вы смотрите живой поток, то входными данными обычно является не файл MP4, а поток в каком-либо формате, например HLS, RTMP, MPEG-TS и т. Д.

Взять входные данные в этом формате и обеспечить прямой вывод DASH-профиля более сложно. Обычно для этого используется выделенный упаковщик. Было бы неплохо взглянуть на Shaka Packager с открытым исходным кодом (https://github.com/google/shaka-player)), который включает в себя примеры для вывода DASH в реальном времени:

Предполагая, что вы хотите, чтобы пользователь мог наблюдать за тем, как генерируется видеофайл, один из способов сделать это - сделать поток похожим на живой поток, т. Е. Случай «VOD to Live».

Вы можете использовать перезапуск в Ffmpeg для транскодирования и передачи в UDP, а затем передать его в упаковщик.

Документация ffmpeg включает это примечание:

-re (ввод) Чтение ввода с частотой кадров. В основном используется для имитации устройства захвата или живого потока ввода (например, при чтении из файла). Не должен использоваться с реальными устройствами захвата или живыми входными потоками (где это может вызвать потерю пакета) По умолчанию ffmpeg пытается прочитать входные данные как можно быстрее. Эта опция будет замедлять чтение входных данных до исходной частоты кадров входных данных. Это полезно для вывода в реальном времени (например, прямой эфир).

Это даст вам поток, который выглядит следующим образом:

mp4 файл -> ffmpeg -> упаковщик -> прямой поток DASH -> клиент

Использование упаковщика для этого означает, что вам не нужно беспокоиться об обновлении манифеста, когда новые сегменты доступны или более старые недоступны.

Здесь на сайте упаковщика Wowza есть пример (на момент написания), который вы можете посмотреть и поэкспериментировать с заменой файлов сейчас или использованием их - вывод должен работать с любым упаковщиком, который может принимать вход UDP поток: https://www.wowza.com/docs/how-to-restream-using-ffmpeg-with-wowza-streaming-engine

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...