本文目标:如何创建一个高质量的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

参见 http://www.x264bluray.com/

网络视频

可以在输出选项中加上-movflags +faststart,可以在全部下载完成之前就可以开始播放。

艺搜参考

FFmpeg X264 H264编码指南[译]的更多相关文章

  1. ffmpeg与H264编码指南

    注:本文属于转载译文,原文地址:http://blog.csdn.net/vblittleboy/article/details/8982857. 英文地址:https://trac.ffmpeg.o ...

  2. FFmpeg的H264编码有内存泄漏吗??!!!

    靠,内存泄漏好严重.开始怀疑是自己代码问题,调试了半天,又反复改写和优化代码,还是泄漏严重. 拿网上现成的FFMPEG H264编码的范例来测试,同样泄漏很严重. 百度了一下,有很多人遇到同样的问题, ...

  3. ffmpeg x264编译与使用介绍

    问题1:我用的是最新版本的ffmpeg和x264,刚刚编译出来,编译没有问题,但是在linux 环境使用ffmpeg的库时发现报错error C3861: 'UINT64_C': identifier ...

  4. 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧

    前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...

  5. ffmpeg h264编码 extradata 为空

    ffmpeg h264编码的例子前面的文章已经介绍,本来主要讲述影响AVCodecContext extradata是否为 空的配置项.如果要求open编码器以后AVCodecContext extr ...

  6. JavaCV FFmpeg H264编码

    上次成功通过FFmpeg采集摄像头的YUV数据,这次针对上一次的程序进行了改造,使用H264编码采集后的数据. (传送门) JavaCV FFmpeg采集摄像头YUV数据 采集摄像头数据是一个解码过程 ...

  7. Java使用FFmpeg处理视频文件指南

    Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...

  8. ffmpeg+x264 Windows MSVC 静态编译

    尝试ubuntu和win下mingw编译版本,但都在Vistual Studio链接时因为依赖 libgcc.a, libmingw.a, libmingwex.a 会与mscrt 有符号冲突. 最后 ...

  9. iOS音频AAC视频H264编码 推流最佳方案

    iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1    功能概况 *  实现音视频的数据的采集 *  实现音视频数据的编码,视频编码成 ...

随机推荐

  1. yum安装openresty

    在群里看到春哥发的,先记录下来.一切都以官网为准,以后安装部署生态会越来越完善的. OpenResty 官方现在开始维护自己的打包虚机集合了,新的 linux 包仓库正在陆续登陆 openresty. ...

  2. Bluetooth篇 开发实例之十一 官网的Bluetooth Chat sample的bug

    当没有匹配的设备和没有找到可用设备的时候. // If there are paired devices, add each one to the ArrayAdapter if (pairedDev ...

  3. Visual Studio 插件开发资源

    微软官方MSDN 官方MSDN永远是最大而全的电子字典Visual Studio Software Development Kit ,不过它的资料虽然详细,但没有一定的基础的话直接使用它的话有点无从入 ...

  4. Android使用 SO 库时要注意的一些问题

    常和 SO 库开发打交道的同学来说已经是老生长谈,但是既然要讨论一整个动态加载系列,我想还是有必要说说使用 SO 库时的一些问题. 在项目里使用 SO 库非常简单,在 加载 SD 卡中的 SO 库 中 ...

  5. codeigniter与swfupload完整解决方案

    转自:http://blog.sina.com.cn/s/blog_6d8dc8eb0100s4bv.html codeigniter(简称ci)有研究了一段时间了,看重的是ci的轻量,便捷,最近公司 ...

  6. 利用PPPOE认证获取路由器中宽带账号密码

    前言 回家时买了一台极路由准备换掉家里老掉牙的阿里路由器,想进后台看一下宽带账号密码,咦???后台密码是什么来着??? 我陷入了沉思,家里的路由器一般都是pppoe拨号,而路由器在与pppoe认证服务 ...

  7. 安装dcm4chee-arc-light-5.4.1-mysql步骤

    一.进入网址: https://github.com/dcm4che/dcm4chee-arc-light/wiki/Installation 这个是GitHub上面给的步骤,可能会比较难理解,按照所 ...

  8. gzip解压和压缩

    我发现网上很少有这样完整例子,加上英文有不好,走了好多弯路.我现在把从网上找到例子帖出来,可以解压HTTP gzip的 #include <stdlib.h> #include <s ...

  9. Git历险记(一)

    [编者按]作为分布式版本控制系统的重要代表——Git已经为越来越多的人所认识,它相对于我们熟悉的CVS.SVN甚至同时分布式控制系统的 Mercurial,有哪些优势和不足呢.这次InfoQ中文站有幸 ...

  10. android:Cordova Android, hello Cordova ,PhoneGap android

    文章来自:http://blog.csdn.net/intbird 官方文档: http://cordova.apache.org/docs/en/5.0.0//index.html intbird的 ...