я использую следующую команду ffmpeg для генерации видео (15 с) из одного изображения

ffmpeg -loop 1 -i image.png -c:v libx264 -t 15 -pix_fmt yuv420p -vf scale=1280:720 out.mp4

Вторая команда берет /a видео и добавляет несколько оверлеев видео.

ffmpeg -i movie.m4v -vf "movie=movie.m4v, scale=140:-1[inner]; movie=movie.m4v, scale=100:-1[inner2]; [in][inner] overlay=70:70 [step1]; [step1][inner2] overlay=300:70 [out]" out.mp4

Кто-нибудь знает, как объединить эти две строки в одну команду?

1 ответ1

3

Только видео

Вы можете использовать один filtergraph для всей фильтрации.

ffmpeg -loop 1 -i image0.png -i video1.m4v -i video2.m4v -filter_complex \
"[0:v]scale=1280:-2[bg]; \
 [1:v]scale=140:-1,setpts=PTS-STARTPTS[fg1]; \
 [2:v]scale=100:-1,setpts=PTS-STARTPTS[fg2]; \
 [bg][fg1]overlay=70:70:shortest=1[ol]; \
 [ol][fg2]overlay=300:70,format=yuv420p[v]" \
-map "[v]" -movflags +faststart output.mp4
  • Фильтр мультимедийного источника movie не требуется.

  • setpts сбрасывает метку времени, поэтому она лучше работает с overlay.

  • Обратите внимание на самое shortest=1 в одном из оверлейных фильтров. В противном случае входное изображение будет зациклено навсегда. В качестве альтернативы вы можете использовать фильтр trim на входе изображения.

  • Действие overlay "конец файла" можно изменить с помощью eof_action .

  • Фильтр format установит совместимую выборку цветности для QuickTime и других дрянных плееров.

  • Когда кодирование закончено -movflags +faststart переместит некоторые данные в начало файла. Это полезно, например, если вы выводите на MP4, и ваши зрители будут смотреть через прогрессивную загрузку, например, из браузера.

С аудио

Предполагая, что оба видео имеют стереозвук, и вы хотите объединить звук из каждого видео в один стереофонический выход.

Пример 1

Этот пример поместит оба входных левых канала в выходной левый канал, а оба входных правых канала - в выходной правый канал.

ffmpeg -loop 1 -i image0.png -i video1.m4v -i video2.m4v -filter_complex \
"[0:v]scale=1280:-2[bg]; \
 [1:v]scale=140:-1,setpts=PTS-STARTPTS[fg1]; \
 [2:v]scale=100:-1,setpts=PTS-STARTPTS[fg2]; \
 [bg][fg1]overlay=70:70:shortest=1[ol]; \
 [ol][fg2]overlay=300:70,format=yuv420p[v]; \
 [1:a][2:a]amerge[a]" \
-map "[v]" -map "[a]" -ac 2 -movflags +faststart output.mp4

Пример 2

Этот пример поместит оба канала от первого входа в левый канал выхода, и оба канала от второго входа в правый канал выхода.

ffmpeg -loop 1 -i image0.png -i video1.m4v -i video2.m4v -filter_complex \
"[0:v]scale=1280:-2[bg]; \
 [1:v]scale=140:-1,setpts=PTS-STARTPTS[fg1]; \
 [2:v]scale=100:-1,setpts=PTS-STARTPTS[fg2]; \
 [bg][fg1]overlay=70:70:shortest=1[ol]; \
 [ol][fg2]overlay=300:70,format=yuv420p[v]; \
 [1:a][2:a]amerge,pan=stereo|c0<c0+c2|c1<c1+c3[a]" \
-map "[v]" -map "[a]" -movflags +faststart output.mp4

Пример 3

Если вы просто хотите получить звук с одного входа, просто добавьте опцию -map в приведенный выше пример видео (не нужно использовать amerge и pan):

-map 1:a -c:a copy

Также см

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