FFmpeg - 具有4个区域和不同播放时间的多个视频

时间:2018-05-24 18:23:40

标签: ffmpeg

我的视频如下

video   time
======= =========
Area 1:
video1a    0-2000
video1b 2500-3000
video1c 3000-4000

Area 2:
video2a  300- 400
video2b  800- 900

Area 3:
video3a  400- 500
video3b  700- 855

Area 4:
video4a  400- 500
video4b  800- 900

基本上这些是安全摄像头输出,应该显示在4个区域:

到目前为止,我有以下内容:

ffmpeg
    -i 1.avi -i 2.avi -i 3.avi -i 4.avi
    -filter_complex "
        nullsrc=size=640x480 [base];
        [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
        [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
        [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
        [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
        [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
        [tmp3][lowerright] overlay=shortest=1:x=320:y=240
    "
    -c:v libx264 output.mp4

但有两件事我不知道:

  • 以上仅适用于4个视频文件,我需要一种方法为每个区域添加额外的文件(例如video1b应该在相同区域的video1a之后的相应时间播放)
  • 如何为每个文件指定上面显示的开始/结束时间?

1 个答案:

答案 0 :(得分:1)

使用

ffmpeg
    -i video1a -i video2a -i video3a -i video4a
    -i video1b -i video2b -i video3b -i video4b
    -i video1c
    -filter_complex "
        nullsrc=size=640x480 [base];
        [0:v] setpts=PTS-STARTPTS+   0/TB, scale=320x240 [1a];
        [1:v] setpts=PTS-STARTPTS+ 300/TB, scale=320x240 [2a];
        [2:v] setpts=PTS-STARTPTS+ 400/TB, scale=320x240 [3a];
        [3:v] setpts=PTS-STARTPTS+ 400/TB, scale=320x240 [4a];
        [4:v] setpts=PTS-STARTPTS+2500/TB, scale=320x240 [1b];
        [5:v] setpts=PTS-STARTPTS+ 800/TB, scale=320x240 [2b];
        [6:v] setpts=PTS-STARTPTS+ 700/TB, scale=320x240 [3b];
        [7:v] setpts=PTS-STARTPTS+ 800/TB, scale=320x240 [4b];
        [8:v] setpts=PTS-STARTPTS+3000/TB, scale=320x240 [1c];
        [base][1a] overlay=eof_action=pass [o1];
        [o1][1b] overlay=eof_action=pass [o1];
        [o1][1c] overlay=eof_action=pass:shortest=1 [o1];
        [o1][2a] overlay=eof_action=pass:x=320 [o2];
        [o2][2b] overlay=eof_action=pass:x=320 [o2];
        [o2][3a] overlay=eof_action=pass:y=240 [o3];
        [o3][3b] overlay=eof_action=pass:y=240 [o3];
        [o3][4a] overlay=eof_action=pass:x=320:y=240[o4];
        [o4][4b] overlay=eof_action=pass:x=320:y=240"
    -c:v libx264 output.mp4

shortest选项应该应用于处理最后一次结束的流的叠加层。