H.265/HEVC Video Encoding Guide

H.265/HEVC Video Encoding Guide
Contents
Getting ffmpeg with libx265 support
Viewing options
Rate control modes
Passing Options
Lossless encoding
Intra encoding
Setting Profiles
Final Cut and Apple stuff compatibility
Further Info
This guide focuses on the encoder libx265 which can offer around 25–50% bitrate savings compared to H.264 video encoded with libx264, while retaining the same visual quality. These gains will be most pronounced at resolutions of 1080p and higher.

See HWAccelIntro for information on supported hardware H.265/HEVC encoders.

Getting ffmpeg with libx265 support
ffmpeg needs to be built with the --enable-gpl --enable-libx265 configuration flags and requires x265 to be installed on your system. The Compilation Guides show you how to do that.

You can also download a static build, all of which bundle libx265.

Viewing options
You can list private options available in this encoder with ffmpeg -h encoder=libx265.

Rate control modes
Similar to x264, the x265 encoder has multiple rate control algorithms, including:

1-pass target bitrate (by setting -b:v)
2-pass target bitrate
Constant Rate Factor (CRF)
In this guide we are going to focus on CRF and Two-Pass encoding, as 1-pass target bitrate encoding is not recommended.

Constant Rate Factor (CRF)
Use this mode if you want to retain good visual quality and don’t care about the exact bitrate or filesize of the encoded file. The mode works exactly the same as in x264, except that maximum value is always 51, even with 10-bit support, so please read the H.264 guide for more info.

As with x264, you need to make several choices:

Choose a CRF. CRF affects the quality. The default is 28, and it should visually correspond to libx264 video at CRF 23, but result in about half the file size. CRF works just like in x264, so choose the highest value that provides an acceptable quality.
Choose a preset. The default is medium. The preset determines compression efficiency and therefore affects encoding speed. Valid presets are ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, and placebo. Use the slowest preset you have patience for. Ignore placebo as it provides insignificant returns for a significant increase in encoding time.
Choose a tune (optional). By default, this is disabled, and it is generally not required to set a tune option. x265 supports the following -tune options: psnr, ssim, grain, zerolatency, fastdecode. They are explained in the H.264 guide.
For example:

ffmpeg -i input -c:v libx265 -crf 26 -preset fast -c:a aac -b:a 128k output.mp4
This example uses AAC audio at 128 kBit/s. This uses the native FFmpeg AAC encoder, but under AAC you will find info about more options.

Two-Pass Encoding
This method is generally used if you are targeting a specific output file size and output quality from frame to frame is of less importance. This is best explained with an example. Your video is 10 minutes (600 seconds) long and an output of 200 MiB is desired. Since bitrate = file size / duration:

(200 MiB * 8388.608 [converts MiB to kBit; note: not 8192 as 1 kBit is always 1000 bit]) / 600 seconds = ~2796 kBit/s total bitrate
2796 - 128 kBit/s (desired audio bitrate) = 2668 kBit/s video bitrate
You can also forgo the bitrate calculation if you already know what final (average) bitrate you need.

Two-Pass Example
For two-pass, you need to run ffmpeg twice, with almost the same settings, except for:

In pass 1 and 2, use the -x265-params pass=1 and -x265-params pass=2 options, respectively.
In pass 1, output to a null file descriptor, not an actual file. (This will generate a logfile that ffmpeg needs for the second pass.)
In pass 1, you can leave audio out by specifying -an.
For libx265, the -pass option (that you would use for libx264) is not applicable.

ffmpeg -y -i input -c:v libx265 -b:v 2600k -x265-params pass=1 -an -f null /dev/null &&
ffmpeg -i input -c:v libx265 -b:v 2600k -x265-params pass=2 -c:a aac -b:a 128k output.mp4
Note: Windows users should use NUL instead of /dev/null and ^ instead of .

As with CRF, choose the slowest -preset you can tolerate, and optionally apply a -tune setting. Note that when using faster presets with the same target bitrate, the resulting quality will be lower and vice-versa.

Passing Options
Generally, options are passed to x265 with the -x265-params argument, as in -x265-params “keyint=1:lossless=1”. For fine-tuning the encoding process, you can therefore pass any option that is listed in the ​x265 documentation. Keep in mind that fine-tuning any of the options is generally not necessary, unless you absolutely know what you need to change.

Lossless encoding
Use the -x265-params lossless=1 option. Adding -crf 0 is not required.

You can verify lossless encoding by looking for x265 [info]: lossless compression ratio in the console output from your encoding command, or refer to the hash demuxer for verification.

Intra encoding
Use the -g 1 option for FFmpeg 4.3 and newer or if you’re using a build from the git master branch. Older versions must use -x265-params keyint=1.

Setting Profiles
Profiles can be set via the -profile:v option, similar to libx264. See a ​list of available x265 profiles.

Final Cut and Apple stuff compatibility
To make your file compatible with Apple “industry standard” H.265 you have to add the following argument -tag:v hvc1

Further Info
​x265 API documentation
​Netflix Tech Blog — A Large-Scale Comparison of x264, x265, and libvpx (​link to paper)
P. Hanhart et al., Subjective quality evaluation of the upcoming HEVC video compression standard (​PDF)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值