Ffmpeg зациклить видео, как?

Задача склеить 5 сек mp4 + минутный mp3

На выходе естественно получается 5 сек mp4 с музыкой. Как зациклить видео но при этом что бы mp3 не циклился не понимаю.
Сделал отдельно mp4 зациклив его так

printf \"file '%s'\n\" tmp.mp4 >> tmp/list.txt

Далее сама склейка

ffmpeg -f concat -i tmp/list.txt -c copy tmp/loop.mp4 -y


А вот уже потом клею mp3 и mp4

ffmpeg -i "loop.mp4" -i "file.mp3" -shortest "file_audio_video.mp4"


Проблема в том что минутный ролик соединяет 10 секунд примерно

Вопрос: как можно другими способами соединить mp3+mp4 зациклив mp4?
  • Вопрос задан
  • 1549 просмотров
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега PHP
♬♬
Возможно, mp4 не позволяет простой конкатенации файлов, поэтому при склейке он декодируется и снова жмётся.

Быстрее один раз разжать видео в .ts формат, который потом можно просто склеивать.
Делал похожее для сборки mp3+картинки в статичное видео.

Примерно так:
bash скрипт
#  из mp4 сделать ts
TMPVIDEO="tmp_video.ts"
ffmpeg  \
  -i "short.mp4"  \
  -bsf:v h264_mp4toannexb  \
  -an  \
  -f mpegts  \
  -y -hide_banner  \
  "$TMPVIDEO"

# до этого определить, сколько раз повторить фрагмент,
# чтобы покрыть длину mp3
REPEATS=5
LONGVIDEO="long_video.ts"
N=1
while [ $N -le $REPEATS ]; do
	ffmpeg -i "concat:$TMPVIDEO|$TMPVIDEO" \
	    -c:v copy \
	    -y -hide_banner  \
	    "$LONGVIDEO"

	local STATUS=$? ; if [ $STATUS -ne 0 ]; then return $STATUS; fi

	rm -f "$TMPVIDEO"
	mv "$LONGVIDEO" "$TMPVIDEO"
	local N=$[$N << 1]
	echo "N: $N"
done
# получили длинное видео с запасом

# подрезать длину, чтобы точно соответствовала
FFMPEG -i "$TMPVIDEO" \
  -c:v copy \
  -t $MUSIC_LENGTH \
  -y -hide_banner  \
  "$LONGVIDEO"


Потом остаётся собрать из аудио и видео общий файл. В mp4 аудио идёт в формате AAC. Для скорости можно заранее разжать mp3 в aac, заодно измерив точную длительность.
Ответ написан
Vapaamies
@Vapaamies
Разработчик будущей ОС для ПК размером 250 МБ
У ffmpeg есть параметр -loop, я использовал его в комментарии. Тот пример я тестировал перед ответом, а сейчас лень. Даю лишь наводку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы