HW H265 Constant Quality Profile

(Will Tschumy) #21

I’ll update and see. I did try cq in a previous iteration of my profile. The ffmpeg documentation is not exactly clear, but the NVidia documentation for their extension did mention crf vs cq for constant quality. Regardless, for most encodes, I can do an hour long show in about 10 minutes :slight_smile:

(Goose) #22

You can query ffmpeg for the list of available options for each encoder, here’s what shows for h264_nvenc

As you can see there are 2 options -cq (which is what we want, constant quality) and -qp (which is NOT what we want as that’s a constant quantizer which is pretty useless).

You may need to set -rc vbr also but it you can try it out with and without it and let me know how it goes.

-rc E…V… Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp E…V… Constant QP mode
vbr E…V… Variable bitrate mode
cbr E…V… Constant bitrate mode
vbr_minqp E…V… Variable bitrate mode with MinQP
ll_2pass_quality E…V… Multi-pass optimized for image quality (only for low-latency presets)
ll_2pass_size E…V… Multi-pass optimized for constant frame size (only for low-latency presets)
vbr_2pass E…V… Multi-pass variable bitrate mode
-rc-lookahead E…V… Number of frames to look ahead for rate-control (from -1 to INT_MAX) (default -1)
-surfaces E…V… Number of concurrent surfaces (from 0 to 64) (default 32)
-cbr E…V… Use cbr encoding mode (default false)
-2pass E…V… Use 2pass encoding mode (default auto)
-gpu E…V… Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any E…V… Pick the first device available
list E…V… List the available devices
-delay E…V… Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut E…V… When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr E…V… If forcing keyframes, force them as IDR frames. (default false)
-b_adapt E…V… When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
-spatial-aq E…V… set to 1 to enable Spatial AQ (default false)
-temporal-aq E…V… set to 1 to enable Temporal AQ (default false)
-zerolatency E…V… Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p E…V… Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop E…V… Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength E…V… When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq E…V… Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud E…V… Use access unit delimiters (default false)
-bluray-compat E…V… Bluray compatibility workarounds (default false)
-init_qpP E…V… Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB E…V… Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI E…V… Initial QP value for I frame (from -1 to 51) (default -1)
-qp E…V… Constant quantization parameter rate control method (from -1 to 51) (default -1)

(Will Tschumy) #23

Thanks for the above - I was pulling the commands from NVidia’s developer site - it seemed like it exposed a subset vs FFMPEG overall - I also noticed from some of the logs that hevc_nvenc is the new name for the encoder and that nvenc_hevc has been deprecated.

So I’ll try this modification to the encoding profile:

[MKV HVEC Constant Quality]
Description=WARNING: Handbrake Constant Quality encoding (25) with Nvidia HVEC.
order=ffmpeg, handbrake
ffmpeg-general=-threads 0 -hwaccel auto
ffmpeg-video=-ss 9 -c:v hevc_nvenc -cq 25 -rc vbr -map 0:v
ffmpeg-audio=-acodec ac3 -ab 192k -map 0:a
ffmpeg-audioac3=-acodec ac3 -ab 384k -map 0:a
handbrake-general=--decomb --denoise="weak" --loose-anamorphic --verbose=2 -T -O
handbrake-video=--start-at duration:3 -e x265 -q 18 
handbrake-audio=-E ffac3 -R auto -B 192 -D 0 -a 1,2,3,4,5
handbrake-audioac3=-E ffac3 -R auto -B 384 -D 0 -a 1,2,3,4,5

H265 way faster than MP4 normal
(Goose) #24

Vary the -cq numbers and see if the quality changes.

(Will Tschumy) #25

I did. I pushed it from 25 to 23. Marginally better. I think the vbr makes as much difference as the rest.

via Newton Mail

(Goose) #26

Try extremes like 5 or 40

(Will Tschumy) #27

I tried 18 and down - at that point there’s a very marginal savings in compression (300 megs on a 1.3gig file). 23 seems to be the right sweet spot for HEVC CQ.

(Kevin Mason) #28

If I understand the concepts here correctly with the last profile listed.
If I make -cq a larger integer, the compression is less efficient (i.e. larger file).
Does it make the encode any faster or degrade the video quality per se?

(Will Tschumy) #29

Yes. That’s right. It’s also a non-linear scale. The bigger the number, the bigger the file. If you know anything about handbrake or h264, cq20 is equivalent to cq23 in hevc. Thanks! Will.

(Will Tschumy) #30

The file is less complex, so it’s marginally easier to encode / decode. That said, you will notice a difference in video quality. If you record a lot of sports, or other fast motion content, you should skew lower. Good luck!

(Anders V Williams) #31

So first of all, great H265 profile, it performs very well with a Quadro card as the HW encoder source!

Second, I have been toying around with this profile and have been trying to create a H264 version of the dedicated encoder using ffmpeg, but have been having some syntax issues getting it to actually process, any chance you/anyone has been experimenting with this?

The reason behind the desire is to create a faster profile but with constant quality for shows that does not require long term storage like sports, jeopardy etc that will be watched once, perhaps twice and then will be gone for the most part, to save time on the nightly transcoding compared to longer term stored files like TV shows, movies etc.

(Will Tschumy) #32

Thanks - I totally understand the pain of trying to decode the ffmpeg commands - the documentation is… terse.

You want to replace HEVC_nvenc with h264_nvenc. Remember that the constant quality is different between 265 and 264. The “default” for 265 is 23, while the default for 264 is 20.

Hope this helps! WIll.

(Anders V Williams) #33

