将音频文件与图像连接起来



我正在尝试使用一个命令将多个音频文件和单个图像连接成一个视频文件。 我有一个 mp3 文件列表和一个播放列表文件 (.m3u(。

我设法做到了这一点,但我的解决方案很糟糕:

  1. 读取播放列表文件并以 FFMPEG 所需格式创建新.txt
  2. 使用.txt将音频文件连接成.mp3
  3. 将大型音频文件和静态图像连接成视频

这创建了 2 个我必须删除的不必要的文件。


我尝试了不同的命令

ffmpeg -loop 1 -framerate 1 -i myImage.jpg -i file1.mp3 -i file2.mp3 -i file3.mp3 -filter_complex '[0:0][1:0][2:0]concat=n=3:v=0:a=1' -tune stillimage -shortest output.mp4

但是我收到Error initializing complex filters. Invalid argument错误

另一个问题是,im 正在处理的系统在文件夹名称中有空格。 我尝试使用 -i "concat:file1.mp3|file2.mp3|..."但是我不能使用双引号来引用路径,所以我得到一个无效的参数错误。

非常感谢您的帮助。

方法 1: concat demuxer

制作包含以下内容的input.txt

file 'file1.mp3'
file 'file2.mp3'
file 'file3.mp3'

运行ffmpeg

ffmpeg -loop 1 -framerate 1 -i myImage.jpg -f concat -i input.txt -filter_complex "[0]scale='iw-mod(iw,2)':'ih-mod(ih,2)',format=yuv420p[v]" -map "[v]" -r 15 -tune stillimage -map 1:a -shortest -movflags +faststart output.mp4

输入到连接解复用器的所有 MP3 文件必须具有相同的通道布局和采样率。如果他们不这样做,则使用-ac-ar选项转换它们,使它们都相同。


方法2:连接过滤器

更新:似乎有一个错误,-shortest无法使用concat过滤器(我一直忘记这一点(。请参阅上述使用连接解复用器的方法,或将-shortest替换为-t-t的值应等于所有三个 MP3 文件的总持续时间。

ffmpeg -loop 1 -framerate 1 -i myImage.jpg -i file1.mp3 -i file2.mp3 -i file3.mp3 -filter_complex "[0]scale='iw-mod(iw,2)':'ih-mod(ih,2)',format=yuv420p[v];[1:a][2:a][3:a]concat=n=3:v=0:a=1[a]" -map "[v]" -r 15 -map "[a]" -tune stillimage -shortest -movflags +faststart output.mp4

选项说明

  • 比例过滤器使图像具有均匀的宽度和高度,这是使用 libx264 输出 YUV 4:2:0 时所必需的。
  • 格式过滤器将色度子采样设置为 4:2:0,否则 libx264 将尝试限制子采样,但大多数玩家只能处理 4:2:0。
  • Concat 过滤器接受file1.mp3file2.mp3file3.mp3作为输入。您的原始命令试图将视频连接到音频,导致Invalid argument
  • -map "[v]"-filter_complex中选择视频输出。
  • -r 15将输出帧速率设置为 15,因为大多数播放器无法处理 1 fps。这比设置-framerate 15更快。
  • -map "[a]"-filter_complex中选择音频输出。
  • -map 1:a从输入 #1 中选择音频(计数从 0 开始的第二个输入(。
  • -movflags +faststart编码完成后,此选项会将一些数据从 MP4 输出文件的末尾移动到开头。这样可以更快地开始播放,否则必须先下载完整的文件。

最新更新