Похоже, что вы описываете потоковую передачу, а не 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