ffmpeg обрезать и объединить несколько разделов одного видео с точными временными метками - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь сохранить и объединить 1-ю, 3-ю и 5-ю 10-секундные части видео (вместе со звуком), отбрасывая 2-ю и 4-ю 10-секундные части его.

Я упомянул эта ссылка для получения базового c кода и изменения его к следующему коду, который работает по назначению.

ffmpeg -i "G:\input.mp4" -filter_complex "
[0:v]trim=duration=10[av];
[0:v]trim=start=20:end=30,setpts=PTS-STARTPTS[bv];
[0:v]trim=start=40,setpts=PTS-STARTPTS[dv];
[0:a]atrim=duration=10[aa];
[0:a]atrim=start=20:end=30,asetpts=PTS-STARTPTS[ba];
[0:a]atrim=start=40,asetpts=PTS-STARTPTS[da];
[av][bv]concat[cv];
[aa][ba]concat=v=0:a=1[ca];
[cv][dv]concat[outv];
[ca][da]concat=v=0:a=1[outa]
" -map [outv] -map [outa] "G:\output.mp4"

Однако теперь я хочу иметь более точный контроль над временными метками обрезки и пробовал следующий код, который должен дать мне тот же результат, что и раньше

ffmpeg -i "G:\input.mp4" -filter_complex "
[0:v]trim=start=00:00:00.000:end=00:00:10.000[av];
[0:v]trim=start=00:00:20.000:end=00:00:30.000,setpts=PTS-STARTPTS[bv];
[0:v]trim=start=00:00:40.000:end=00:00:50.000,setpts=PTS-STARTPTS[dv];
[0:a]atrim=start=00:00:00.000:end=00:00:10.000[aa];
[0:a]atrim=start=00:00:20.000:end=00:00:30.000,asetpts=PTS-STARTPTS[ba];
[0:a]atrim=start=00:00:40.000:end=00:00:50.000,asetpts=PTS-STARTPTS[da];
[av][bv]concat[cv];
[aa][ba]concat=v=0:a=1[ca];
[cv][dv]concat[outv];
[ca][da]concat=v=0:a=1[outa]
" -map [outv] -map [outa] "G:\output.mp4"

Результат, который я получаю, является конкатенацией следующих 10-секундных частей входного видео в указанном порядке: 1-й, 1-й, 2-й, 3-й, 1-й, 2-й, 3-й, 4-й, 5-й

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

PS: при проверке кода удалите все разрывы строк и преобразуйте его в однострочный код

1 Ответ

0 голосов
/ 23 февраля 2020

Я понял.

Кажется, у метки времени не должно быть ведущих 00. Следующий код сработал для меня.

ffmpeg -i "G:\input.mp4" -filter_complex "
[0:v]trim=start=00.000:end=10.000[av];
[0:v]trim=start=20.000:end=30.000,setpts=PTS-STARTPTS[bv];
[0:v]trim=start=40.000:end=50.000,setpts=PTS-STARTPTS[dv];
[0:a]atrim=start=00.000:end=10.000[aa];
[0:a]atrim=start=20.000:end=30.000,asetpts=PTS-STARTPTS[ba];
[0:a]atrim=start=40.000:end=50.000,asetpts=PTS-STARTPTS[da];
[av][bv]concat[cv];
[aa][ba]concat=v=0:a=1[ca];
[cv][dv]concat[outv];
[ca][da]concat=v=0:a=1[outa]
" -map [outv] -map [outa] "G:\output.mp4"

Я думаю, что удаление конечных 00 - это ответ, но если кто-нибудь сможет уточнить это дальше, это будет оценено.

...