这应该是非常简单的,但我找不到让它发挥作用的方法。
我希望 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.jpg
和audio.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,使用内置ffmpeg
AAC 编码器,您可以使用其他选项,例如 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
它保持一个打开的窗口,您可以在命令提示符下从批处理脚本运行相同的指令。
FFmpeg和AVCONV都会让你使用-c:a
为了-acodec
和-c:v
为了-vcodec
最终,但旧的说明在我使用的版本中运行良好。
注意:每次提交都有自己的特点。如果你的命令行无缘无故失败,尝试另一个构建或按照 fork 转到库,过去几年 FFmpeg 最活跃的开发人员都在这里。他们的转码工具已重命名AVCONV但您的批处理文件应该可以使用其中任何一个。
答案4
来自 ffmpeg 手册页:
ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...
正如您所发现的,infile 选项必须位于它们适用的 infile 之前。
然而,这不是一个错误,而只是一种可以指定适用哪些 infile 参数的机制。