使用FFmpeg将JPG转换为MP4

26

我有320张尺寸为320x574的jpg图片,我用2004 fps记录了它们。我想把它们制作成.mp4视频。我在cmd(win7)中运行了以下代码,但它只制作了320号jpg的视频,如果我使用('*.jpg')而不是320,则不起作用。我真的很感激任何帮助。

ffmpeg -r 1/5 -i C:\data-Sam\320.jpg -c:v libx264 -r 30 -pix_fmt yuv420p C:\data-Sam\out.mp4

2004 帧每秒可以使您的视频长度为80/501秒(低于0.2秒)! - user1974640
6个回答

26

根据您的文件名,您可能需要:

ffmpeg -f image2 -i /path/to/file/image%3d.jpg test.avi

image%3d是针对文件名为image000.jpgimage001.jpgimage002.jpg等的文件。

如果您的文件名为image0.jpgimage1.jpgimage2.jpg等,则应使用/path/to/file/image%d.jpg

请参见FFmpeg image2解复用器示例


我的文件名从1.jpg到320.jpg排序。我需要更改它们还是仍然可以按原样使用。 - Sam
当我运行你留下的代码时,命令提示符中弹出了这个注意事项:“复用器不支持高帧率,效率不高。” - Sam
当我运行你留下的代码时,cmd 中弹出了一个注意事项:“复用器的帧率非常高,不支持高效处理。”并要求我使用其他复用器或 -vsync 2。实际上,我已经录制了包含 320 张 JPG 图像的视频,帧率为 2000 fps。我使用的代码是:ffmpeg -f image2 -i Path/To/File/filename%d.jpg -r 2000 -pix_fmt yuv420p path\to\result\test.mp4。你认为呢? - Sam
我正在Windows上使用FFmpeg二进制文件,但它在选项中不接受%d。 - Anupam Srivastava
尝试在Windows上做这件事,据我所知,它不起作用。我只得到了第一帧。 - Georgina Davenport
如果ls命令的文件顺序适合您,您也可以使用-pattern_type glob -i '*.jpg' - scai

13

我可以在这里给你展示一个例子,

ffmpeg -f image2 -r 60 -i path/filename%03d.jpg -vcodec libx264 -crf 18  -pix_fmt yuv420p test.mp4
  • f: 强制格式化
  • r: 帧率
  • i: 输入文件,假设你的文件名是filename001.jpg, filename002.jpg, ...
  • vcodec: 视频编解码器
  • crf: 固定码率(0-51)。17-18几乎无损。请参见Encode/H.264
  • pix_fmt:像素格式

7
您还有其他选择,例如:
  • framerate = Set the frame rate for the video stream. It defaults to 25
  • -r = set frame rate

    ffmpeg -framerate 10 -i Path/To/File/filename%3d.jpg -r 5 -y Path/To/File/test.mp4
    

1
如果它们都设置帧速率,-framerate和-r有什么区别? - Rusty Lemur

5

使用cat

最终,我想出了一个解决方案,就是使用 cat 命令获取一个 .mkv 文件,然后将其转换为 .mp4 格式。

导航到包含 .jpg 文件的文件夹。

cat *.jpg | ffmpeg -f image2pipe -i - output.mkv

然后

ffmpeg -i output.mkv -codec copy output.mp4

4

最主要的文件夹是 ffmpeg.exe,Your_files 文件夹和 Result 文件夹。
在 Your_files 文件夹中上传一系列图片。
Bat 文件将按名称顺序对它们进行排序。
制作好的视频将会在 Result 文件夹中。

echo off
color a
set a="Your_files\*.jpg"
set b="Result\video.mp4"
set c=ffmpeg
set f=-c:v libx264 -pix_fmt yuv420p -r 30 -crf 20
set tmp="Result\list.tmp"
for %%f in (%a%) do (@echo file 'file:%cd%\%%f' >> %tmp%)
%c% -y -f concat -safe 0 -i %tmp% %f% %b%
cd /d Result
del /f /q list.tmp
exit

-c:v libx264 - 我们将使用x264编解码器以MP4格式进行编码。
-loglevel 16 – 显示所有错误,包括可以恢复的错误。
-r 30 – 帧速率。它在所有过滤之后生效,但在编码视频流之前生效。
-crf 20 – 恒定比特率因子(CRF)是一种质量设置(和速率控制)。取值范围为0到51,较低的值会产生更好的质量,但文件大小也会增加。较高的值意味着更多的压缩,但在某个点上你会注意到质量下降。默认值为23。


1
非常好的答案和解释! - Feathercrown

-5
我正在Windows上使用ffmpeg二进制文件,但选项中不接受%d。
你正在使用cmd.exe,对吧?那就像这样做:
"file%d.jpg"

cmd.exe 使用 %PATH% 模拟真实 shell 中使用的 $PATH,因此会与 file%d.jpg 混淆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接