2

Я пытаюсь объединить несколько медиа-файлов. Каждый файл содержит видео и аудио. Мне нужно добавить бесшумные рамки на черном экране после каждого медиафайла (кроме последнего).

Я имею в виду file + gap + file + gap + file .

Я нашел очень полезный ответ здесь, но он работает только для аудио.

Затем я изменил команду. Это тоже работает, но без звука. Вот команда:

ffmpeg -i video-1489396334138.webm -i video-1-1489396340932.webm -i video-1489396346168.webm -f lavfi -i "color=c=black:s=640x480:r=25" \ -filter_complex " [3]trim=duration=3.932[g0];[3]trim=duration=3.168[g1]; [0][g0][1][g1][2]concat=n=5:v=1:a=0" output.webm

Я знаю, что это из-за a=0 . Но когда я изменяю его на a=1 , ffmpeg выдает ошибку:

[Parsed_trim_0 @ 0x4448080] Несоответствие типов носителей между выходной площадкой фильтра 0 Parsed_trim_0 (видео) и входной площадкой фильтра Parsed_concat_2 1 (аудио)

[AVFilterGraph @ 0x4447600] Невозможно создать обрезку ссылки:0 -> concat:1

Вероятно, это потому, что наш вход lavfi не содержит аудио. Итак, вопрос в том, как это исправить?

3 ответа3

0

Вам также нужно будет добавить и обрезать аудио сегменты, а также добавить аудио из исходного видео, т.е.

Добавьте -f lavfi -i anullsrc к входам.

Обрезать эти

[4]atrim=duration=3.932[a0];[4]atrim=duration=3.168[a1];

И добавьте все аудио в фильтр concat.

[0:v][0:a][g0][a0][1:v][1:a][g1][a1][2:v][2:a]concat=n=5:v=1:a=1

0

Как объединить видео с небольшим 4-секундным интервалом тишины между каждым, наложенным поверх изображения. pic.jpg:

#Create a silence.mp4 file with audio silence over any given image: 
#note this is all one line with the backslashes removed.
ffmpeg -loop 1 -i /home/youruser/pic.jpg -f lavfi \
    -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 4 \
    -c:v libx264 -t 4 -pix_fmt yuv420p -vf scale=480:320 -y silence.mp4

#transform silence.mp4 to silence.ts so that its type is 
#fluid and conforms to the original
ffmpeg -i silence.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts silence.ts

#loop over all the mp4 files numerically making sure '10' doesn't come before '2'
for f in $(ls ./*.mp4 | sort -V)
do
    #Transform all the given mp4 files to ts files.
    ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
    if [ $counter -eq 0 ]; then
        all_transport_files="$(basename $f.ts)"
    else 
        #inject the silence in between the previous and next
        all_transport_files="$all_transport_files|silence.ts|$(basename $f.ts)"
    fi
    #keep track of which one we're on, first is not like the others
    ((counter++))
    echo $counter
done

#final concate string with all videos in order, with silence between
concat_and_all_files="concat:$all_transport_files"

#Join all the ts files back together into output.mp4
ffmpeg -async 1 -i "$concat_and_all_files" -c copy -bsf:a aac_adtstoasc output.mp4

Вуаля, все ваши видео файлы разделены какой-то тишиной. Если это не работает для вас, вам нужно убедиться, что channel_layout, sample_rate, частота кадров и другие атрибуты одинаковы для всех видео и включают в себя silence.mp4. Аудио и видео кодек ад - это свалка пожаров запутывания и злоупотреблений со стороны людей, пытающихся устранить конкурентов из видеопространства.

0

Следуя предыдущим ответам, я запустил эту строку:

ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -f lavfi -i anullsrc -f lavfi -i "color=c=black:s=1920x1080:r=30" -filter_complex \
       "[3]atrim=duration=1[ga1];[3]atrim=duration=1[ga2];[4]trim=duration=1[gv1];[4]trim=duration=1[gv2];
        [0:v][0:a][gv1][ga1][1:v][1:a][gv2][ga2][2:v][2:a]concat=n=5:v=1:a=1" -strict -2 out.mp4

из-за моих входных файлов я должен был добавить дополнительный -strict -2, как предложено предупреждением от ffmpeg.

Поскольку мне это было нужно для многих видео, я написал скрипт на python, который называется ffmpeg:https://gist.github.com/marc-moreaux/87115abc57c36eb5a8bb46bc77e8a2ce

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