使用 FFmpeg 将一张图片 + 一个音频文件组合成一个视频

使用 FFmpeg 将一张图片 + 一个音频文件组合成一个视频

这应该是非常简单的,但我找不到让它发挥作用的方法。

我希望 FFmpeg 将一张 JPEG 图像和一个音频文件作为输入,并生成一个与音频文件时长相同的视频文件(通过拉伸静止图像的整个时长)。

我不太关心输出时使用什么视频编解码器,但至关重要的是,我可以使用“复制”作为音频编解码器(即复制音频流而不对其进行转码)。

可以执行此操作的正确命令行是什么?

我试过:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

并尝试了很多有和没有的组合,,,,-s 640x360(人为地降低帧速率,希望视频更长)和-loop_input-shortest-t xxx-r 0.1-f image2

我要么收到错误,要么得到一个持续时间为一帧的视频文件。

我在 Google 上搜索并找到了十几个解决方案(据称是针对这个问题的),但都没有用。

有人可以建议一个可行的命令并解释其背后的理由吗?

答案1

命令行中选项的顺序很重要。以下适用于我的情况:

ffmpeg -loop 1 -i img.jpg -i audio.wav -shortest out.mp4

在更一般的情况下,其中image.jpgaudio.wav是您的输入,您可以使用以下命令,改编自FFmpeg 维基

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

这将使用libx264编码器,并根据其预设的音调为您提供更好的压缩。音频为 AAC,使用内置ffmpegAAC 编码器,您可以使用其他选项,例如 mp3,或者-c:a copy如果您希望避免重新编码音频。

答案2

甚至更简单:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

FFmpeg 将根据输出文件的扩展名尝试自动选择最佳编解码器。

更新:我注意到 YouTube 在处理视频时遇到困难(卡在 95%),我想是因为只有一帧。我发现让 YouTube 满意的解决方案是:添加更多帧。此外,我还添加了-acodec copy保留音频质量。您需要-shortest,否则它会永远循环。(它会在最短流的末尾停止,即音频,因为图像循环是无限的。)选项的顺序对于速度非常重要,因为过滤器(等)是按照您指定的顺序处理的。如果改变这些参数的顺序,结果会有很大不同。

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

还请注意,我设置了两次帧速率,这不是偶然的——第一次帧速率用于输入,第二次用于输出。如果你做得正确,视频每秒应该只有一帧,这意味着它编码速度相对较快。此外,我在这里将分辨率设置为 720p,这意味着你应该在 YouTube 上获得高清音频 :-)

答案3

你做到了方式更难比它必须的要长。FFmpeg 比你想象的要聪明得多——它知道你希望视频的长度与音轨的长度相同。

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

唯一属性要指定的是input filenames, 这output codecs,以及output filename(哪个就其本身而言包括output container,)。

当然,从与最终视频具有相同尺寸的静态图像开始是有意义的;如果你使用专用的图像编辑器而不是指定 FFmpeg 需要满足的输出尺寸,则需要确保输入的尺寸是偶数

输出大小为FFmpeg 最常见的问题之一;有些编解码器在输出尺寸方面比其他编解码器更受限制,但没有输出可以具有奇数的高度或宽度属性。

命令pause批处理文件末尾的命令保持 CLI 打开——调试命令行的最佳方法是阅读错误消息它生成。它们非常具体——也是 FFmpeg 拥有的最好的文档——但如果您在阅读它们之前关闭窗口,开发人员的辛勤工作就浪费了。

命令外壳有一个开关cmd /k它保持一个打开的窗口,您可以在命令提示符下从批处理脚本运行相同的指令。

FFmpegAVCONV都会让你使用-c:a为了-acodec-c:v为了-vcodec最终,但旧的说明在我使用的版本中运行良好。

注意:每次提交都有自己的特点。如果你的命令行无缘无故失败,尝试另一个构建或按照 fork 转到,过去几年 FFmpeg 最活跃的开发人员都在这里。他们的转码工具已重命名AVCONV但您的批处理文件应该可以使用其中任何一个。

答案4

来自 ffmpeg 手册页:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

正如您所发现的,infile 选项必须位于它们适用的 infile 之前。

然而,这不是一个错误,而只是一种可以指定适用哪些 infile 参数的机制。

相关内容