本文目标:如何创建一个高质量的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. nginx配置及常见问题

    问题 1.openresty请求时,不能解析域名? openresty依赖配置里面的resolver 192.168.1.1; 2.文件上传是报错413 Request Entity Too Larg ...

  2. Android中调用系统所装的软件打开文件(转)

    Android中调用系统所装的软件打开文件(转) 在应用中如何调用系统所装的软件打开一个文件,这是我们经常碰到的问题,下面是我所用到的一种方法,和大家一起分享一下! 这个是打开文件的一个方法: /** ...

  3. linux命令详解:cat命令

    转:http://www.cnblogs.com/lwgdream/archive/2013/11/06/3409802.html 前言 cat命令用于读取文本文件,并且能够显示行号.特殊字符等. 使 ...

  4. shoppingCart.js

    ylbtech-JavaScript-util: shoppingCart.js 购物车脚本 1.A,JS-效果图返回顶部   1.B,JS-Source Code(源代码)返回顶部 1.B.1,m. ...

  5. JAVA中几种常见集合的使用实例

    Java.util.ArrayList(类): *;import java.util.*;public class CollectionTest{//List是一个能包含重复元素的已排序的Collec ...

  6. 解决svn锁定

    问题:今天去公司 svn-update的时候,报错svn:E155004,提示说什么locked 解决:svn cleanup解除锁定,然后就可以操作了. 原因:SVN 本地更新时,由于一些操作中断更 ...

  7. 在elasticsearch里如何高效的使用filter

    今天在做查询category的时候,遇到一个问题,查询出来的cateogry为food,fun的形式.但是我需要的只是food或者fun 不包含逗号. 开始想着在aggs后再做过滤,这样有些麻烦.遂在 ...

  8. .net平台 基于 XMPP协议的即时消息服务端简单实现

    .net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...

  9. Windows虚拟内存如何设置

    当我们在运行一些大型的软件,或者是刚刚退出游戏的时候经常会提示"你的虚拟内存过低"的提示,出现这种情况一般是:一:你的物理内存比较小,运行大的软件比较吃力:二:你运行了许多窗口或者 ...

  10. PS 不能使用移动工具 因为目标图层被隐藏怎么办

    photoshop任何图层都无法移动或者修改,提示目标通道被隐藏. 在ps任何图层都无法移动并且无法使用橡皮擦等修改工具,提示目标通道被隐藏.我看了下通道里面多了一个快速蒙版层(并且是被隐藏的),我打 ...