HW Transcoding Performance Comparisons



Curious about HW Transcoding Performance of different video cards. Figured this might be a good place to start.

For comparison sake, we would need to specify:
CPU or GPU used: (cuvid for nvidia cards, qsv for intel hd integrated gpu on cpu, etc)
FFMPEG command line used.
Probably good to expose some random test video everyone can get access to to benchmark against? But then we'd need multiple video files if we wanted to test different scenarios, ie h264, h265 encodings, etc.

And what exactly do we use for the benchmark comparison numbers. What I've found as the easiest way to compare personally and maybe I'm completely misreading this, is the multiple it transcodes at. Ie, when I transcode using "ffmpeg -hwaccel cuvid -i test.mkv -c:v h264_nvenc -c:a copy -preset slow out.mkv" I end up with speed=8.57x on my quadro k2200, and speed=2.22x on my gtx 660 ti.

I also know by doing multiple transcodes a the same time, the speed generally halves. So only real point in doing multiple transcodes is doing 3 to test if your video card is limited to 2 transcodes as most gtx and quadro < k2000 are. Ie, my k2200 can transcode 8 streams at around x1, my gtx 660 ti is limited to 2 streams at 1x, 3rd stream throws an error because its limited to 2.

So in the interest of helping others with creating hw transcode threads, would it be beneficial to setup some standard benchmark and result thread here to get results from different video cards or does this already exist perhaps else where (even better!)?


Hey, I’d be down to do some testing and post results. We need to decide on command lines and sample files. I’m thinking it makes sense to test:

  1. H264 for Nvidia/AMD/Intel
  2. H265/HEVC 8-bit & 10-bit
  3. 4K HEVC 8 & 10-bit

It might make sense to also test without any hardware acceleration at all. At least in my experience 4K HEVC proves to be especially difficult on my hardware, so I’m hoping you would be agreeable to test against that as well. I’ve seen sample videos floating around either these forums or r/plex - you could probably get away with using the same so long as they are public-domain.


As was done with the NAS boxes, may I suggest http://jell.yfish.us/ for your controlled sources?


Nice link, thanks for that. Yea I don’t have any hardware that will do h265 yet either. I’ve been meaning to grab a p2000 or p4000, but since plex only supports encoding with them, I figure I’ll wait for prices to drop in the mean time. Also curious to know if a i7 8700k would be as good or faster. But a new CPU/mobo/ram combo would certainly be more expensive than a p2000 upgrade if I wanted to support h265.


I’d be willing to jump in on this and help compare. I’m just about to upgrade my server to a i7-7700K, and it also has a GTX 770.

On another note, I’ve been using Handbrake to software encode my library to HEVC using the “slow” preset for smaller file sizes to reduce space used on the RAID. I’m planning on comparing hardware vs. software as soon as I get it upgraded later this week. I’d be interested to see how Plex real-time encoding compares, as well.


What’s the command line you are using to do your conversion? Did you do a bunch of tests modifying the crf and presets before you settled on one with good video quality results?

Seems like in addition to coming up with a benchmark for the video cards and igpu’s, we need a standard to use for transcoding the media types. Probably want to parse the transcode logs to figure out what settings plex uses (and instructions so other folks can jump in with ease to help out with results without needing to do a bunch of discovery themselves). On the other hand, we are really trying to compare video cards to video cards, not different transcode quality speeds. So not sure if killing the crf/bitrate limiter would help speed up tests for providing results here. But I’m still learning, so probably best to use plex settings for the transcode tests.



Comparing video cards is out of scope for what Hardware Transcoding does on Linux. Yes, some have made it work but it’s not officially supported because we don’t have all the drivers from Intel yet (22-Dec-2017 is the announced release date) nor have we begun to consider support for card-based GPUs.

The most you can constructively expect from Linux is iGPU benchmarks.


@kyse said:
What’s the command line you are using to do your conversion? Did you do a bunch of tests modifying the crf and presets before you settled on one with good video quality results?

I’m essentially just using the default “H.265 MKV 1080p30” profile provided in Handbrake, which uses 22 RF (and the 720p30 profile which uses 21 RF for my 720p files). I modified it slightly to auto-detect English subtitles and audio tracks, and auto-passthrough the audio tracks. The default “H.265 MKV 1080p30” profile will down-convert all your audio to 2 channel aac, which saves space but is very undesirable! I found this out the hard way. I’ve linked them both here if you want to import them.


In Linux the command is:
nice -n 19 handbrake-cli -i <source file> -o <destination file> --preset-import-file "/path/to/HEVC1080pAutoPass.json"

