FFmpeg视频转码技巧之-crf参数(H.264篇)
昨天,有个朋友给我出了个难题:他手上有一个视频,1080P的,49秒,200多兆;要求在确保质量的情况下把文件压缩到10M以内。
这是什么概念呢?按照文件大小10M来计算,码率是:10 x 8 / 49 = 1.6 Mbps。也就比VCD的质量略好一点(注:VCD的标准码率是1150 Kbps)。谈何“确保质量”?mission impossible啊!
咱还是现实一点吧。在不明显损失画质的前提下,看看使用FFmpeg能够帮到多少忙。用iPhone拍了一个1920 x 1080的视频,33秒,46.3 MB,编码格式是H.264。考虑到H.264目前尚是主流的视频格式,为了播放的兼容性,我们在使用FFmpeg转码时同样选择H.264。
命令行参数-crf
在优先保证画面质量(也不太在乎转码时间)的情况下,使用-crf参数来控制转码是比较适宜的。这个参数的取值范围为0~51,其中0为无损模式,数值越大,画质越差,生成的文件却越小。从主观上讲,18~28是一个合理的范围。18被认为是视觉无损的(从技术角度上看当然还是有损的),它的输出视频质量和输入视频相当。
我们的策略是,在保证可接受视频画质的前提下,选择一个最大的crf值——如果输出视频质量很好,那就尝试一个更大的值;如果看起来很糟,那就尝试一个小一点的值。
让我们先执行下面这条命令(关于FFmpeg运行环境的配置,请参阅这篇文章):
ffmpeg -i D:\src.mov -c:v libx264 -preset veryslow -crf 18 -c:a copy D:\dest1.mp4
意思是:将D盘的源文件src.mov,以“非常慢”的速度重新编码成H.264格式,保存为D:\dest1.mp4。其中,-preset指定的编码速度越慢,获得的压缩效率就越高。而-c:a copy又是什么意思呢?因为音频的码率一般都比较小,我们就不折腾它了,况且解码后重新编码也会损害音质,于是,就将音频数据从源文件中以原有编码格式直接拷入目标文件吧。
小提示:想知道-c:v 后面的参数值怎么填吗?或者说FFmpeg到底支持哪些音视频编码格式?执行ffmpeg –encoders看一下吧。另外,执行ffmpeg -i D:\src.mov -c:v libx264 -preset -tune D:\dummy.mp4可以看到-preset参数的取值范围,如下:
有个小疑问:既然不在乎等待时间,为什么不给-preset指定一个最慢的placebo呢?那是因为:与 veryslow相比,placebo以极高的编码时间为代价,只换取了大概1%的视频质量提升。这是一种收益递减准则:slow 与 medium相比提升了5%~10%;slower 与 slow相比提升了5%;veryslow 与 slower相比提升了3%。
另外,针对特定类型的源内容(比如电影、动画等),还可以使用-tune参数进行特别的优化。但如果你不确定该用哪个选项,还是忽略这个参数吧。
对比效果
执行完一条转码命令之后,调整-crf参数值,分别设为19、20、28、51,重新转码输出为不同的MP4文件。记录数据,对比如下:
|
源 |
crf = 18 |
crf = 19 |
crf = 20 |
crf = 28 |
crf = 51 |
文件大小(MB) |
46.3 |
36.7 |
31.2 |
26.5 |
7.95 |
1.25 |
缩减比率 |
21% |
33% |
43% |
83% |
97% |
尝试播放这些文件。发现crf取值为18~28的情况下生成的文件,其画质没有明显的差异,而以-crf 51生成的视频画质已经惨不忍睹了!在实际应用中,多试几个crf值,在画质和压缩比之间找到一个你能接受的平衡点即可。
参考文章:ffmpeg与x264编码指南
crf = Constant Rate Factor -preset取值范围:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo -tune取值范围:film,animation,grain,stillimage,psnr,ssim,fastdecode,zerolantency
https://blog.csdn.net/happydeer/article/details/52610060
FFmpeg视频转码技巧之-crf参数(H.264篇)相关推荐
- java用ffmpeg转码_java运用FFMPEG视频转码技术.doc
java运用FFMPEG视频转码技术 基于windows系统安装FFMPEG转码技术 软件特点: 被转视频基本不失真(支持超清.高清.标清): 转码速度比较现成转码软件快非常多(不管文件有多大,此软件 ...
- Android FFmpeg视频转码并保存到本地
本文讲述在Android中, 如何将FFmpeg视频转码为YUV格式并保存到本地. 首先,我们基于上一篇文章 基于Android Studio3.2实现ffmpeg最简单的例子 来进行配置. 配置好之 ...
- nodejs+ffmpeg视频转码
nodejs+ffmpeg视频转码 const context = require("../core/node_core_ctx"); const {spawn,exec} =re ...
- 【音视频数据数据处理 12】【H.264篇】解析H.264原始码流中的I帧 / P帧 / B帧数据(暂未解决,本文先放着,来日更新)
[音视频数据数据处理 12][H.264篇]解析H.264原始码流中的I帧 / P帧 / B帧数据 一.如何判断是 I帧 / P帧 / B帧 1.1 slice_type 1.2 slice_head ...
- 使用GPU硬件加速FFmpeg视频转码
最近看了些视频处理相关的文章,这里有一篇是讲如何使用Nvidia显卡为视频的编解码进行加速的, 为了方便查阅就转载了: 本文内容包括: 在Linux环境下安装FFmpeg 通过命令行实现视频格式识别和 ...
- Linux使用shell定时任务实现ffmpeg视频转码和截图
最近将.net core系统从windows 环境下迁移到linux中,使用docker容器部署.但是系统中使用了ffmpeg做视频转码和截图.在windows中只需要知道ffmpeg.exe的文件位 ...
- javaweb中ffmpeg视频转码h264出现卡住不执行的解决办法(看到最后面就是答案了)
郑文亮 专心地钻研编程,每天进步一点点 博客园 首页 新随笔 联系 管理 随笔-1610 文章-3 评论-570 Java+Windows+ffmpeg实现视频转换 最近由于项目需要,研究了一下 ...
- linux视频转码软件,Linux 下ffmpeg视频转码实战一安装
第一次接触ffmpeg这个软件,其实在我们的生活中他无处不在,由她制作的视频编辑播放软件有:QQ影音 射手播放器 等等.可以解析绝大部分的视频格式,转化成你想要的格式. 和ffmpeg一起的有三个软件 ...
- 解决ffmpeg视频转码后视频清晰度下降的问题
清晰度 Chrome不支持非h264编码的mp4视频播放,可通过ffmpeg将视频转码成h264编码: ffmpeg -i input.mp4 -vcodec h264 -b:v 0 output.m ...
最新文章
- 谷歌的硬件梦:Pixel手机、ChromeOS平板和Home音箱
- python老鼠打洞问题_脑筋急转弯:老鼠为什么要打洞?这答案让人哭笑不得
- [蓝桥杯2019初赛]修改数组-并查集
- Android 虚拟机与真机调试配置
- lol游戏挂机软件_六小时封停警告!lol手游海外服挂机惩罚力度太大引玩家吐槽...
- qt 3d迷宫游戏_《加雷利亚的地下迷宫与魔女的旅团》最新情报公布
- MySQL高级-SQL优化步骤
- DelphiXE10.4安卓编程初学者心得
- Lamp兄弟连Linux视频教程
- Auto Layout详解
- 快速获取知网,万方,维普等永久性免费下载权限
- 宿命论,三年前的演讲稿!,怀念那些力不从心的光景。。
- Namesilo转出域名到US Domain Center美国域名注册商
- Acrel-2000T无线测温产品方案介绍(安科瑞-须静燕)
- 大型网站--负载均衡架构
- 关于webpack5打包图片不报错但是也不显示问题
- WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)
- typora安装PicGo+配置腾讯云COS图床
- 模拟淘宝查看商品时图片的放大效果
- jenkin swindows启动_Windows环境下实现Jenkins自动化部署