Например, если видео длится 1 минуту, а аудио — 1 час. Зациклить видео на протяжении 1 часа звуковой дорожки.
Я использую это решение для зацикливания изображения по длине аудио.
ffmpeg -y -loop 1 -r 6 -i image.jpg -i audio.mp3 -shortest -c:v libx264 -preset ultrafast -tune stillimage -pix_fmt yuv420p -c:a copy output.mp4
Но это не работает для видео, замена image.jpg на video.mp4 даст ошибку no loop found
.
Для видео следует использовать опцию stream_loop.
ffmpeg -y -stream_loop -1 -i video -i audio.mp3 -fflags +shortest -max_interleave_delta 50000 -c copy output.mp4
Вам придется использовать самую последнюю версию ffmpeg (> Nov '17), так как в stream_loop была ошибка, исправленная совсем недавно.
Поскольку кодирование видео дорого с точки зрения времени и процессора, я использовал потоковое копирование. Для большинства видео это нормально. В противном случае вам придется перекодировать.
Изменить : еще одна ошибка, связанная с stream_loop, см. обходной путь ниже.
ffmpeg -stream_loop -1 -i 1.mp4 -c copy -v 0 -f nut - | ffmpeg -thread_queue_size 10K -i - -i 1.mp3 -c copy -map 0:v -map 1:a -shortest -y out.mp4
video
часть на video.mp4, видео воспроизводится до исходной длины и останавливается, в то время как звук продолжает воспроизводиться, видео просто останавливает последний кадр на всем протяжении.Что ж, теперь поведение по умолчанию текущего/последнего ffmpeg через:
c:\sbin\ffmpeg.exe -i "D:\video.m4s" -i "\audio.m4s" -c:v copy -c:a copy "D:\combined.mp4"
дополняет/зацикливает последний кадр видео до audio.length
=== video.length
.
Посмотрите, приемлемо ли это для вас.
Подробнее о поведении:
audio.length
< video.length
), то заполните звук тишиной, чтобыaudio.length === video.length
audio.length
> v ideo.length
), то дополните видео последним кадром этого видео, чтобыaudio.length === video.length
только густи