Как заставить ffmpeg сбрасывать субтитры в режиме реального времени при перекодировании?

Я загружаю ffmpeg из стандартного ввода и выполняю несколько операций транскодирования только одной командой. Проблема в том, что ffmpeg, кажется, перекодирует их (или, по крайней мере, записывает на диск) последовательно (т.е. сначала он перекодирует/записывает аудио/видео, а затем перекодирует субтитры). Таким образом, требуется несколько минут, прежде чем вы получите какой-либо контент субтитров, что приводит к плохому взаимодействию с пользователем (если транскодирование выполняется «по запросу» / в прямом эфире), потому что клиенту нужно ждать субтитры, даже если аудио / видео готовы (по крайней мере частично). Как я могу это изменить? Как я могу заставить ffmpeg записывать субтитры на диск, как только они будут скопированы/перекодированы?

Примечание. Я считаю, что транскодирование выполняется одновременно и для субтитров, но по некоторым причинам оно сбрасывает/записывает их на диск только после завершения аудио/видео транскодирования. Это связано с тем, что ffmpeg никак не может начать чтение ввода с самого начала после выполнения транскодирования аудио/видео, потому что он не может искать/начинать заново со стандартного ввода.

Ниже приведен пример моей команды:

 ffmpeg -nostdin -i - -map 0:2 -c:0 webvtt -f webvtt first.vtt \
-map 0:3 -c:0 webvtt -f webvtt second.vtt \
-map 0:0 -c:0 copy -map 0:1 -c:1 aac \
-use_timeline 1 -min_seg_duration 1000000 \
-use_template 1 -init_seg_name $RepresentationID$-0.mp4s \
-media_seg_name $RepresentationID$-$Number$.mp4s \
-adaptation_sets "id=mkv/0,streams=0 id=mkv/1,streams=1" \
-f dash -dash 1 out.mpd

Ответы (1)

Когда ffmpeg будет сбрасываться на вывод, зависит от протокола. Для файлового протокола должно ожидаться не менее 256 КБ данных, если только это не конец вывода. Таким образом, для текстовых форматов будет только одна запись полезной нагрузки.

Вы можете обойти это, заставив ffmpeg сбрасывать поток после каждого пакета.

 ffmpeg -nostdin -i - -map 0:2 -c:0 webvtt -flush_packets 1 -f webvtt first.vtt \
-map 0:3 -c:0 webvtt -flush_packets 1 -f webvtt second.vtt \
-map 0:0 -c:0 copy -map 0:1 -c:1 aac \
-use_timeline 1 -min_seg_duration 1000000 \
-use_template 1 -init_seg_name $RepresentationID$-0.mp4s \
-media_seg_name $RepresentationID$-$Number$.mp4s \
-adaptation_sets "id=mkv/0,streams=0 id=mkv/1,streams=1" \
-f dash -dash 1 out.mpd
См. Также stackoverflow.com/questions/50574086/… для другого примера .