4

В настоящее время я использую ffmpeg для нарезки видеофайлов. Я автоматизировал процесс с помощью сценария ffmpeg_split.sh. Хотя это очень медленно, оно эффективно для разделения видео на эквивалентные настройки. Единственная проблема заключается в том, что у него есть проблемы с частотой кадров. Ниже злой суп рекомендовал способ сделать все это с помощью segment в ffmpeg. Я попробовал это, но это не дает мне сегменты эквивалентной продолжительности.

ОБНОВИТЬ

Вероятно, используя эту команду для сегментирования видео:

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

OLD:

Вот синтаксис для нарезки видео с помощью скрипта: ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

Результаты

my_split_script.sh

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:10,
Output03.mp4
#EXTINF:9,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:10,
Output06.mp4
#EXTINF:11,
Output07.mp4
#EXTINF:10,
Output08.mp4
real    0m30.517s #execution time

FFmpeg

input.mp4 – Duration 00:01:20
#EXTINF:10,
Output01.mp4
#EXTINF:10,
Output02.mp4
#EXTINF:6,
Output03.mp4
#EXTINF:10,
Output04.mp4
#EXTINF:10,
Output05.mp4
#EXTINF:7,
Output06.mp4
#EXTINF:10,
Output07.mp4
#EXTINF:9,
Output08.mp4
real    0m7.493s #executition time

2 ответа2

7

Вы можете сделать это прямо из ffmpeg без использования скрипта. По сути, всякий раз, когда вы используете ffmpeg segment , он будет продолжать и делать все возможное, чтобы разделиться ближе к времени, которое вы указали для каждого сегмента. Это основано на key_frames он найдет ближайший ключевой кадр и обрежет там. Чтобы вырезать точные сегменты, вам нужно будет перекодировать все видео.

ffmpeg -i input.mp4 -c:v libx264 -crf 22 -map 0 -segment_time 9 -g 9 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*9)" -f segment output%03d.mp4

Вам нужно будет прочитать в -crf , -sc_threshold и -force_key_frames . В вики для ffmpeg .

6

ffmpeg может сделать это сам, используя сегментный мультиплексор

ffmpeg -i input.mp4 -c copy -map 0 -segment_time 8 -f segment output%03d.mp4

Вы должны обязательно прочитать документацию и поэкспериментировать, чтобы получить лучшие результаты (по умолчанию будет достаточно для большинства целей, но вы не получите 100% точное разделение).


В общем, если вам нужно получить такую информацию, как длительность, из файла, лучше использовать ffprobe , который поставляется вместе с ffmpeg - он печатает информацию в виде набора пар key=value , что значительно облегчает работу с ним. ,

ffprobe -show_format file.mp4 | grep -F duration | cut -d= -f2
## or, if you want hh:mm:ss format:
ffprobe -show_format -sexagesimal file.mp4 | grep -F duration | cut -d= -f2

... но, я думаю, что, вероятно, лучше полагаться на собственные параметры ffmpeg , а не на сценарий оболочки (который будет гораздо менее эффективным, поскольку ему нужно вызывать много экземпляров ffmpeg).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .