使用FFmpeg组合一张图像+一个音频文件制作一个视频

mat*_*teo 246 audio video ffmpeg images

这应该很简单,但我找不到让它工作的方法。

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

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

什么是可以做到这一点的正确命令行?

我试过:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi
Run Code Online (Sandbox Code Playgroud)

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

要么出现错误,要么得到一帧持续时间的视频文件。

我在谷歌上搜索并发现了十几种提议的解决方案(据说是针对同一个问题),但没有一个有效。

任何人都可以提出一个工作命令并解释其背后的基本原理吗?

mat*_*teo 206

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

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi
Run Code Online (Sandbox Code Playgroud)

在更一般的情况下,你的输入在哪里image.jpgaudio.wav是你的输入,你可以使用以下命令,改编自FFmpeg wiki

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
Run Code Online (Sandbox Code Playgroud)

这将使用libx264编码器并为您提供比上面使用的 MJPEG 编解码器更好的压缩。音频为 AAC,内置ffmpegAAC 编码器。

  • 为什么文件最终会比 [图像大小] + [音频文件大小] 大得多?我希望视频压缩会因恒定帧而变得疯狂吗? (13认同)
  • 使用`ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi` 这样效果更好!!!?!??!?! (6认同)
  • 太棒了,成功了。然而,给定 4MB mp3 和 200 KB jpeg,它创建了 100 MB 视频。显然,该文件不需要大于 4.2 MB。有什么办法可以提高效率吗? (2认同)
  • `选项最短(在最短输入中完成编码)不能应用于输入文件 image.jpg - 您正在尝试将输入选项应用于输出文件,反之亦然。将此选项移动到它所属的文件之前。` (2认同)
  • 这个答案目前正在元数据上[讨论](http://meta.stackoverflow.com/questions/316817/overly-zealous-editing-of-answer-what-to-do)。 (2认同)
  • 这取决于您使用的视频编解码器。如果您在我的示例中复制命令,我使用 mjpeg 作为编解码器,它分别压缩每个帧,因此它没有利用所有帧都相等的事实。此外,我认为即使是其他编解码器也会每隔一段时间重新编码整个帧,即每第 N 帧,因此您会得到一个小得多的文件,但仍然比图像+声音的大小大得多。他们这样做是因为 (a) 否则,即使您只想跳到最后一帧,解码器也需要从头开始读取整个文件,并且 (2认同)
  • @matteo 点击答案下的“编辑”,在右下角会有一个标记为“社区随便”的按钮,你可以切换它并保存 (2认同)
  • 对于第一个示例,我的经验与 http://superuser.com/a/1041823/16966 相同,必须将 `-shortest` 移到参数列表的末尾附近 (2认同)

PJ *_*net 55

更简单:

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 上获得高清音频:-)

  • `ffmpeg -r 1 -loop 1 -y -i 1.jpg -i 1.m4a -c:a copy -r 1 -vcodec libx264 -shortest 1.avi` 这应该是最好的答案,'__') 只花了编码需要 2 秒,其他答案花费了 10 多分钟,导致尺寸非常大 (5认同)
  • 更新版本适用于 Youtube。我以为它停留在 95%,但最终它起作用了。 (3认同)
  • 将此用于 .JPG 和 .MP3 以制作 MP4 - 完美运行。我从 JPG/MP3 创建的 FLV 似乎不起作用 - 这可能是根据之前的评论警告。 (2认同)
  • 惊人的!第二次更新适用于 YouTube (2认同)

小智 46

你正在做的方式更难比它必须是。FFmpeg 比您认为的要聪明得多——它知道您希望视频与音轨的长度相同。

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

pause
Run Code Online (Sandbox Code Playgroud)

唯一的属性,必须到指定是input filenames,在output codecsoutput filename(其中EO IPSO包括output container)。

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

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

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

命令 shell有一个开关cmd /k,用于维护一个打开的窗口,您可以在该窗口中在命令提示符下运行来自批处理脚本的相同指令。

FFmpegavconv最终都会让你使用-c:afor-acodec-c:vfor -vcodec,但旧指令在我使用的构建中工作正常。

Nota Bene:每个提交都有其特质。如果您的命令行无缘无故失败,尝试另一个构建通常会有所帮助 - 或者跟随分支到libav,FFmpeg 最活跃的开发人员在过去几年中一直在那里。他们的转码工具已重命名为avconv,但您的批处理文件应该可以与任何一个一起使用。

  • “没有输出可以具有奇数的高度或宽度属性” 不正确。将 pix_fmt 设置为没有色度子采样的内容,例如 rgb24 或 yuv444p,然后确保编解码器和容器支持它并且没有进一步的限制。关于pix_fmt,FFmpeg 不及智能;除非您另有说明,否则它假定 yuv420p(具有色度子采样)。 (2认同)
  • **嘿 Matteo**,是的,我确实执行了该代码,是的,它像宣传的那样工作。我敢肯定,有很多笨蛋会粗心大意地在没有测试的情况下做出这样的声明,所以我会尽量不要被冒犯:) 在下面的完整帖子中,我将提供指向 FFmpeg 控制台输出和 MediaInfo 的 Pastebin 链接输入文件和最终输出文件的数据。我的输入文件、我的批处理文件、我的输出文件都在 [免费下​​载](https://docs.google.com/folder/d/0BxafXIRt8NlPRk94QWd5aDBQdm8/edit) 的 GoogleDrive 上,如果您想对它们进行测试你的 FFmpeg 构建。 (2认同)

fgu*_*len 20

对我有用的版本:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4
Run Code Online (Sandbox Code Playgroud)

-shortest如果没有,请检查该选项必须位于输出文件的前面,否则我收到以下错误:

选项最短(在最短输入中完成编码)不能应用于输入文件 pic.jpg - 您正在尝试将输入选项应用于输出文件,反之亦然。将此选项移动到它所属的文件之前。解析输入文件 pic.jpg 的选项时出错。

  • 谢谢你。大多数其他答案对我不起作用(在 Alpine linux 上使用 ffmpeg)。这个答案有最短的命令,对我来说完美无缺。 (2认同)

Com*_*uid 8

从 ffmpeg 联机帮助页:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...
Run Code Online (Sandbox Code Playgroud)

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

然而,这不是错误,只是一种机制,您可以通过该机制指定适用于哪些 infile 参数。


Col*_*nic 5

这对我有用

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.mp3 -acodec copy -vcodec libx264 video.avi

我发现 vcodeclibx264创建的文件比mpjeg(10 MB 而不是 100 MB)小得多。

  • `-shortest` 是一个输出选项,在您使用它时可能会作为输入选项被忽略。 (2认同)

qwr*_*qwr 5

这是一个完整的解释:

ffmpeg -i image.jpg -i audio.mp3 -c:v libx264 -tune stillimage -c:a copy out.mp4
Run Code Online (Sandbox Code Playgroud)
  • -i image.jpg -i audio.mp3: 图像和音频输入

  • -c:v libx264: 使用 x264 编码视频。

  • -tune stillimage: x264 设置以优化视频以进行静态图像编码

  • -c:a copy:复制用于输入音频的编解码器。如果您想要不同的音频编解码器,您可以更改此设置。

我没有使用-loop 1-shortest-loop 1大大减慢编码并创建一个更大的文件。-shortest不应该使用,-loop 1因为那时视频将是一帧长。然而,YouTube 不喜欢只有一帧的视频(参见 PJ Brunet 的回答),所以这两个选项都应该使用。