ffmpeg - 将音频文件与图像连接起来
问题描述
我正在尝试使用一个命令将多个音频文件和一个图像连接到一个视频文件中。我在目录中有 mp3 文件列表和播放列表文件 (.m3u)。
我设法做到了,但我的解决方案很糟糕:
- 读取播放列表文件并以 ffmpeg 所需格式创建新的 .txt
- 使用 .txt 将音频文件连接成 .mp3
- 将大音频文件和静态图像连接成视频
这会创建 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
错误
另一个问题是,我正在使用的系统在文件夹名称中有空格。我尝试使用 -i "concat:file1.mp3|file2.mp3|..." 但是我不能使用双引号来引用路径,所以我得到一个无效的参数错误。
非常感谢您的帮助。
解决方案
方法一: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
输入到 concat demuxer 的所有 MP3 文件必须具有相同的通道布局和采样率。如果它们没有,则使用-ac
and-ar
选项转换它们,因此它们都是相同的。
方法2:concat过滤器
更新:似乎有一个错误-shortest
不能使用 concat 过滤器(我一直忘记这一点)。请参阅上面使用 concat demuxer 的方法,或替换-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.mp3
,file2.mp3
, 和file3.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 输出文件的末尾移动到开头。这样可以更快地开始播放,否则必须先下载完整的文件。
推荐阅读
- c - 在多个 unsigned char 变量中输入十六进制值
- c - 我在指针数组和指向数组的指针之间与 openmp 的性能差异有什么问题?
- linux - 在使用 SQL Loader 加载的文件中使用时间戳
- c++ - 如何检查一个数字的不合理性
- ruby-on-rails - Rails 视图渲染在 DB 中获取子对象需要很长时间
- json - 通过 API 发布 JSON 数据并在 Django Rest Framework 中创建相关模型
- r - 尝试在 R 的 FOR 循环中运行 IF 语句
- python - 无法在默认的 mac python 设置中更新 numpy
- r - 使用列表在 R 中创建多个函数/不同的参数
- c# - 如何使用 dayOfYear 计算周数