I had a 2080ti that I used to game on, but I hadn't been using it for a while, so I gave it to my nephew. Then I took a gamble on a SPARKLE Intel Arc A310 ELF. For just doing desktop stuff, it sounded good. It's got lots of connectors, powers itself from the PCI-E slot, and has all the latest hardware video accelerators including AV1 - plus a decent price. Just now I put the hardware encoder through some tests, and it went well!
So I've got a bunch of home movie files that I ripped way back, and they are encoded losslessly with FFV1, which means the file sizes are huge. That's okay for my offline-storage, but I wanted to reduce the file-size for my daily-drive (just a 2tb portable). So I picked a test file that was ~59 seconds long, and ~144MB (144579kb). Like I said, it's "25i" PAL video capture. ffprobe reports it as ffv1 (FFV1 / 0x31564646), yuv420p(tv, bt470bg/unknown/unknown, top coded first (swapped)), 720x576, 25 fps...
So as you can see in the logs below, I tested the hardware h264 encoder first, and tried a bunch of options that were reported via ffmpeg -h encoder=h264_qsv
, but it seems many of them did nothing (maybe because I was rendering non-HD video at near-lossless quality - so there maybe wasn't much to "optimise"). Then I tried the hevc(h265) HW encoder, and then the av1 HW encoder. Then I was asking chat-gpt about making the files "snappier", hence I did some stuff with keyframes. It also told me I should be deinterlacing, which I tested at the end.
At the same time I was testing the first 8 seconds of each video with this "video quality prediction model" I found: https://github.com/Telecommunication-Telemedia-Assessment/bi…
… gives the quality of the video sequence on a mean opinion score (MOS) scale between 1 and 5, where 1 corresponds to bad and 5 corresponds to excellent.
TLDR for deinterlaced 50fps video: {-vf yadif=1
}
- "Reference quality" with software encoder, {
-c:v libx264 -crf 1
} transcoded at 240fps, filesize 220MB, quality = 3.40.
(FYI, I have a 5950x, but I used ffmpeg defaults, so I don't know if it used the CPU "fully") - With "lossless" HW H264, {
-c:v h264_qsv -global_quality 1
} transcoded at 740fps, filesize 59MB, quality = 3.17. - With "near-lossless" HW H264, {
-c:v h264_qsv -global_quality 16
} transcoded at 725fps, filesize 33MB, quality = 3.15. - With "lossless" HW AV1, {
-c:v av1_qsv -global_quality 1
} transcoded at 690fps, filesize 32MB, quality = 3.34.
So I went with the AV1 encoder because it is very fast, has much improved compression, and only a small "quality" loss. When I ran it all the files, the GPU chugged along at 70% usage, pulled ~20watts, and sat at about 55C. And at the end of it all, it had turned 192GB of lossless 25i in to 46GB of near-lossless 50p video. A great result in my opinion!
# libx264 = software h264 encoder. libx265 = SW h265 aka HEVC.
# ??_qsv = ["Intel Quick Sync Video"](https://trac.ffmpeg.org/wiki/Hardware/QuickSync) HW encoders
libx264--crf_0,preset_slow,tune_grain fps=175 Lsize= 155,675KiB
libx264--crf_0,preset_slow fps=191 Lsize= 155,675KiB ~ qual = 2.879366373285043
libx264--crf_0,preset_veryslow fps= 76 Lsize= 155,633KiB ~ qual = 2.879174524776416
libx264--qp_0,preset_slow fps=190 Lsize= 155,675KiB
libx264rgb--crf_0,preset_slow fps= 93 Lsize= 424,024KiB
libx265--preset_slow,lossless_1,keyint_1 fps= 49 Lsize= 195,179KiB
libx265--preset_slow,lossless_1 fps= 40 Lsize= 208,084KiB
libx265--preset_medium,lossless_1,keyint_1 fps= 55 Lsize= 195,216KiB
libx265--preset_faster,lossless_1,keyint_1 fps= 59 Lsize= 195,275KiB
x264_qsv--defaults fps=610 Lsize= 8,736KiB ~ qual = 2.1937952301291945
x264_qsv--q_25 fps=639 Lsize= 9,350KiB ~ qual = 2.260815135784002
x264_qsv--q_31 fps=583 Lsize= 7,141KiB ~ qual = 1.5984725593807805
x264_qsv--q_2 fps=535 Lsize= 71,865KiB ~ qual = 2.9371376463359278
x264_qsv--global_qual_2 fps=579 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_25 fps=622 Lsize= 10,976KiB ~ qual = 2.494614096232868
x264_qsv--global_qual_25,look_ahead_1 fps=625 Lsize= 10,976KiB ~ qual = 2.494614096232868
x264_qsv--global_qual_2,look_ahead_1 fps=543 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_2,look_ahead_1,preset_slow fps=486 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_4,look_ahead_1,preset_slow fps=540 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_8,look_ahead_1,preset_slow fps=561 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_8,look_ahead_1_5,preset_slow fps=565 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_8,look_ahead_1_5,preset_0 fps=561 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_8,look_ahead_1_5,preset_3 fps=507 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_8,look_ahead_1_5,pre_3,scene_3 fps=532 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_8,look_ahead_1_5,pre_3,scene_4 fps=522 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_8,look_ahead_1_5,pre_3,scene_5 fps=483 Lsize= 46,459KiB ~ qual = 2.887756633831109
x264_qsv--global_qual_8,look_ahead_1_5,scene_5 fps=517 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_8,look_ahead_1_25,scene_5 fps=567 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_8,look_ahead_1_100,scene_5 fps=553 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_8,scene_5 fps=510 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_8,scene_4 fps=575 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_8,scene_3 fps=482 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_8 fps=518 Lsize= 46,476KiB ~ qual = 2.8877787816043936
x264_qsv--global_qual_12 fps=494 Lsize= 41,808KiB ~ qual = 2.880873323015015
x264_qsv--global_qual_13 fps=560 Lsize= 37,351KiB ~ qual = 2.8492832295158426
x264_qsv--global_qual_14 fps=600 Lsize= 32,431KiB ~ qual = 2.8303869962206862
x264_qsv--global_qual_15 fps=611 Lsize= 28,208KiB ~ qual = 2.779349466997285
x264_qsv--global_qual_16 fps=583 Lsize= 24,624KiB ~ qual = 2.729988182620431
hevc_qsv--global_qual_2 fps=480 Lsize= 42,534KiB ~ qual = 2.9129809435198224
hevc_qsv--global_qual_8 fps=477 Lsize= 42,534KiB ~ qual = 2.9129809435198224
hevc_qsv--global_qual_12 fps=505 Lsize= 39,197KiB ~ qual = 2.6911284571138467
hevc_qsv--global_qual_16 fps=595 Lsize= 24,434KiB ~ qual = 2.649475565903116
av1_qsv--defaults fps=595 Lsize= 6,506KiB ~ qual = 2.9379551312983736
av1_qsv--q_1 fps=574 Lsize= 42,180KiB ~ qual = 2.974338209046417
av1_qsv--global_qual_1 fps=584 Lsize= 22,306KiB ~ qual = 2.9663573051808747
av1_qsv--global_qual_2 fps=569 Lsize= 22,306KiB ~ qual = 2.9663573051808747
av1_qsv--global_qual_4 fps=580 Lsize= 22,306KiB ~ qual = 2.9663573051808747
av1_qsv--global_qual_8 fps=589 Lsize= 21,773KiB ~ qual = 2.9441795810304714
av1_qsv--global_qual_12 fps=577 Lsize= 21,611KiB ~ qual = 2.9441795810304714
av1_qsv--global_qual_16 fps=592 Lsize= 20,953KiB ~ qual = 2.9520681402030133
av1_qsv--global_qual_1,frames_50 fps=603 Lsize= 24,240KiB # awesome scroll.
av1_qsv--global_qual_1,frames_100 fps=559 Lsize= 22,947KiB # good enough scroll using `-g 100 -keyint_min 1 -forced-idr 1 -look_ahead 0`
# deinterlacing tests start here...
av1_qsv--global_qual_1,frames_100,yadif fps=555 Lsize= 21,971KiB ~ qual = 2.9600490440685556 # default (same as mode=0) & gives 25fps (one frame per frame)
av1_qsv--global_qual_1,frames_100,yadif_1 fps=689 Lsize= 31,596KiB ~ qual = 3.341668290434656 # gives 50fps (one frame per field)
av1_qsv--global_qual_1,frames_100,yadif_3 fps=639 Lsize= 31,756KiB ~ qual = 3.3301580567942333 # gives 50fps (one frame per field)
av1_qsv--global_qual_1,frames_100,bwdif fps=786 Lsize= 33,145KiB ~ qual = 3.3301580567942333 # default (same as send_field=1) & gives 50fps (one frame per field)
av1_qsv--global_qual_1,frames_100,mcdeint,yadif=1 fps=108 Lsize= 24,547KiB ~ qual = 3.326737218238156 # motion blurs after yadif. May look nicer, but isn't good for "archive".
av1_qsv--global_qual_1,frames_100,mcdeint,yadif=3 fps=110 Lsize= 24,683KiB ~ qual = 3.3301580567942333
libx264--crf_1,frames_100,yadif_1 fps=242 Lsize= 222,162KiB ~ qual = 3.4018759851504567
libx264--crf_0,preset_slow,frames_100,yadif_1 fps=199 Lsize= 270,708KiB ~ qual = 3.225124763304323 # dunno why the quality went down.
h264_qsv--global_qual_1,frames_100,yadif_1 fps=743 Lsize= 59,122KiB ~ qual = 3.171612916196122
h264_qsv--global_qual_16,frames_100,yadif_1 fps=725 Lsize= 33,051KiB ~ qual = 3.1517412696728675
While I don't care much about the exact subject of this post, I certainly appreciate a detailed tech post with readouts provided…. Keep up the good work!