ffmpeg
来减小视频的大小(自然而然,请尽可能将其最小化,因为我需要它在没有足够可用空间的移动设备上运行)?我忘了提到当视频可以使用字幕(* .srt或* .sub)时,我也想对其进行转换以适合转换后的视频文件的参数。
#1 楼
这个答案写于2009年。自2013年以来,一种比H.264更好的视频格式被广泛使用,即H.265(更好的压缩格式是相同质量,或者是相同尺寸时质量更高)。要使用它,请将libx264编解码器替换为libx265,然后通过增加CRF值来进一步推动压缩杆-增加例如4或6,因为H.265的合理范围可能是24到30。请注意,较低的CRF值对应更高的比特率,从而产生更高质量的视频。 ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4
要查看使用较旧的H.264格式应用的这项技术,请参见以下答案,为方便起见: >
通过将目标大小(以位为单位)除以视频长度(以秒为单位)来计算所需的比特率。例如,对于目标大小为1GB(1 GB,即8 GB)和10000秒的视频(2h46min 40s),请使用800000 bit / s(800kbit / s)的比特率:<
ffmpeg -i input.mp4 -b 800k output.mp4
可能值得考虑的其他选项是设置“恒定速率因子”,它降低了平均比特率,但保留了更好的质量。 CRF在18到24之间变化-比特率越低,比特率越高。
ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4
评论
第二个命令使用-crf 24拍摄了我拥有的255.3MB视频,并将其减少到72.7MB,而没有明显降低质量。有一个赞!
–帕特里克·罗伯茨(Patrick Roberts)
17年3月25日在18:14
令人印象深刻的是,将大约2G的视频减少到14MB,看起来仍然不错,这是第一个搜索结果,而这正是我想要的,谢谢!
–sinisterstuf
18 Mar 30 '18 at 12:20
可能需要注意的是,您现在可以使用libx265进一步减小大小。
– ZN13
18年4月13日在19:55
使用ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi。它将100mb的视频减少到9mb。。视频质量的变化很小。谢谢!
–alpha_989
18年5月23日在22:02
答案是好的,但我想指出另一个细节:某些设备(例如,旧平板电脑,树莓派1)可能不仅内存不足,而且处理能力较低。在这种情况下,您可能想通过-profile:v基线限制配置文件来限制解压缩的复杂性(如superuser.com/questions/371460/…所示)。另外-pix_fmt yuv420p具有良好的兼容性,并且-movflags + faststart允许较早启动。
–赫尔曼
19年1月1日在21:30
#2 楼
您提到要减少文件大小以适合移动设备上的更多视频,这也是我的用例。这里所有的答案都是为了降低压缩质量,但是没有人提到减小视频帧的大小。根据我的经验,它要快很多,比重新压缩要快3到5倍。有关更多信息,请参见ffmpeg文档。ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv
#3 楼
我测试了该问题的其他大多数建议答案。测试数据结论如下。这些是我测试过的建议答案:(BR)使用以下方法修改比特率:
ffmpeg -i $infile -b $bitrate $newoutfile
(CR)改变恒定速率因子,使用:
ffmpeg -i $infile -vcodec libx264 -crf 23 $outfile
(SZ)使用:
更改视频屏幕尺寸(例如,将其像素大小减小一半)
ffmpeg -i $infile -vf "scale=iw/2:ih/2" $outfile
(BL)使用以下方法将H.264配置文件更改为“基线”:
ffmpeg -i $infile -profile:v baseline $outfile
(DF)使用默认的ffmpeg处理,使用:
ffmpeg -i $infile $outfile
DATA
“大小”-转换后的视频相对于原始视频的像素大小百分比。
“ bitrate”-原始视频和转换后的视频的比特率。
“ definition”-视频的像素大小。
“ convert”-转换视频的时间,以秒为单位。
我使用建议的方法计算了(BL)的目标比特率。
===文件A-节点如何帮助推进Angular-Fnbixa7Ts6M.mkv ===
original BR CR SZ BL DF
-------- --- -- -- -- --
size 64152 kb 214% 76% 40% 83% 76%
bitrate 411 kb/s 883 313 165 342 313
definition 1920x1080 1920x1080 1920x1080 960x540 1920x1080 1920x1080
convert -- 648 509 225 427 510
===文件B-将GraphQL与角度一起使用_作者-Lee Costello-OGyFxqt 5INw.mkv ===
original BR CR SZ BL DF
-------- --- -- -- -- --
size 410301 kb 33% 109% 28% 143% 109%
bitrate 2687 kb/s 880 2920 764 3843 2920
definition 3840x2160 3840x2160 3840x2160 1920x1080 3840x2160 3840x2160
convert -- 2307 3188 1116 2646 3278
结论
(SZ)方法绝对是最快的方法。它快了2倍到4倍。对于高清视频,这可能是一个很大的问题,因为所有其他方法的转换时间都比视频的实际长度长!例如,(CR)方法需要53分钟才能转换21分钟的视频。
如果视频的分辨率大于将要显示的屏幕的分辨率,则(SZ)方法绝对是最佳方法它。例如,如果您的手机只能显示1080p图片,则向其发送3840x2160的视频只是浪费。最好将其大小减半至1080p。
一些建议的答案实际上增加了某些视频的大小。例如,(BR)方法将1080p样本的大小增加了一倍以上。但是,它确实使2160p尺寸缩小了三分之一。对于高清样本,(CR),(BL)和(DF)方法都增加了视频的大小。
正确(或最佳)答案
始终最好先将分辨率降低到目标显示器支持的最大分辨率。
如果想要进一步减小文件大小,这将取决于个人选择。您可以减少信息内容或增加压缩率。
如果您不担心的话,可以降低分辨率。
如果视频不包含快速动作场景中,您可能想降低帧速率。
如果只有强大的处理器,而空间是唯一的问题,则可以提高压缩率。
比特率是多种因素的结合。因此,仅告诉ffmpeg降低比特率可能无法获得所需的结果。
降低信息含量的另一种方法是降低色彩深度。尚未讨论如何执行此操作。
评论
@aleyam这完全取决于您要混合的内容以及顺序。以SZ开头并以CR结尾是有意义的。这是我在“正确(或最佳)答案”中提到的示例。您首先要降低分辨率,然后再提高压缩率。但是不同的组合或不同的顺序没有意义-例如在CR之后执行SZ。同样,某些方法会相互影响。例如,CR尝试动态改变帧比特率,而BR尝试保持其恒定。
– John Pankowicz
1月4日18:24
感谢您收集此数据。不幸的是,该基准将苹果与橘子进行了比较。 (1)方法DF没有为图片添加任何信息,因为它与方法CR相同,即使用libx264和CRF 23重新编码,即ffmpeg的默认设置。 (2)方法BL实际上不是压缩方法,并且由于其他不受控制的因素,输出大小(在任一方向上)都会变化。 [将H.264的“配置文件”降低为“基准”意味着确保与某些旧版硬件的兼容性-自H.264诞生15年以来,在2019年这几乎是没有必要的。]
–马兰
3月16日18:09
(3)BR实际上会应用恒定的比特率,因此,最终产生的比特率显然是您所要求的(大约)。如果您要求输入两倍的输入,那么输出两倍大就不足为奇了! [另外,请注意,建议不要编码为恒定的比特率,而应该执行2遍平均比特率编码,请参阅其他答案。](4)CR提供了有趣的数据点,但对于CRF仍然限制为一个任意值。同样的缺点是,如果您选择的目标质量高于输入的质量,那么您将获得更大的输出。
–马兰
3月16日18:12
(5)编码的运行时间与输入视频的(未知)帧数成正比,因此最好以比率(编码的运行时间)/(视频长度)或更佳地表示为帧每秒编码(因为不同的视频每秒具有不同数量的帧)。
–马兰
3月16日18:14
最后要说的是,如今,没有充分的理由要比H.264更好,更最新的H.265格式(或者,如果您有足够的耐心,甚至可以选择AV1)。
–马兰
3月16日18:18
#4 楼
除非您正在寻找特定的比特率,否则我建议您使用-crf
选项。如本文所述,它最常用于
x264
编码。在简而言之:恒定的速率因子(CRF)为23可以制作出DVD品质的电影(〜700MB-1GB),而较低的CRF值则可以产生更高的质量(文件较大)。
链接文章中的示例:
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
评论
请提供完整命令的示例,而不是链接到外部网站(有一天可能会中断:)
–杰克·伯格(Jake Berger)
18年8月25日在17:17
@Vicky Chijwani在上面的示例中提供了代码。这更适合发表评论,但这是我在此站点上的第一个活动。该链接对crf选项有更多说明,但并不需要使代码正常工作。
–汤姆·凯利
18年8月27日在12:05
这似乎不适用于网络视频/ html5视频。
–乔治
9月11日19:48
#5 楼
请注意,ffmpeg
在没有选项的情况下运行时似乎已经执行了一些优化,因此在尝试使用您不了解的设置或决定显式丢失信息之前,请尝试进行默认转换:ffmpeg -i input.mp4 output.mp4
就我而言,它降低了视频和音频的比特率(您可以通过在它们上运行
ffprobe
来检查和比较输入和输出文件),将700Mb的视频转换为60Mb的以下一种:看似相似的质量。评论
从4Gb到2Gb,谢谢!
–山姆·侯赛尼(Sam Hosseini)
19年5月6日在6:22
(从10Mo到1.2Mb,ffmpeg会自动将VP8中的视频转换为VP9)
– sodimel
19年8月16日在13:47
这使我的视频大小从10.8MB增加到14MB
– pjtnt11
19-09-20在23:16
到目前为止,最简单的答案。将其用于来自png的18s 4K视频中,结果尺寸减小了30%,而质量没有明显下降。
–乔什·哈布达斯(Josh Habdas)
19年11月29日在8:01
@ pjtnt11很高兴知道它并不总是有效的,感谢您的报告。
–Skippy le Grand Gourou
19年11月30日在10:55
#6 楼
我将40分钟的高清视频演示文稿从505MB压缩到183MB,就像从100MB→36MB压缩了一样。
原始视频是高清的,输出几乎没有明显的差异。
这是一个视频文件我想随身携带,但高清画质已经过头了。“
这是我使用的命令,其原因如下:
ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4
-n
:避免覆盖输出文件(更安全地进行测试然后进行批处理)-loglevel error
:显示错误并隐藏进度条和行-i inputfile.mp4
:输入文件名-vcodec libx264
:从上面的最高答案中轻扫-crf 28
:单次压缩,差异不大(“ 0 =无损,23 =默认,51 =最差;主观上合理范围是17–28“)ref docs -preset faster
:看起来比“ medium” ref docs的默认编码时间快2倍。-tune film
:指定输入为HQ视频(其他选项包括“卡通”,“静止图像”。)ref docs outputfilename.mp4
:输出文件名对于视频文件目录:
for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done
问题:
更干净的方式来收集“所有视频文件”,而无需在命令中包含所有扩展名
更干净的方式来输出没有“ cc”前缀的文件名,并且能够在删除之前确认视频
.webm
文件不适用于该命令。必须交换"cc${i}"
→"${i%.*}.mp4"
手刹是具有UI的开源替代品
评论
有用。但是要花很多时间有什么改进可以减少执行时间
–纳拉利
19年6月22日在6:08
#7 楼
如果您要针对特定的文件大小(或比特率)而不是特定的质量,则需要使用两次通过平均比特率编码(或简称为“ 2-pass ABR”)来使视频适合该大小简而言之,对于相同的比特率,它的质量要比单遍比特率编码的质量更好(如本答案所示),因为第一遍允许编解码器根据根据需要,即它可以在简单的帧上保留一些位,并有更多的空间可用于要求更高的帧上。相比之下,在单次通过模式下,编解码器无法提前知道即将发生什么,但仍必须强制执行受限的比特率。请参阅此博客文章(或该存档的文章)以获取启发性的解释,以及ffmpeg的有关更多综合方法的H.264 Wiki。
典型命令行:
ffmpeg -i <INPUT> -c:v libx264 -preset medium -b:v <BITRATE> -pass 1 -an -f <OUTPUT_CONTAINER> -y /dev/null && \
ffmpeg -i <INPUT> -c:v libx264 -preset medium -b:v <BITRATE> -pass 2 <AUDIO_OPTIONS> <OUTPUT>.<OUTPUT_CONTAINER>
您必须选择很多东西。
设置目标比特率,例如
1M
(1Mbit / s)或500k
(500kbit / s)。有关如何计算相关比特率的信息,请参见此答案。现在(2020年),您可能会用更新的
libx264
编解码器替换libx265
视频编解码器,从而在相同尺寸下提供更高的质量。请参阅ffmpeg的Wiki,了解如何使2遍选项适应该编解码器。设置所需的音频编码选项。例如,要使用Opus编解码器以128kbit / s的速率进行重新编码,请写
-c:a libopus -b:a 128k
(在2020年,我建议Opus优于其他有损音频编解码器,例如AAC)。但是,除非您知道自己在做什么,否则最好的选择可能是根本不重新编码音频,即编写-c:a copy
。这样,您甚至都不会打扰,音频也不会失去质量。无论如何,对音频进行重新编码通常并不会节省很多费用(许多狂野的音频流已经以约128kbit / s或以下的速率被比特化),并且在有视频流时,音频流的大小通常可以忽略不计。有关音频重新编码的更多准则,请参见此处。选择您喜欢的容器格式。最相关的(2020)是
webm
,mkv
和mp4
。#8 楼
我有一个最初为自己准备的菜谱,目的是将旧相机生成的Motion JPEG视频(它们是非常大的视频,因为每个帧都是整个JPEG图像)转换为h264。这是对其他类型视频(课程等)的改编。我不是在使用ffmpeg,而是在使用mplayer和mencoder。首先,我们必须使用mplayer对音频进行解复用:
mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
-vo null
和-ao null
参数告诉mplayer不要提取视频。在接下来的步骤中,我们将使用Mencoder进行3遍压缩。在第一遍中,我们将选择合适的“恒定质量模式”压缩(crf参数)作为起点:
mencoder <video> -ovc x264 \
-x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
-nosound -o video1.h264
您可以将slow_firstpass参数添加到-x264表示您对视频的最终质量抱有偏执。 Mencoder手册说,此选项禁用一些参数,“这些参数“显着提高了编码速度,而对最终通过质量几乎没有影响”。因此,请仅在最后一步使用它。请记住,随后的编码传递会提高您为crf选择的质量。
非常慢的预设的替代方法是较慢,较慢,中等等。有关完整列表,请参见mencoder手册。 “不确定我在这里是否做正确的事,但我将其设置为最大值,以便让编码人员完全自由地为每个场景选择正确的比特率。
第一个之后通过,您会注意到最后一行为您提供了下一步使用的平均比特率:
(...)
x264 [info]: kb/s:526.43
更改crf参数,建议在第一次通过,以在随后的遍历中需要比特率:
mencoder <video> -ovc x264 \
-x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
-nosound -o video2.h264
此第二遍编码将读取在第一遍生成的统计信息(
divx2pass.log
和divx2pass.log.mbtree
),以优化压缩。请注意,您将使用相同的视频输入,而不是生成的视频输入在第一次通过之前-“第一次通过”输出的视频仅用于检查初始质量。
请注意,
pass=3
(不是pass=2
)将生成一个新的统计文件,因此您可以重复最后一次的步骤多次想。我通常执行两次pass=3
,始终注意结果的比特率。同时,您也可以使用
lame
或oggenc
压缩音频:oggenc -q<n> <audio_pcm.wav>
最后,我们将重新混合音频和视频
mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
-of lavf -lavfopts format=mp4 -o <video>.mp4
-of lavf -lavfopts format=mp4
使用lavopts多路复用器生成mp4
文件格式。#9 楼
我写了一个bash脚本来减小视频大小并自动尝试不同的crf值。基本上,您将
选择一系列crf值
运行脚本
检查生成的视频的大小并选择您想要的一个
当您要达到大小限制并且不知道什么crf值可以使用时,这真的很方便。
我希望这会对某人有所帮助。我与同事共享,每个人都发现它很有帮助。
#!/bin/bash
# bigger values of crf will lead to a bigger compression (smaller video size)
#for i in 1 2 3 4 5
for i in {25..28}
do
# you can remove the option -y if you want to be asked if to overwrite a file with the same name (leave the -y only if you understand what you are doing, otherwise you might rewrite an important file)
ffmpeg -y -i NAMEOFTHEVIDEOTOCOMPRESS.mp4 -c:v libx264 -crf $i -preset veryfast -profile:v baseline -level 3.0 -strict -2 out_$i.mp4
printf "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Done compression at crf=$i \n\n"
done
#10 楼
这是2次通过的示例。相当硬的编码,但确实使
#!/bin/bash
ffmpeg -y -i "" -c:v libvpx-vp9 -pass 1 -deadline best -crf 30 -b:v 664k -c:a libopus -f webm /dev/null && ffmpeg -i "" -c:v libvpx-vp9 -pass 2 -crf 30 -b:v 664k -c:a libopus -strict -2 ""
受到挤压
评论
我还没有使用过它,但是ffmpeg手册页显示了-fs选项来限制输出大小,ffffeg -i in.avi -fs 100M out.avi是否可以工作?.avi不是主要问题。.avi只是一个容器。主要问题是您使用的是哪种编解码器。许多(大多数?)。avi vid使用的旧式编解码器(例如XviD)很好,但是与后代的编解码器相比,质量更高。.通常通过使用H.264视频压缩标准(例如,编解码器264)和音频的aac压缩来获得紧密编码。您使用的容器和编解码器取决于您和您的电话... .mp4容器是公认的。 (但是您的手机可以处理吗:请参阅此链接
@Kevin这需要更多参数进行转换。
如果过于繁琐,则可以使用Quicktime的后备选项,该选项的导出预设为480p等。
@ Wolfpack'08-当输入视频已经是同一命令的结果时,我看到第二个接受答案命令的大小增加了。因此:A-> B-> C,B比A小4至5倍;但是C比B大一点。