ffmpeg- python обрезка и конкат не работают - PullRequest
1 голос
/ 08 февраля 2020

У меня есть два файла: in.mp4 и outro.mp4.

Мне нужна очень простая вещь: обрезать in.mp4 до произвольной длины и конкатить outro.mp4 после нее.

Я могу сделать это без обрезки

import ffmpeg

main_video = ffmpeg.input('in.mp4')
outro = ffmpeg.input('outro.mp4')

v1 = main_video.video.filter("scale", size='hd720')
a1 = main_video.audio
v2 = outro.video
a2 = outro.audio

joined = ffmpeg.concat(v1, a1, v2, a2, v=1, a=1).node
v3 = joined[0]
a3 = joined[1]

out = ffmpeg.output(v3, a3, 'out.mp4')
out.run()

Но если я добавлю обрезку здесь:

main_video = ffmpeg.input('in.mp4').trim(start_frame=0, end_frame=1000)

Я получу эту ошибку:

ValueError: Обнаружена обрезка (end_frame = 1000, start_frame = 0) <17c7b86357e c> с несколькими исходящими ребрами с одинаковой восходящей меткой None; split фильтр, вероятно, требуется

, и если я пытаюсь сделать это здесь:

v1 = main_video.video.filter("scale", size='hd720').trim(start_frame=0, end_frame=1000)
a1 = main_video.audio.trim(start_frame=0, end_frame=1000)

Я получаю эти ошибки:

[Parsed_trim_2 @ 00000295587ca840] Media type mismatch between the 'Parsed_trim_2' filter output pad 0 (video) and the 'Parsed_concat_3' filter input pad 1 (audio)
[AVFilterGraph @ 00000295587cc800] Cannot create the link trim:0 -> concat:1

Как я могу решить это?

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете использовать trim фильтр для видео , atrim фильтр для аудио , и сократить оба на длительность :

import ffmpeg
#import subprocess

# Build synthetic video files (with audio):
##############################################################
# subprocess.run('ffmpeg -y -f lavfi -i testsrc=size=1280x720:rate=30 -f lavfi -i sine=frequency=500 -c:v libx264 -c:a ac3 -ar 22050 -t 100 in.mp4')
# subprocess.run('ffmpeg -y -f lavfi -i mandelbrot=size=1280x720:rate=30 -f lavfi -i sine=frequency=1000 -c:v libx264 -c:a ac3 -ar 22050 -t 10 outro.mp4')
##############################################################


main_video = ffmpeg.input('in.mp4')
outro = ffmpeg.input('outro.mp4')

# Assuming frame rate is 30 fps, 33.3 seconds applies 1000 frames.
v1 = main_video.video.filter('scale', size='hd720').filter('trim', duration=33.3)  # Use trim filter for the video.
a1 = main_video.audio.filter('atrim', duration=33.3) # Use atrim filter for the audio.
v2 = outro.video
a2 = outro.audio

joined = ffmpeg.concat(v1, a1, v2, a2, v=1, a=1).node
v3 = joined[0]
a3 = joined[1]

out = ffmpeg.output(v3, a3, 'out.mp4')
out.run()

Я проверил приведенный выше код, создав синтетические c видеофайлы (сгенерированные в закомментированной части).

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