I tested the conversion (using software encode only) on several TV shows and compared the before/after side-by-side and frame by frame. It was impossible to tell which one was HEVC, except on specific frame-by-frame shots where a very slight smoothing can be seen if you look extremely close at something with a lot of small detail. I don’t have any data on a QSV hardware encode, but from what I’ve read the hardware encodes will make bigger file sizes with the same quality settings as software. That’s the price you pay for encoding quickly. Once I install the new Kaby Lake CPU capable of hardware encoding HEVC I will test it out and report back.



Would you be able to help me determine the proper syntax to run plextranscoder from command-line? I am thinking something along the lines of:

PlexTranscoder.exe -benchmark -report -i c:\PLEX_TEST\jellyfish-90-mbps-hd-h264.mkv -c:v h264_mf -b:V 8000k -preset veryfast c:\PLEX_TEST\jellyfish-90-mbps-hd-h264_RESULT.mkv

But it looks like this plex EXE is not 1:1 ffmpeg. If I don’t specify any encoder or decoder to use I don’t get very far (Decoder (codec h264) not found for input stream #0:0). I would prefer to use NULL instead of creating any output but this also fails:

PlexTranscoder.exe -i c:\PLEX_TEST\jellyfish-90-mbps-hd-h264.mkv -f null - -benchmark

I would appreciate any insights.



I’m not Window savvy so cannot help you with that.

As for the Plex transcoder, it is based on FFMPEG with a bunch of extensions added.

The best way to figure out what you need is by letting PMS start the transcoder itself for a playback.
Next, Open and read the log file. The transcoder command line is logged for debugging purposes. Copy it out and use it appropriately.

There is no user-facing -benchmark option. Your best strategy is to invoke the transcoder as PMS would, reading from the input file, and writing to an output file.



Unfortunately the command line does not seem to be in the log file. I tried with and without verbose logging. Plenty of other detail but not what I am looking for.

Testing on the actual plex transcoder will make for a true apples-to-apples comparison; I am sure that this is possible. I think it would be great to get this working so that we can compare results on different hardware/software combinations and it would help users make hardware decisions.

Would you be able to consult with a colleague? Any way I can get in contact with a Dev or someone in QA?


The transcoder command line does show in the logs.

I just confirmed it. This is not a hardware transcoding session but should serve to tell you what to look for.

Dec 07, 2017 23:55:03.692 [0x7f2e39911700] DEBUG - Job running: EAE_ROOT='/share/CACHEDEV1_DATA/.qpkg/PlexMediaServer/Library/tmp/pms-9d692324-16ca-4134-99ad-c8d4346f767b/EasyAudioEncoder' FFMPEG_EXTERNAL_LIBS='/share/CACHEDEV1_DATA/.qpkg/PlexMediaServer/Library/Plex\ Media\ Server/Codecs/b077134-1269-linux-ubuntu-x86_64/' XDG_CACHE_HOME='/share/CACHEDEV1_DATA/.qpkg/PlexMediaServer/Library/Plex Media Server/Cache/' XDG_DATA_HOME='/share/CACHEDEV1_DATA/.qpkg/PlexMediaServer/Resources/' X_PLEX_TOKEN='xxxxxxxxxxxxxxxxxxxx' '/share/CACHEDEV1_DATA/.qpkg/PlexMediaServer/Plex Transcoder' '-codec:0' 'h264' '-ss' '0' '-noaccurate_seek' '-i' '/share/tv2/11.22.63/Season 01/11.22.63.S01E01.The Rabbit Hole.mkv' '-map' '0:0' '-codec:0' 'copy' '-map' '0:1' '-codec:1' 'copy' '-copypriorss:1' '0' '-f' 'dash' '-min_seg_duration' '5000000' '-skip_to_segment' '1' '-time_delta' '0.0625' '-manifest_name' '' '-avoid_negative_ts' 'disabled' '-map_metadata' '-1' '-map_chapters' '-1' '-movflags' '+faststart' 'dash' '-start_at_zero' '-copyts' '-vsync' 'cfr' '-y' '-nostats' '-loglevel' 'quiet' '-loglevel_plex' 'error' '-progressurl' ''



This is not a command line. Please humor me and try to run the above from shell. FFMPEG is OS agnostic: your command line in Ubuntu will be the same as a working command-line in Windows/OSX,etc.

Here is my log:

SessionReport version=“2” startTime=“0” startTimestamp=“Dec 09, 2017 15:13:09.841” key="/library/metadata/79290" session=“kq44ct90txlluagqba0nvzpv” transcode=“a9qi9vm2cejgk4ysq95wcow2”>
User id=“12616803” thumb=“https://plex.tv/users/2f219667655874c5/avatar?c=1511702933title="REDACTED@gmail.com" />
Player address=“” device=“Windows” machineIdentifier=“roodueezyro1af9bkrbl6jem” model=“7sp1” platform=“Konvergo” platformVersion=“” product=“Plex Media Player” remotePublicAddress=“” state="" title=“Will-PC” vendor="" version=“3.26.2” local=“0” userID=“12616803” />
Variant id=“9a750c75-b115-487a-b9d7-e06f78781e79” targetBitrate=“1673” context=“streaming” sourceVideoCodec=“h264” sourceAudioCodec=“aac” videoDecision=“transcode” audioDecision=“transcode” protocol=“http” container=“mkv” videoCodec=“h264” audioCodec=“opus” audioChannels=“2” transcodeHwRequested=“1” transcodeHwDecoding=“dxva2” transcodeHwEncoding=“mf” transcodeHwDecodingTitle=“Windows (DXVA2)” transcodeHwEncodingTitle=“Windows (Media Foundation)” transcodeHwFullPipeline=“0”>
Media audioProfile=“lc” id=“101010” videoProfile=“high” audioChannels=“2” audioCodec=“opus” bitrate=“1593” container=“mkv” duration=“2433308” height=“406” videoCodec=“h264” videoFrameRate=“24p” videoResolution=“SD” width=“720” selected=“1”>
Part audioProfile=“lc” id=“101141” videoProfile=“high” bitrate=“1593” container=“mkv” duration=“2433308” height=“406” width=“720” decision=“transcode” selected=“1”>
Stream bitrate=“1431” codec=“h264” default=“1” frameRate=“23.809999999999999” height=“406” id=“169259” language=“English” languageCode=“eng” streamType=“1” width=“720” decision=“transcode” location=“direct” />
Stream bitrate=“162” bitrateMode=“cbr” channels=“2” codec=“opus” default=“1” id=“169260” language=“English” languageCode=“eng” selected=“1” streamType=“2” decision=“transcode” location=“direct”

But the question is how to translate this into a functioning command-line, such as:

PlexTranscoder -codec:0 h264 -i c:\PLEX_TEST\jellyfish-90-mbps-hd-h264.mkv ‘-map’ ‘0:0’ ‘-codec:0’ ‘copy’ ‘-map’ ‘0:1’ -codec:1 ‘copy’ c:\PLEX_TEST\jellyfish-90-mbps-hd-h264_RESULT.mkv

The above fails with "unknown decoder ‘h264’ " - looking at your log I see there is an external FFMPEG library (“FFMPEG_EXTERNAL_LIBS=”), I don’t see this being used in my setup (at least from my logs)

In windows additional codecs are being stored here:

C:\Users\USERNAME\AppData\Local\Plex Media Server\Codecs\b077134-1269-windows-i386

These external codecs I am assuming are stored in a config file someplace? Do I need to specify the folder above in the command-line?


Just an FYI in case anyone wants to compare transcode performance on vanilla FFMPEG, I downloaded the latest FFMPEG for windows “ffmpeg-20171208-4678339-win64-static” I used the video files found here:


Command line:

ffmpeg.exe -i c:\PLEX_TEST\jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv -f null - -benchmark

Here are the files I’ve chosen and my results on a i7-4790(non-k):

jellyfish-90-mbps-hd-h264.mkv = 5.22x
jellyfish-90-mbps-hd-hevc.mkv = 2.59x
jellyfish-180-mbps-4k-uhd-h264.mkv = 2.13x
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv = 0.925x

Here is the command line to force DXVA HW acceleration:

ffmpeg -hwaccel dxva2 -i c:\PLEX_TEST\jellyfish-90-mbps-hd-h264.mkv -f null - -benchmark

My results on a RX570:

jellyfish-90-mbps-hd-h264.mkv = 4.8x
jellyfish-90-mbps-hd-hevc.mkv = 5.09x
jellyfish-180-mbps-4k-uhd-h264.mkv = 2.26x
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv = 1.87x


To run multiples at once under windows run something like this from command line:

START CMD /k C:\PLEX_TEST\ffmpeg-20171208-4678339-win64-static\bin\ffmpeg.exe -i c:\PLEX_TEST\jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv -f null - -benchmark

START CMD /k C:\PLEX_TEST\ffmpeg-20171208-4678339-win64-static\bin\ffmpeg.exe -i c:\PLEX_TEST\jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv -f null - -benchmark

-Note the extra return at the end is necessary. My results:

2 simultaneous runs of “jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv” =

CPU only: 0.49 (each, averaged)
DXVA (RX570): 1.11x each (exact result for both)

4 simultaneous runs of “jellyfish-90-mbps-hd-h264.mkv” =

CPU only: 1.555 (each, averaged)
RX570: 1.2275 (each, averaged)

-For the RX570 result above my CPU usage remained low (single digits) for the duration of the transcode. This indicates that there is no 2-stream limit like on certain Nvidia cards. I will do some testing on my 1080TI when I get a chance


Results on my other PC i7-4790K OC to 4.6GHz and Nvidia GTX 1080ti:

CPU results:

jellyfish-90-mbps-hd-h264.mkv = 6.28x
jellyfish-90-mbps-hd-hevc.mkv = 3.24x
jellyfish-180-mbps-4k-uhd-h264.mkv = 2.75x
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv = 1.22x

1080ti results:

jellyfish-90-mbps-hd-h264.mkv = 6.9x
jellyfish-90-mbps-hd-hevc.mkv = 10.4x
jellyfish-180-mbps-4k-uhd-h264.mkv = 4.03x
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv = 3.14x

4 simultaneous runs of “jellyfish-90-mbps-hd-h264.mkv”:

CPU only: 1.83x (each, averaged)
1080ti: 2.72x - each, same result for all 4

CPU usage remained low for the 1080ti test above, I am not sure I can rely on those numbers


Results on a laptop with i5-6300U


jellyfish-90-mbps-hd-h264.mkv = 2.36x
jellyfish-90-mbps-hd-hevc.mkv = 1.25x
jellyfish-180-mbps-4k-uhd-h264.mkv = 0.977x
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv = 0.399x

No appreciable difference when I try with quick sync enabled

C:\PLEX_TEST\ffmpeg-20171208-4678339-win64-static\bin\ffmpeg.exe -hwaccel qsv -i c:\PLEX_TEST\jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv -f null - -benchmark


Been messing around with this some, looks like you’re flags are only testing decode performance. Do we want to modify this to test transcoding? Only thing is I don’t think it’s possible to use -f null when transcoding, as the formatter wants an output container to transcode to which makes sense. Wonder if adding a destination will skew benchmarks since we now add a destination SSD/HDD possible bottleneck. Think the 4k hevc file will be big enough bandwidth to bottleneck on a HDD?


Figured I would add some numbers for my current Plex machine…

Xeon E5 2683 v3 (14 cores - 2.4 Ghz all core turbo - 3.0 Ghz single core turbo) I suspect (looking at Windows Task Manager) that these tasks aren’t using all 14 cores, so I’m going to be moving to an 8 core CPU soon with a higher clock. Fair warning for anyone looking to build a Plex machine with huge numbers of cores, it may not help as much as you’d think unless you have a lot of concurrent sessions.

jellyfish-90-mbps-hd-h264.mkv = 7.81x
jellyfish-90-mbps-hd-hevc.mkv = 2.66x
jellyfish-180-mbps-4k-uhd-h264.mkv = 3.55x
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv = 1.49x


@justinoes said:
Figured I would add some numbers for my current Plex machine…

Xeon E5 2683 v3 (14 cores - 2.4 Ghz all core turbo - 3.0 Ghz single core turbo) I suspect (looking at Windows Task Manager) that these tasks aren’t using all 14 cores, so I’m going to be moving to an 8 core CPU soon with a higher clock. Fair warning for anyone looking to build a Plex machine with huge numbers of cores, it may not help as much as you’d think unless you have a lot of concurrent sessions.

jellyfish-90-mbps-hd-h264.mkv = 7.81x
jellyfish-90-mbps-hd-hevc.mkv = 2.66x
jellyfish-180-mbps-4k-uhd-h264.mkv = 3.55x
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv = 1.49x

This is EXTREMELY helpful. I was looking at upgrading to a E5-2630v4 (10c/20t @2.2Ghz), thinking more threads would help. I’m currently using a 4c/4t E3-1225v5 (because I assumed incorrectly Dell would expose the intel gpu…it doesn’t). When prices on R430’s come down i might upgrade, but now I’m thinking with your data it’d be better to just get maybe a 8c/16T higher clock cpu. I don’t stream more than 3-4 things at once.