vaapi硬解码性能评估
目录
硬解接口vaapi
编辑
测试视频源
mpv
mpv-example
mpv命令
低时延参数
硬解环境变量设置
解码性能测试
CPU软解
GPU 硬解
命令输出详细示例
压缩视频格式查询
H264
1080P 60fps 265
1080P 30fps 265
总结
硬解接口vaapi
vappi通用接口,具体的GPU驱动根据此接口实现自己的库。
驱动提供的vaapi的库文件如下
驱动重新编译的ffmpeg,实际上没有必要重新编译吧,因为ffmpeg调用的是通用vaapi接口。这时要注意系统原先安装的ffmpeg和驱动安装的ffmpeg,根据路径选择不同库使用。
测试视频源
MP4 ( H.265 ) | Test Videos
https://test-videos.co.uk/bigbuckbunny/mp4-h265
mpv
mpv-example
https://github.com/mpv-player/mpv-examples
在代码中增加
mpv_set_option_string(mpv, "input-default-bindings", "yes");
// Enable keyboard input on the X11 window. For the messy details, see
// --input-vo-keyboard on the manpage.
mpv_set_option_string(mpv, "input-vo-keyboard", "yes");
mpv_set_option_string(mpv, "hwdec", "vaapi"); //增加此行
即可以硬解码。
CPU占用率只有40%,非常高效了。
mpv命令
mpv --hwdec=vaapi --vo=gpu h264.mp4
vaapi的硬解解码参数。
低时延参数
--demuxer-lavf-o=fflags=+nobuffer --cache=no --profile=low-latency mpv
-
--cache=no
确保网络层收到数据后立刻往下送。 -
--demuxer-lavf-o=fflags=+nobuffer
确保解复用器收到数据后立刻拆包并送往解码器。 -
--profile=low-latency
确保解码器和播放引擎本身也采用最低延迟的设置。
适用场景:
-
直播监控: 观看实时监控画面,需要画面和现实几乎同步。
-
视频会议/直播推流预览: 主播需要看到自己画面的反馈,延迟必须极低。
-
低延迟直播: 例如观看电竞比赛、股票行情、体育赛事等,你希望自己的画面和现场几乎同步。
-
专业领域的实时视频流: 如无人机图传、机器人控制等。
重大缺点:
-
极易卡顿和缓冲: 由于没有任何缓存来对抗网络波动,任何微小的网络延迟或抖动都会导致视频立即卡住、等待数据。
-
高CPU占用: 一些优化(如单线程解码)可能会增加CPU负担。
-
音画可能不同步: 在极端情况下, aggressive 的设置可能会破坏播放器的同步机制。
结论:
这是一个非常极端的配置,只为延迟一个指标服务,完全牺牲了播放的稳定性和流畅性。只有在网络条件极好、并且对延迟有极端要求的场景下才应该使用。对于普通观看在线视频,绝对不推荐使用这些参数。
硬解环境变量设置
cat /etc/profile 文件中增加如下:
export LIBVA_DRIVERS_PATH=/usr/lib/aarch64-linux-gnu/dri
export LIBVA_DRIVER_NAME=xxgpu
export LIBVA_DEVICE=/dev/dri/renderD128
解码性能测试
评估软硬件性能。
CPU软解
帧率62 ,CPU 400%
LIBVA_DRIVER_NAME=xxgpu ffmpeg -i 1080p60-265.mp4 -f null -
GPU 硬解
LIBVA_DRIVER_NAME=xxgpu ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i 1080p60-265.mp4 -f null -
命令输出详细示例
1) 输出格式变化,类似的我们在之前硬解编码时讲过,不同编解码器输出的格式会有所变化,这个在应该开发时要注意。
-
软解码:
yuv420p
→ 输出yuv420p
-
硬解码:
yuv420p
→ 输出nv12
2)性能,测试视频265 1080P 60fps
解码方式 | 解码速度 | 每帧时间 | 相对性能 |
---|---|---|---|
软解码 | 82 fps | 12.2 ms | 基准 |
硬解码 | 197 fps | 5.08 ms | 2.4倍提升 |
软解码性能:12.2ms/帧
对于60fps视频(16.67ms/帧),软解码勉强能实时处理
有约4.47ms的余量(16.67 - 12.2)
硬解码性能:5.08ms/帧
远高于实时需求,有11.59ms的余量
可以轻松处理更高分辨率或帧率的视频
./test.sh
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developersbuilt with gcc 9 (Ubuntu 9.3.0-10kylin2)configuration: --prefix=/home/inno/jingn/T/gpu_makedeb_v2/codec/inno_media/ffmpeg/build_output --extra-cflags=-I/home/inno/jingn/T/gpu_makedeb_v2/codec/inno_media/output/usr/local/include --extra-ldflags=-L/home/inno/jingn/T/gpu_makedeb_v2/codec/inno_media/output/usr/local/lib --extra-libs='-lpthread -lm' --arch=aarch64 --enable-shared --enable-gpl --disable-static --disable-stripping --enable-avresample --enable-opengl --enable-libdrm --enable-vdpau --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libwavpack --enable-libwebp --enable-libxml2 --enable-libxvid --enable-libzmq --enable-sdl2 --enable-libdc1394 --enable-libx264 --enable-vaapilibavutil 56. 31.100 / 56. 31.100libavcodec 58. 54.100 / 58. 54.100libavformat 58. 29.100 / 58. 29.100libavdevice 58. 8.100 / 58. 8.100libavfilter 7. 57.100 / 7. 57.100libavresample 4. 0. 0 / 4. 0. 0libswscale 5. 5.100 / 5. 5.100libswresample 3. 5.100 / 3. 5.100libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1080p60-265.mp4':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2mp41encoder : Lavf55.37.100Duration: 00:01:33.08, start: 0.000000, bitrate: 7922 kb/sStream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 7874 kb/s, 60 fps, 60 tbr, 15360 tbn, 60 tbc (default)Metadata:handler_name : VideoHandlerStream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 64 kb/s (default)Metadata:handler_name : SoundHandler
Stream mapping:Stream #0:0 -> #0:0 (hevc (native) -> wrapped_avframe (native))Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2mp41encoder : Lavf58.29.100Stream #0:0(und): Video: wrapped_avframe, yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc (default)Metadata:handler_name : VideoHandlerencoder : Lavc58.54.100 wrapped_avframeStream #0:1(und): Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s (default)Metadata:handler_name : SoundHandlerencoder : Lavc58.54.100 pcm_s16le
frame= 5564 fps= 82 q=-0.0 Lsize=N/A time=00:01:33.07 bitrate=N/A speed=1.38x
fps=82 - 解码速度约82帧/秒speed=1.38x - 实时速度的1.38倍
============================================================================
video:2912kB audio:17452kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
hard decode
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developersbuilt with gcc 9 (Ubuntu 9.3.0-10kylin2)configuration: --prefix=/home/inno/jingn/T/gpu_makedeb_v2/codec/inno_media/ffmpeg/build_output --extra-cflags=-I/home/inno/jingn/T/gpu_makedeb_v2/codec/inno_media/output/usr/local/include --extra-ldflags=-L/home/inno/jingn/T/gpu_makedeb_v2/codec/inno_media/output/usr/local/lib --extra-libs='-lpthread -lm' --arch=aarch64 --enable-shared --enable-gpl --disable-static --disable-stripping --enable-avresample --enable-opengl --enable-libdrm --enable-vdpau --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libwavpack --enable-libwebp --enable-libxml2 --enable-libxvid --enable-libzmq --enable-sdl2 --enable-libdc1394 --enable-libx264 --enable-vaapilibavutil 56. 31.100 / 56. 31.100libavcodec 58. 54.100 / 58. 54.100libavformat 58. 29.100 / 58. 29.100libavdevice 58. 8.100 / 58. 8.100libavfilter 7. 57.100 / 7. 57.100libavresample 4. 0. 0 / 4. 0. 0libswscale 5. 5.100 / 5. 5.100libswresample 3. 5.100 / 3. 5.100libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1080p60-265.mp4':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2mp41encoder : Lavf55.37.100Duration: 00:01:33.08, start: 0.000000, bitrate: 7922 kb/sStream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 7874 kb/s, 60 fps, 60 tbr, 15360 tbn, 60 tbc (default)Metadata:handler_name : VideoHandlerStream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 64 kb/s (default)Metadata:handler_name : SoundHandler
Find gt DRM render node /dev/dri/card1 drm_fd=5 is_render_nodes 0
Stream mapping:Stream #0:0 -> #0:0 (hevc (native) -> wrapped_avframe (native))Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
[09-16 16:30:33:754369][MSG ][GT_VPU][ gt_vpuapi.c:54 vpu_get_version] GT VPU API Version: V1.1.2 GitBase:87612d88d13ffd72fd19cd0e5e7054dc8919d67a CompileTime:2024-12-02 14:08:44
Output #0, null, to 'pipe:':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2mp41encoder : Lavf58.29.100Stream #0:0(und): Video: wrapped_avframe, nv12, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc (default)Metadata:handler_name : VideoHandlerencoder : Lavc58.54.100 wrapped_avframeStream #0:1(und): Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s (default)Metadata:handler_name : SoundHandlerencoder : Lavc58.54.100 pcm_s16le
frame= 5564 fps=197 q=-0.0 Lsize=N/A time=00:01:33.07 bitrate=N/A speed= 3.3x
video:2912kB audio:17452kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
fps=197 - 解码速度约197帧/秒speed=3.3x - 实时速度的3.3倍
压缩视频格式查询
很多压缩后的视频都是mp4,需要明确其具体压缩格式和压缩率。
H264
ffmpeg -i test.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2avc1mp41encoder : Lavf59.14.100Duration: 00:01:16.30, start: 0.000000, bitrate: 630 kb/sStream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 720x1280 [SAR 1:1 DAR 9:16], 499 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)Metadata:handler_name : VideoHandlerStream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 123 kb/s (default)Metadata:handler_name : SoundHandlerAt least one output file must be specified
1080P 60fps 265
ffmpeg -i 1080p60-265.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1080p60-265.mp4':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2mp41encoder : Lavf55.37.100Duration: 00:01:33.08, start: 0.000000, bitrate: 7922 kb/sStream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 7874 kb/s, 60 fps, 60 tbr, 15360 tbn, 60 tbc (default)Metadata:handler_name : VideoHandlerStream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 64 kb/s (default)Metadata:handler_name : SoundHandler
At least one output file must be specified
1080P 30fps 265
ffmpeg -i Big_Buck_Bunny_1080_10s_30MB.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Big_Buck_Bunny_1080_10s_30MB.mp4':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2mp41title : Big Buck Bunny, Sunflower versionartist : Blender Foundation 2008, Janus Bager Kristensen 2013composer : Sacha Goedegebureencoder : Lavf58.10.100comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.netgenre : AnimationDuration: 00:00:10.00, start: 0.000000, bitrate: 25169 kb/sStream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25163 kb/s, 30 fps, 30 tbr, 15360 tbn, 30 tbc (default)Metadata:handler_name : VideoHandler
At least one output file must be specified
总结
在之前的编解码系列中,都是直接采用芯片的编解码接口,例如海思,瑞芯微等自定义的接口,而后测量每帧的编解码时延。
对于支持vaapi通用接口的GPU,在通用操作系统下,有更简单有效方法评估编解码效率。
首先要明确被评估视频的编码格式、帧率、码率等,进而评估编解码延时及CPU、gpu占用率。
此外,由于很多时候,解码后直接显示,因而CPU的占用率一部分也被显示占用。例如我们在实际开发中,通过CPU绘制输出时,CPU占140%,而改为GPU 渲染后,CPU整体占用到77%了。