使用 FFMPEG 并排播放音频和视频

使用 FFMPEG 并排播放音频和视频

假设我有 3个视频文件和 2 个音频文件:v1.mp4,,,,,。v2.mp4v3.mp4a2.mp3a1.mp3

通常人们希望将音频“叠加”到视频上。

如果人们真正想要的是以下内容;

  • v1 播放,无音频
  • a1 播放音频,不播放视频
  • v2 播放,无音频
  • a2 播放音频,不播放视频
  • v3 播放视频,无音频

所有内容都合并在一个 mp4 中。我的尝试都失败了,要么音频合并到视频中,要么视频损坏,要么编码时间过长。

最后,我想将这些视频流与空白且没有视频的“中间”部分连接在一起。我试过了

  • 片段串联的复杂过滤器color=black。可以工作,但需要重新编码,而且速度很慢

    ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "
    color=black:s=1280x720:d=5[s1];
    color=black:s=1280x720:d=10[s2];
    color=black:s=1280x720:d=15[s3];
    [0:v][s1][1:v][s2][2:v][s3]concat=n=6:v=1:a=0[aout]" -map [aout] -y output.mp4
    
  • 从头开始创建一堆color=blackmp4 并使用合并文件。视频变绿并且时间框架出现问题。

    ffmpeg -t 60 -s 640x480 -f rawvideo -pix_fmt rgb24 -r 25 -i /dev/zero empty.mpeg
    ffmpeg -f concat -i mylist.txt -c copy test.mp4
    

(列表基本上是1.mp4,,,,)empty.mp42.mp4empty.mp43.mp4

  • 创建一堆只有静音的 mp3 并将它们合并在一起。

    ffmpeg -f concat -i mylist.txt -c copy test.mp4
    

(但 mylist 包含silence.mp3文件而不是empty.mp4每个文件之间)

答案1

下面的命令可以完成这个任务。它从头开始创建三个静音音频和两个黑色视频流,然后通过两个concat过滤器将它们与其他流合并。(假设所有输入的持续时间为 15 秒)。

ffmpeg -t 15 -f lavfi -i anullsrc -i a1.mp3 -t 15 -f lavfi -i anullsrc -i a2.mp3 -t 15 -f lavfi -i anullsrc -i v1.mp4 -f lavfi -i color=black:s=1280x720:r=25:d=15 -i v2.mp4 -f lavfi -i color=black:s=1280x720:r=25:d=15 -i v3.mp4 -filter_complex [0:a][1:a][2:a][3:a][4:a]concat=n=5:v=0:a=1[aud];[5:v][6:v][7:v][8:v][9:v]concat=n=5:v=1:a=0[vid] -c:v libx264 -c:a libmp3lame -map [vid] -map [aud] output.mp4

相关内容