FFmpeg X264 H264编码指南[译]
本文目标:如何创建一个高质量的H.264视频
x264 是一个 H.264 编码器.
通常有2种码率控制(rate control)模式:Constant Rate Factor (CRF) or Two-Pass ABR
码率控制是一种决定为每一帧分配多少比特数bits的方法,它将决定文件的大小和质量的分配how quality is distributed。
CRF恒定比率因子
目的是为了使整个文件达到特定的输出质量,而不关心文件大小;此方法在1pass时就可以提供最大的压缩效率。每一帧都得到了其需要的比特数,缺点是:不能得到一个特定大小的文件或者难以掌控比特率。
选择一个CRF值
量化规模quantizer scale的范围为 0-51( 针对8-bit),0 为无损,默认23,建议在18-28之间,18往往被认为从视觉上看是无损的。
CRF值每加6,bitrate码率大概减少一半;每次减6则会使码率增加一倍。
常用做法是:在质量可接受的情况下选择一个最大的CRF值,如果看起来不错,就尝试一个更大的值,如果看起来很糟糕,就降低CRF值。
选择一个预设preset
预设是一系列选项的集合,能够在编码速度和压缩率之间做出一个权衡,一个编码速度稍慢的预设会提供更高的压缩效率(压缩效率是以文件大小来衡量的)。
假如你想得到一个指定大小的文件或者想得到恒定的比特率,你可以采用一个较慢的预设值来获得更好的质量。
同样的,对于恒定质量编码模式,你可以通过选择一个较慢的预设轻松地节省比特率。
通常的建议是使用最慢的预设。
预设值按编码速度从大到小的顺序为:
ultrafast,superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
默认为medium(一般不用placebo )。
你也可以根据输入文件的特性选择-tune选项,其值如下:
film,animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency
如果你的输入文件是动画,则可以用animation。如果你想保留纹理,可以使用grain,如果不确定可以不设置。
另一个可选的参数是-profile:v,可以将输出限定到一个特定的H.264 profile,通常不用,除非目标设备仅支持某种profile.有如下可选值:
baseline, main, high, high10, high422, high444
注意-profile:v 与无损编码不兼容。
To list all possible internal preset and tunes:
ffmpeg -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 -
示例:
ffmpeg -i input -c:v libx264 -preset slow -crf 22 -c:a copy output.mkv
Two-Pass
如果你的目标是一个确定大小的文件而且帧与帧之间的视频质量并不重要,这个方法很适用。
例如:你的视频时长 10 minutes (600 seconds) 想要输出一个 50 MB大小的文件. 因为比特率= 文件大小/ 时长:
(50 MB * 1024*8 [converts MB to kilobits]) / 600 seconds = ~683 kilobits/s (全局比特率) 683k - 128k (期望的音频比特率) = 555k (视频比特率)
从而命令如下:
ffmpeg -y -i input -c:v libx264 -preset medium -b:v 555k -pass 1 -an -f mp4 /dev/null && \ ffmpeg -i input -c:v libx264 -preset medium -b:v 555k -pass 2 -c:a libfdk_aac -b:a 128k output.mp4
其中-an表示禁用audio,windows下请将/dev/null改为NUL
无损H.264编码
可通过-qp 0 or -crf 0实现,建议用-qp选项。因为8 bitx264和10 bitx264中的 crf 针对无损模式使用了不同的值。可同时配合2个有用的预设ultrafast 或 veryslow。
注意很多不基于FFmpeg的播放器可能不能解码无损压缩的视频。如果不兼容最好不要用无损编码。
示例一:(快速编码)
ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv
示例二:(高压缩比)
ffmpeg -i input -c:v libx264 -preset veryslow -qp 0 output.mkv
覆盖默认preset值
可通过x264opts 选项或x264-params,或libx264 私有选项,(参见ffmpeg -h encoder=libx264)。
一般不建议使用。
示例:
ffmpeg -i input -c:v libx264 -preset slow -crf 22 -x264opts keyint=123:min-keyint=20 -c:a copy output.mkv
用MediaInfo 艺搜下载 打开可以看到:

