使用FFmpeg将一幅图像+一个音频文件合并为一个视频


183

这应该是微不足道的,但是我找不到使它正常工作的方法。

我希望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

我收到错误消息或获得一帧时长的视频文件。

我四处搜寻,发现了十个建议的解决方案(可能是针对同一问题),但都没有用。

有人可以提出有效的命令并解释其背后的原理吗?


我只是尝试了您的命令行,它按预期工作。您的问题可能出在声音格式上。对声音进行代码转换有效吗?
长颈鹿队长

“按预期”是指生成的视频与音频输入具有相同的持续时间吗?你玩过吗?它不是一帧长吗?
matteo

声音格式不是问题,可以对声音进行代码转换
matteo

我也遇到了一个参数问题,这花了我几个小时!太糟糕的是,帮助中未涵盖此类问题。gregoire.org/2009/12/05/fun-with-ffmpeg
Paul Gregoire

3
这比选择的答案好,我尝试和它的快速和文件大小小..ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
穆罕默德乌默尔

Answers:


145

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

ffmpeg -loop 1 -y -i image8.jpg -i sound11.amr -shortest -acodec copy -vcodec mjpeg result.avi

在更一般的情况下,您的输入是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

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


5
文件为什么比[图像大小] + [音频文件大小]大得多?我希望视频压缩在固定帧时会变得疯狂吗?
亚历克·雅各布森

2
这取决于您使用的视频编解码器。如果要在示例中复制命令,则我将mjpeg用作编解码器,它分别压缩每个帧,因此没有利用所有帧都相等的事实。另外,我认为即使是其他编解码器,也可能会不时地重新编码整个帧,即每第N个帧,因此您将获得一个更小的文件,但仍然远远大于图像和声音的大小。他们这样做是因为(a)否则,即使您只是想跳到最后一帧,解码器也需要从头开始读取整个文件,以及
matteo 2012年

2
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
2013年

2
使用ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi这个效果更好!!!!
穆罕默德·乌默

2
目前正在meta 上讨论此答案。
DavidPostill

41

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

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

pause

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

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

输出大小是 FFmpeg最常见的挂断之一。一些编解码器在输出尺寸上比其他编解码器受到更多限制,但没有输出可以具有奇数个height或width属性。

pause批处理文件末尾命令使CLI保持打开状态– 调试命令行最佳方法是读取其生成的错误消息。它们非常具体-并且FFmpeg拥有最好的文档-但是如果您在阅读它们之前允许关闭窗口,则会浪费开发人员的辛苦工作。

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

FFmpeg的avconv都将让您使用-c:a-acodec-c:v-vcodec最终的,但旧的指示正常工作在构建我使用。

Nota Bene:每个提交都有特质。如果您的命令行由于没有明显原因而失败,则尝试另一个构建-或遵循派生到libav通常很有帮助,FFmpeg最活跃的开发人员在过去的几年中一直在该位置。他们的转码工具已重命名为avconv,但您的批处理文件应与任一文件一起使用。


我所使用的版本必须与您的版本不同(如果您尝试过命令,并且按您描述的方式工作),因为正如我在问题中提到的那样,我已经尝试过完全相同的命令,并且获得了一段持续时间的视频1帧(几分之一秒),而不是音频文件的持续时间。我确实希望它是智能的,但是(在我的版本中)事实证明并非如此。
matteo 2012年

2
嗨,Matteo,是的,我确实执行了该代码,是的,它按公告的方式工作。我敢肯定,有很多混蛋会很粗心,以至于在不进行测试的情况下做出这样的声明,所以我会尽量避免冒犯:)在下面的完整文章中,我将提供指向FFmpeg控制台输出和MediaInfo的Pastebin链接。输入文件和最终输出文件上的数据。我的输入文件,批处理文件和输出文件位于GoogleDrive上,可以免费下载,如果您想针对FFmpeg版本对其进行测试。

@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53您的解决方案和@matteo解决方案都不适合我。另外,我从Google云端硬盘下载了文件,但没有得到预期的输出(输出文件为黑色,仅包含音频)。请帮助我确定要使用的正确命令。
coding_idiot

2
“没有输出可以具有奇数个高度或宽度属性”不正确。将pix_fmt设置为没有色度二次采样的值,例如rgb24或yuv444p,然后确保编解码器和容器支持它,并且没有进一步的限制。关于pix_fmt,FFmpeg不够智能。除非另有说明,否则假定为yuv420p(具有色度二次采样)。
乔纳森·鲍德温

那多张图片呢?我需要在特定时间将图像更改为另一张图像。我希望能够在命令行上为每个参数指定一个时间参数。

36

更简单:

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


另外,您的音频文件可能与您的.flv容器不兼容。在这种情况下,您应该尝试使用不同的(输出)容器,例如.webm,.avi或其他任何格式,直到找到与音频文件兼容的容器格式。
PJ Brunet

1
将此用于.JPG和.MP3来制作MP4-可以完美地工作。我从JPG / MP3创建的FLV似乎不起作用-可能与以前的注释警告相同。

2
更新的版本适用于YouTube。我以为它停留在95%,但终于奏效了。
巴斯基

得到了:No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)...这个有效的方法:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
NineCattoRules '17

那多张图片呢?我需要在特定时间将图像更改为另一张图像。我希望能够在命令行上为每个参数指定一个时间参数。

14

适用于我的版本:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

-shortest如果未检出,则该选项必须位于输出文件的前面,否则会出现以下错误:

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


谢谢你 其他大多数答案对我都不起作用(在Alpine linux上使用ffmpeg)。该答案具有对我无懈可击的最短命令。
DannyB

8

从ffmpeg联机帮助页:

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

如您所见,infile选项必须位于它们所应用的infile之前。

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


那多张图片呢?我需要在特定时间将图像更改为另一张图像。我希望能够在命令行上为每个参数指定一个时间参数。

4

这对我有用

ffmpeg -loop 1-最短-y -i image.jpg -i audio.mp3 -acodec复制-vcodec libx264 video.avi

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


1
-shortest是输出选项,使用时可能会被忽略为输入选项。
llogan '16

1

我试图做为@matteo,但没有音频,并且@Colonel Panic的解决方案效果最好:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

我只需要以秒(-t 10)为单位添加一个duration参数。


-shortest是输出选项,但您正在将其用作输入选项。将其移至输出文件之前,您可以消除-t 10,但答案将与其他答案几乎相同。
llogan '16

0

ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4


5
您能解释一下添加的命令如何工作吗?
neelsg 2014年

此答案与此处的其他简单“注释答案”没有太大区别。
llogan '16

0

如果有人要批量转换它们,请尝试此操作。

您可以设置输入和输出文件夹,还可以设置视频的格式。在这种情况下,我将其设置为AVI。

这个答案使用FFmpeg将一个图像+一个音频文件合并为一个视频,这对我很有帮助

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD

-1

试试这个命令。它为我工作。

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"

2
这是一个不完整的命令,可能无法正常工作。尽管我可以修复和调试您的命令,但我不会为您做任何工作,因此请自行编辑答案并进行修复。我还注意到您的视频尺寸不是matteo想要的。
卡雷尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.