Thanks mate, I tried that, but it seemed fall back to the handbrake Cli option no matter how I twisted the syntax. I read a ton on the, as you say terse, documentation, so true btw!, and found a ton of info concerning the options for the h264_nvenc encoder that appeared to be different than those of the HEVC one in the current version(s) of ffmpeg

I can post a copy some test profiles tomorrow when I get a chance if you are up for helping with some troubleshooting to get the profile to work. At the moment I am relying on alterations of the builtin h264 profiles based on the libx264 encoder which certainly can utilize the HW acceleration, but I would like to build one purely built on the HW encoder a la the one you made for HEVC

(Will Tschumy) #34

Happy to try to help. One thing to start with is to open a command line and run “FFMpeg.exe -codecs”. That will show which codecs are available to you in FFMpeg.

For the handbrake failback, I know recent versions of Handbrake support nvenc, but am not sure if handbrakecli.exe can just be replaced. Will do a little more digging.

Thanks! Will.

(Anders V Williams) #35

Thanks mate, appreciate it,

As for the Handbrake fall back, the newest version of the GUI version does support NVENC, with great performance I might add!, however the fallback refers to pure CPU based x264 encoding with no HW enhancement at all.

Will get more details tomorrow and test some command line options as well.


Updated: (not allowed to post more than three replies in the same thread as new user :frowning: )

So I got the syntax to work, guess I was too tired to get it right initially, but this is how I got it to work by si,ply doing as you said and replace HEVC with h264 and keep the rest the same:

[MKV H264 NVENC Constant Quality]
Description=nVidia H264 NVENC Constant quality, varible bitrate
order=ffmpeg, handbrake
ffmpeg-general=-threads 0 -hwaccel auto
ffmpeg-video=-ss 9 -c:v h264_nvenc -cq 27 -rc vbr -map 0:v
ffmpeg-audio=-acodec libfdk_aac -ab 128k -map 0:a
ffmpeg-audioac3=-acodec libfdk_aac -ab 320k -map 0:a
handbrake-general=–decomb --denoise=“weak” --loose-anamorphic --verbose=2 -T -O
handbrake-video=–start-at duration:3 -e x265 -q 18
handbrake-audio=-E ffac3 -R auto -B 192 -D 0 -a 1,2,3,4,5
handbrake-audioac3=-E ffac3 -R auto -B 384 -D 0 -a 1,2,3,4,5

This runs with smooth the NVENC primary encoder,

One question though, do you know the syntax change for constant bitrates rather the vbr and quality based analysis, got a couple of scenarios where I would like to control the bitrate manually.

(Will Tschumy) #36

You can download version 1.2 of handbrakecli from here: HandBrake

It integrates nvenc_h264 and nvenc_h265. Maybe try to get Handbrake to do the same…

(Anders V Williams) #37

So been testing the HandBrakeCli with the updated version and it works with NVENC, do you have any knowledge about options or if it is possible to point to a exported .json file for configuration through the MCEBuddy profiles?

(Will Tschumy) #38

You should be able to pass it an exported json profile doc from Handbrake. I’d tweak the settings you want and then try that preset.

looks like there’s an option for --preset-import-gui which should do just that :slight_smile:

(Anders V Williams) #39

Hey man, the documentation for HandBrakeCli is so much better and easier to work with than for ffmpeg

Been toying around with the options and got to some pretty decent results with H265.

Having to cope with a lot of interlaced video sources from our cable channels I have had to tweak it to do decomb’ing and finding the right balance for the NVENC engines on my various cards and CPU’s.

This profile gives me about 90% engine performance on a I7-8700K with a nVidia 1060 GPU where the CPU does decoming and the NVENC engine all the video encoding between 240 and 300 fps with full CPU load for filters, filters removed it can push the frame rate up to 400+

Same profile on a I5-8400 nVidia Quadro P400 encodes around 190-250, no filters pushes into 300+

[Handbrake Cli 1.2.0 H265 - Quality 28]
Description=nVidia NVENC HW (H265) Quality Setting 28 + Decomb
handbrake-general=--loose-anamorphic --comb-detect=fast --decomb=mode=7 --verbose=2 --format av_mkv --subtitle 1,2,3
handbrake-video=--start-at duration:0 --encoder nvenc_h265 --encoder-preset slow --encoder-level 4.1 --quality 28 --vfr
handbrake-audio=--aencoder copy:aac --audio 1,2,3
handbrake-audioac3=--aencoder copy:ac3 --audio 1,2,3

If you push the NVENC preset to medium you gain little speed with the filters on due to CPU load being the bottleneck, you could theoretically run a separate encoding without decomb’ing to utilize the spare encoder capacity, filters removed the 1060 pushes frame rate in 550+, the P400 into 400+

Considering equipping the I5-8400 (the Plex server aimed at doing all the work eventually) with a P2000 card for the unlimited encoder streams for live transcoding for live TV while doing backend MCEBuddy encoding as well,

(Will Tschumy) #40

Hi Anders,

I’m getting comparable performance out of my rig, though your processor is a little newer. I will play with the Handbrake profile you shared – thanks!

I run MCEBuddy and the Plex Server on the same box – a i7 7700 with 16 gigs of ram, a GTX 1060, and an SSD. The only remote resource is the NAS where I store all of my plex recordings and media. This setup works pretty well for me –
in HD, it takes a hour long show takes roughly 10 minutes encode with the profile I shared. The space saving I get with H265 is great.

I used to run an Core i5 – but found that the hyperthreading was pretty impactful to overall performance. That said, this was before PMS had HW acceleration baked in – it may be possible to run a lower powered CPU now, with the exception
of the deinterlacing / decombing.

Thanks for sharing! Will.

Mail](https://go.microsoft.com/fwlink/?LinkId=550986) for Windows 10