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

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

要么我得到错误,要么得到一帧时长的视频文件。问题)都不起作用。

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

评论

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

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

声音格式不是问题,对声音进行转码有效

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

这比选择的答案要好,我进行了实验,速度很快,文件很小。.ffmpeg-y -i image.png -i audio.mp3 -c:复制结果。

#1 楼

命令行中选项的顺序很重要。以下示例适用于我的情况:在更一般的情况下,image.jpgaudio.wav是您的输入,您可以使用以下命令,改编自FFmpeg Wiki :

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


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

评论


文件为什么比[图像大小] + [音频文件大小]大得多?我希望视频压缩在固定帧的情况下变得疯狂吗?

– Alec Jacobson
2012年4月13日在7:01

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

– Matteo
2012年4月13日在10:43

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

– Wim
2013年12月16日,1:14

使用ffmpeg -y -i image.png -i audio.mp3 -c:复制result.avi效果更好!

–穆罕默德·乌默尔
2014年7月7日在6:07

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

–DavidPostill♦
16-2-14在8:42

#2 楼

您正在使其变得比必须的更加困难。 FFmpeg比您认为的要聪明得多,它知道您希望视频的长度与音轨的长度相同。

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

pause


您唯一的属性必须指定input filenamesoutput codecsoutput filename(其中eo ipso包括output container)。

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

输出尺寸是FFmpeg最常见的挂断之一;某些编解码器在输出尺寸上受到的限制比其他编解码器要严格,但是没有输出可以具有奇数个height或width属性。调试命令行的最佳方法是读取其生成的错误消息。它们非常具体-并且是FFmpeg最好的文档-但如果在阅读之前允许关闭窗口,则会浪费开发人员的辛苦工作。

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

FFmpeg和avconv最终会使您分别将cmd /k用于-c:a-acodec用于-c:v,但是旧的说明在我使用的版本中效果很好。

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

评论


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

– Matteo
2012年12月16日19:59

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

–patronanejo
13年1月5日,12:59

@ShinMuraoka Mine是Win-64 ffmpeg版本,编译于:2013年1月6日,在:16:16:53您的解决方案和@matteo解决方案都不适合我。另外,我从Google云端硬盘下载了文件,但未提供预期的输出(输出文件为黑色,仅包含音频)。请帮助我确定要使用的正确命令。

–coding_idiot
13年1月8日在17:47

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

–乔纳森·鲍德温
13年5月29日在2:49

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

–user153343
17年6月8日在13:23

#3 楼

更简单:

qmp12079q

FFmpeg会尝试自动选择最佳编解码器,具体取决于输出文件的扩展名。

更新:我注意到YouTube处理视频存在困难(卡住率为95%),我认为是因为只有一帧。我发现让YouTube满意的解决方案:添加更多框架。另外,我添加了ffmpeg -i ep1.png -i ep1.wav ep1.flv以保留音频质量。您需要-acodec copy或它永远循环。 (由于图像循环是无限的,因此它在最短的流(即音频)的末尾停止。)选项的顺序对于速度非常重要,因为按指定的顺序处理滤镜(等)。如果更改这些参数的顺序,结果将大不相同。

-shortest

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

评论


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

– PJ Brunet
2015年9月29日在2:50

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

–pperrin
2015年10月29日在14:37

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

–巴吉
16-2-28在10:24

ffmpeg -r 1 -loop 1 -y -i 1.jpg -i 1.m4a -c:a copy -r 1 -vcodec libx264 -shortest 1.avi,这应该是最好的答案,'__')仅用了2秒进行编码,其他答案则花费了超过10分钟的时间,导致尺寸非常庞大

– Kokizzu
19年11月8日在5:00

太棒了!第二个更新适用于youtube

–保罗
20-10-23在8:22

#4 楼

适用于我的版本:

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


如果没有,请检查选项-shortest必须位于输出文件的前面,但出现以下错误:

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

评论


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

– DannyB
17年7月6日在13:38

ffmpeg -loop 1 -y -i slide02.jpg -i slide02.aac-最短slide02.mp4#正是我所需要的

– zzapper
20年6月16日在18:32

#5 楼

在ffmpeg联机帮助页上:

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


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

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

评论


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

–user153343
17年6月8日在13:23

#6 楼

这对我有用




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

评论


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

– llogan
16 Feb 15 '21:55

#7 楼

这是完整的解释:

ffmpeg -i image.jpg -i audio.mp3 -c:v libx264 -tune stillimage -c:a copy out.mp4



-i image.jpg -i audio.mp3:图像和音频输入
-c:v libx264:使用x264编码视频。 :x264设置可优化视频以进行静态图像编码
-tune stillimage:复制用于输入音频的编解码器。如果您想要其他音频编解码器,则可以更改此设置。

我没有使用-c:a copy-loop 1-shortest大大降低了编码速度,并创建了一个较大的文件。如果没有-loop 1,请不要使用-shortest,因为视频将只有一帧。但是,YouTube不喜欢一帧视频(请参阅PJ Brunet的答案),因此应同时使用这两个选项。

评论


当我尝试使用此方法创建视频时,我的Movist版本(macOS视频播放器)只播放了一秒钟的视频,而我的VLC版本显示的是黑色背景,而不是背景图像。使用PJ Brunet方法创建的视频在VLC中可以正确播放,但是Movist中没有音频。我什至根本不需要背景图像,所以我最终使用了低分辨率的黑色背景来减少文件大小和编码时间:convert -size 256x144 xc:black /tmp/a.png;ffmpeg -loop 1 -i /tmp/a.png -i input.m4a -c:v libx264 -crf 51 -c:a复制-最短output.mp4。

–nisetama
20年4月13日在17:01

#8 楼

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

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


我只需要在几秒钟内添加一个duration参数( -t 10)。

评论


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

– llogan
16-2-15在21:51

#9 楼

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

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

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

#10 楼

已从PJ Brunet的答案中克隆出来:

#11 楼

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

评论


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

–neelsg
2014年7月22日在12:20

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

– llogan
16年2月15日在21:52

#12 楼

我结合了本文中提到的几个命令,包括-pix_fmt yuv420p,以确保它可以在Quicktime(Mac)上使用。

ffmpeg -loop 1 -y -i image.jpg -i music.mp3 -shortest -pix_fmt yuv420p output.mp4


对我来说,这在macOS上完美运行。

#13 楼

试试这个命令。对我有用。

-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"


评论


这是一个不完整的命令,可能无法正常工作。尽管我可以修复和调试您的命令,但我不会为您做任何工作,因此请编辑您的答案并自行修复。我还注意到您的视频尺寸不是matteo想要的。

–卡雷尔
16年5月24日在8:20