平均比特率; ABR (Average Bit Rate)
ffmpeg -i input -c:v libx264 -b:v 1000k output.mp4
对比较简单的画面,将用小于设定的比特率去编码,而对于复杂的画面,将进行高质量的编码,从而在整体上达到指定的码率,和2-pass一起用效果更好,同时也可以指定max bit rate防止码率产生大的波动。
常量比特率CBR (Constant Bit Rate)
没有原生的CBR模式,但可通过调整ABR参数进行模拟。
ffmpeg -i input -c:v libx264 -b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
-bufsize是一个“码率控制缓冲区”,它会在每一个有用的1835k视频数据内强制一个你所要求的均值(此处为4000k) 可以同时指定crf和max bit rate
ffmpeg -i input -c:v libx264 -crf 20 -maxrate 400k -bufsize 1835k output.mp4
这会有效地接近crf 20,但当输出超过400kb/s时,会降低crf的值。
通过-tune zerolatency可以达到低延迟Latency
视频兼容性
所有设备
如果想要最大兼容(比如老版ios或所有Android设备)
可以指定
-profile:v baseline -level 3.0
这将会关闭很多高级特性。
ios
| Profile | Level | Devices | Options |
|---|---|---|---|
| Baseline | 3.0 | All devices | -profile:v baseline -level 3.0 |
| Baseline | 3.1 | iPhone 3G and later, iPod touch 2nd generation and later | -profile:v baseline -level 3.1 |
| Main | 3.1 | iPad (all versions), Apple TV 2 and later, iPhone 4 and later | -profile:v main -level 3.1 |
| Main | 4.0 | Apple TV 3 and later, iPad 2 and later, iPhone 4S and later | -profile:v main -level 4.0 |
| High | 4.0 | Apple TV 3 and later, iPad 2 and later, iPhone 4S and later | -profile:v high -level 4.0 |
| High | 4.1 | iPad 2 and later and iPhone 4S and later | -profile:v high -level 4.1 |
Apple Quicktime
Apple Quicktime 仅支持采用 YUV 420 颜色空间编码(-pix_fmt yuv420p)的 H.264 影片,不支持高于main的profile.所以可以在baseline和main之间选择一个。
Blu-ray
网络视频
可以在输出选项中加上-movflags +faststart,可以在全部下载完成之前就可以开始播放。
艺搜参考
FFmpeg X264 H264编码指南[译]的更多相关文章
- ffmpeg与H264编码指南
注:本文属于转载译文,原文地址:http://blog.csdn.net/vblittleboy/article/details/8982857. 英文地址:https://trac.ffmpeg.o ...
- FFmpeg的H264编码有内存泄漏吗??!!!
靠,内存泄漏好严重.开始怀疑是自己代码问题,调试了半天,又反复改写和优化代码,还是泄漏严重. 拿网上现成的FFMPEG H264编码的范例来测试,同样泄漏很严重. 百度了一下,有很多人遇到同样的问题, ...
- ffmpeg x264编译与使用介绍
问题1:我用的是最新版本的ffmpeg和x264,刚刚编译出来,编译没有问题,但是在linux 环境使用ffmpeg的库时发现报错error C3861: 'UINT64_C': identifier ...
- 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧
前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...
- ffmpeg h264编码 extradata 为空
ffmpeg h264编码的例子前面的文章已经介绍,本来主要讲述影响AVCodecContext extradata是否为 空的配置项.如果要求open编码器以后AVCodecContext extr ...
- JavaCV FFmpeg H264编码
上次成功通过FFmpeg采集摄像头的YUV数据,这次针对上一次的程序进行了改造,使用H264编码采集后的数据. (传送门) JavaCV FFmpeg采集摄像头YUV数据 采集摄像头数据是一个解码过程 ...
- Java使用FFmpeg处理视频文件指南
Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...
- ffmpeg+x264 Windows MSVC 静态编译
尝试ubuntu和win下mingw编译版本,但都在Vistual Studio链接时因为依赖 libgcc.a, libmingw.a, libmingwex.a 会与mscrt 有符号冲突. 最后 ...
- iOS音频AAC视频H264编码 推流最佳方案
iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1 功能概况 * 实现音视频的数据的采集 * 实现音视频数据的编码,视频编码成 ...
随机推荐
- 四. Java继承和多态3. 继承中的方法的覆盖和重载
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...
- 韩国研发AI武器遭抵制,武器自带“头脑”将多可怕
禁止自主武器的开发,事实上并不妨碍人工智能技术的发展,也不妨碍其被正常用于军事领域,其中的关键就在于,人类是否拥有控制权,能否在关键时刻对其进行关闭. 文 |郑伟彬 转自新京报专栏 4月4日,全球超过 ...
- HTML基础一
正所谓温故而知新, 近期有了总结知识点的想法, 想把之前学习的知识作一个分阶段性的总结, 就从html开始吧!!! 一.浏览器与服务器 1. 浏览器 1.1 浏览器是什么 1.浏览器是一种交互软件(与 ...
- log4j教程 12、日志记录到数据库
log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库. JDBCAppender 配置: Property 描述 buff ...
- ES集群爆红,有未分配的片
curl GET http://192.168.46.166:9200/_cluster/health?level=indices curl -XPUT '192.168.46.166:9200/_c ...
- Highcharts使用二维数组生成图表
Highcharts使用二维数组生成图表 二维数组是更为灵活的一种数据存储方式.在Highcharts中.能够使用配置项column和rows二维数组.对于使用columns构建的二维数组,Highc ...
- Java BaseDao
BaseDao类: package dao; import java.sql.*; public class BaseDao { private static final String driver ...
- Linux组件封装(一)中互斥锁MutexLock的封装
本文对Linux中的pthread_mutex_t做一个简易的封装. 互斥锁主要用于互斥,互斥是一种竞争关系,主要是某一个系统资源或一段代码,一次做多被一个线程访问. 条件变量主要用于同步,用于协调线 ...
- react-native 极光推送(jpush-react-native)
极光推送官方支持的 React Native 插件 安装 npm install jpush-react-native --savenpm install jcore-react-native --s ...
- vue-router 重定向
1.从 /a 重定向到 /b const router = new VueRouter({ routes: [ { path: '/a', redirect: '/b' } ] }) 重定向的目标也可 ...