当前位置: 首页 > news >正文

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

  1. --cache=no 确保网络层收到数据后立刻往下送。

  2. --demuxer-lavf-o=fflags=+nobuffer 确保解复用器收到数据后立刻拆包并送往解码器。

  3. --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 fps12.2 ms基准
硬解码197 fps5.08 ms2.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%了。

http://www.dtcms.com/a/392696.html

相关文章:

  • 第 N 个泰波那契数
  • 面试经典150题[037]:矩阵置零(LeetCode 73)
  • mysql 简单操作
  • Maven:Java项目的自动化构建工具
  • 嵌入式硬件工程师每日提问
  • 2025年AI写小说工具测评:AI写作软件大比拼
  • UL 2808 2020北美能源监测设备安全标准介绍
  • 刷题日记0920
  • 论文复现中的TODO
  • 什么是双向SSL/TLS(mTLS)?深入理解双向认证的守护神
  • app封装是什么意思
  • 什么是机房IP?有什么缺点
  • 【读书笔记】《谣言》
  • golang基础语法(一)变量
  • 私有化gitlab版本升级步骤(以版本12.9.0为例)
  • 基于java+springboot的超市仓库管理系统
  • Ubuntu 下练习编译 `.deb` 包的完整指南(适用于批量部署)
  • ICCV | 2025 | SkySense V2:面向多模态遥感的统一基础模型
  • 基于C# winform实现PP-HumanSeg人像分割替换背景色更换背景色
  • 对ai产品,设计测试case
  • ns-3 中一个最核心、最基本的概念——分组
  • C++八股 —— 编译过程
  • CMake笔记:cmake -G “NMake Makefiles“ 后,如何生成debug与release?
  • 解决 pip 安装报错:Could not find a suitable TLS CA certificate bundle
  • Python快速入门专业版(三十七):Python元组:不可变序列的特点与应用场景(对比列表)
  • 【UnoCSS快速上手】:安装、配置与优化,以及遇到的问题
  • 探索 Event 框架 5:实现Spring Boot集成
  • ARM(15) - LCD(2)显示字母数字+touch
  • 五、炫饭馆项目实战
  • 01.容器生态系统