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

Python 使用环境下编译 FFmpeg 及 PyAV 源码(英特尔篇)

文章目录

  • 一、简介
  • 二、VA-API 与 OneVPL 的关系
  • 三、源码编译GPU加速核心模块
    • 1. 安装 Media-driver
    • 2. 安装 Libva
    • 3. 安装GmmLib
    • 4. 安装 Libva-utils
    • 5. 安装 OneVPL
    • 6. 安装 Libvpl
  • 四、源码编译FFmpeg
  • 五、源码编译PyAV
  • 小结

一、简介

  1. Intel平台的视频编解码可以通过软件(CPU)或硬件(GPU)实现,其中硬件加速主要依赖于集成显卡(iGPU)或独立显卡(dGPU)中的专用模块,如 Quick Sync Video(QSV)

  2. Intel提供了多个接口用于访问这些加速能力,包括开源的 VAAPI(通过 libvamedia-driver 等实现)和自家的 OneVPL(新版统一视频处理接口)。VAAPI 是一个标准化的接口,Intel 通过 media-driver 实现对其支持,配合 gmmlib 提供底层资源管理;而 OneVPL 是 Intel 推出的新版跨平台 API,未来会逐步取代旧的 QSV 接口。

  3. 在实际应用中,可以通过 FFmpeg、GStreamer、PyAV 等工具调用这些接口,实现高效的视频编码和解码。在Intel平台上使用硬件加速编解码,需正确配置 VAAPI 或 OneVPL 相关依赖,并确保系统能识别 GPU 及其驱动。

    模块名类型说明
    GmmLib驱动依赖库Intel 图形内存管理,供 media-driver 使用。
    media-driver驱动插件Intel GPU 硬件驱动插件(如 iHD),被 VA-API 或 OneVPL 使用。
    libva中间接口VA-API 实现,向上给 FFmpeg 等提供统一接口,向下加载 media-driver
    libva-utils工具/调试vainfo 等工具,用于验证 libva 安装和驱动加载是否成功。
    FFmpeg多媒体编解码工具支持 -hwaccel vaapi-hwaccel qsv 实现 Intel GPU 硬编解码。
    PyAVPython 封装库FFmpeg 的 Python 接口,间接支持 VA-API 或 QSV 加速。
    OneVPL新一代编程接口替代 Intel Media SDK 的接口,支持 VA-API / iHD 驱动 / GPU + CPU 混合解码。
    QSV (Quick Sync)硬件能力(非软件)Intel GPU 硬件加速编解码技术,由 VA-API、Media SDK、OneVPL 统一调度调用。

二、VA-API 与 OneVPL 的关系

  1. VA-API(Video Acceleration API) 是一个开源的、跨厂商的统一硬件加速视频编解码接口规范,设计上比较通用,支持多种硬件(Intel、AMD、NVIDIA等),但它本身只是一个标准接口,具体性能和优化程度依赖于各硬件厂商提供的驱动(比如 Intel 的 iHD 驱动、i965 驱动等)。

  2. OneVPL(One Video Processing Library) 是英特尔推出的专门针对英特尔硬件(尤其是其最新架构)的多功能视频处理库,提供了更丰富、更专门化的硬件优化功能,支持包括编解码、视频处理、转码等,且接口设计更现代化、更高效,专注于英特尔平台

    层级VA-API 路线OneVPL 路线
    应用层FFmpeg、GStreamer、PyAV 等OneVPL API、FFmpeg -hwaccel qsv 等
    接口层libva(用户空间 API)libvpl(onevpl-core)
    驱动层iHD_drv_video.soiHD_drv_video.so
    硬件层Intel GPU (QSV)Intel GPU (QSV)

三、源码编译GPU加速核心模块

1. 安装 Media-driver

  1. 可以先通过英特尔官网确认自己的设备信息,包括架构代号。然后在media-driver官网上下载对应版本的源码进行安装。具体的安装步骤,参考github主页。选择下载支持自己设备型号的版本,特别是一些比较新的设备。

  2. media-driver安装之前,还需要确保两个重要依赖:Libva 和 GmmLib的安装,他们很重要并且推荐使用源码编译。所以,应先安装后面的内容,最后安装media-driver
    依赖页

  3. 安装完 LibvaGmmLib 之后,对于 ubuntu16 之后的系统,先安装如下的内容。

    sudo apt install autoconf libtool libdrm-dev xorg xorg-dev openbox libx11-dev libgl1-mesa-glx
    
  4. media-driver源码同级目录下创建build_media目录,mkdir build_media && cd build_media
    创建文件夹

  5. 参考官方的指令编译和安装。

    cmake ../media-driver
    make -j"$(nproc)"
    sudo make install
    sudo ldconfig
    
  6. 安装之后需要关注一下终端的信息,确认iHD_drv_video.so的安装位置,并在~/.bashrc中导出环境变量,之后执行source ~/.bashrc

    export LIBVA_DRIVER_NAME=iHD
    export LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri  # 根据具体情况修改
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
    
  7. 执行vainfo(需要安装Libva-utils),如果能打印如下的信息则安装成功。
    vainfo打印

2. 安装 Libva

  1. 参考官方主页,先安装如下内容。

    sudo apt-get install git cmake pkg-config meson libdrm-dev automake libtool
    
  2. 在github官网选择与media-driver版本匹配的libva源码下载。
    下载

  3. 参考官方的指令编译和安装,注意这里的安装路径,之后安装media-driver设置环境变量会用到。

    ./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
    make
    sudo make install
    sudo ldconfig
    
  4. 通过如下指令确认安装是否成功,如果输出模块版本号则安装成功。

    pkg-config --modversion libva
    

3. 安装GmmLib

  1. 在github官网选择与media-driver版本匹配的gmmlib源码下载。
    安装

  2. 参考官方指令编译和安装。

    cd gmmlib
    mkdir build && cd build
    cmake -DCMAKE_BUILD_TYPE=Release ..
    make -j"$(nproc)" 
    sudo make install
    sudo ldconfig
    

4. 安装 Libva-utils

  1. 在github官网选择与libva版本匹配的utils源码下载。
    工具

  2. 参考官方安装指令执行,之后就可以运行vainfo来检查媒体堆栈环境是否正确。

    ./autogen.sh --enable-tests
    make
    sudo make install
    sudo ldconfig
    

5. 安装 OneVPL

  1. 在github官网选择与media-driver版本匹配的vpl源码下载。
    vpl

  2. 参考官方指令编译和安装。安装完成之后会在/opt/intel/mediasdk/lib中看到libmfx相关的库文件。

    mkdir build && cd build
    cmake ..
    make
    sudo make install
    sudo ldconfig
    
  3. 通过如下指令确认安装是否成功,如果输出模块版本号则安装成功。

    pkg-config --modversion libmfx-gen
    

6. 安装 Libvpl

  1. 因为在安装onevpl的时候默认只安装libmfx的库,这个库支持的硬件有限,所以需要在github官网选择与onevpl版本匹配的libvpl源码下载安装。相关的支持关系可以参考官方主页介绍。
    libvpl

  2. 参考官方的安装指南编译和安装,修改安装路径为libmfx相同的安装路径,一般默认是/opt/intel/mediasdk

    export VPL_INSTALL_DIR=/opt/intel/mediasdk
    sudo script/bootstrap
    cmake -B _build -DCMAKE_INSTALL_PREFIX=$VPL_INSTALL_DIR
    cmake --build _build
    cmake --install _build
    sudo ldconfig
    
  3. ~/.bashrc中导出环境变量,之后执行source ~/.bashrc

    export LD_LIBRARY_PATH=/opt/intel/mediasdk/lib:$LD_LIBRARY_PATH
    export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig:$PKG_CONFIG_PATH
    
  4. (可选)根据官方介绍,使用的时候需要通过如下方式设置环境变量,请自行测试,一般情况下完成上诉过程就可以了。

    source /opt/intel/mediasdk/etc/vpl/vars.sh
    
  5. 通过如下指令确认安装是否成功,如果输出模块版本号则安装成功。

    pkg-config --modversion vpl
    

四、源码编译FFmpeg

  1. 安装基础构建工具。

    sudo apt update
    sudo apt install -y \build-essential \nasm \yasm \cmake \git \pkg-config \autoconf \libtool
    
  2. 上述工具基本覆盖了音视频领域 FFmpeg 编译所需的核心工具链,少数较新的库(如 libaom、SVT-AV1)可能用到ninja-buildmeson,这两者通常是配套使用的。如果只是主流音视频编解码需求,上面的工具就足够了。如果打算编译一些新型编解码器,可以选择安装。

    sudo apt install meson ninja-build
    
  3. 安装主流的编解码库依赖,包括:H.264 视频编码库,H.265/HEVC 视频编码库,VP8/VP9 视频编解码库,高质量 AAC 音频编码库,MP3 音频编码库,Opus 音频编解码库,Vorbis 音频编解码库等。

    sudo apt install -y \libx264-dev \libx265-dev \libvpx-dev \libfdk-aac-dev \libmp3lame-dev \libopus-dev \libvorbis-dev \libssl-dev
    
  4. 如果需要AV1 编码以及图像字幕等支持,可以选择安装。

    sudo apt install -y libaom-dev libsvtav1-dev libdav1d-dev libwebp-dev libass-dev libfreetype6-dev libfontconfig1-dev libfribidi-dev
    
  5. 在github官网选择合适版本的源码下载。PyAV-15.0.0版本默认支持FFmpeg-7.1.1, 参考官方安装指南 ,PyAV 需要 FFmpeg 的动态库支持,所以配置 FFmpeg--enable-shared选项,并开启qsv加速(--enable-libvpl),同时将 ffmpeg 安装到/opt/ffmpeg-7.1.1目录下便于版本控制。

    ./configure \--prefix=/opt/ffmpeg-7.1.1 \--enable-shared \--disable-static \--enable-gpl \--enable-nonfree \--enable-version3 \--enable-vaapi \--enable-libvpl \--enable-libdrm \--enable-libx264 \--enable-libx265 \--enable-libvpx \--enable-libaom \--enable-libsvtav1 \--enable-libdav1d \--enable-libfdk-aac \--enable-libmp3lame \--enable-libopus \--enable-libvorbis \--enable-libass \--enable-libfreetype \--enable-libfontconfig \--enable-libfribidi \--enable-libwebp \--enable-openssl
    
  6. 编译和安装。

    make -j$(nproc)
    sudo make install
    sudo ldconfig
    
  7. ~/.bashrc中导出环境变量,与 FFmpeg 的安装路径一致,之后执行source ~/.bashrc

    export PATH=/opt/ffmpeg-7.1.1/bin:$PATH
    export LD_LIBRARY_PATH=/opt/ffmpeg-7.1.1/lib:$LD_LIBRARY_PATH
    export PKG_CONFIG_PATH=/opt/ffmpeg-7.1.1/lib/pkgconfig:$PKG_CONFIG_PATH
    
  8. 执行ffmpeg -hwaccels列出当前 FFmpeg 支持的硬件加速方式,如果看到qsv则证明我们配置成功。
    硬件加速

五、源码编译PyAV

  1. 在安装之前,需要确认虚拟环境中是否已经有 FFmpeg,如果有,建议先卸载conda remove ffmpeg),否则在编译 PyAV 的时候会默认使用虚拟环境中的,即使我们设置了环境变量。

    conda list | grep ffmpeg  # 确认虚拟环境中不再有 ffmpeg 相关动态库(重要)
    
  2. 另外,为了保证编译的时候链接正确的 FFmpeg,需要在~/.bashrc中增加两个环境变量,之后执行source ~/.bashrc。路径修改为自己的 FFmpeg 的安装路径。

    export CFLAGS="-I/opt/ffmpeg-7.1.1/include"
    export LDFLAGS="-L/opt/ffmpeg-7.1.1/lib"
    
  3. 在github官网选择合适的版本下载源码,其中,github主页中的源码安装方式使用的venv创建虚拟环境。如果使用conda的环境,安装过程不完全一致。
    版本

  4. 参考官方主页中的介绍确认相关依赖是否存在。与 FFmpeg 有关的库可以在安装路径下的lib目录中确认,并且需要正确指定 FFmpeg 的环境变量。
    依赖

  5. 使用conda的虚拟环境安装前,需要对setup.py进行修改,否则就会出现如下的报错,主要是因为 PyAV 的构建脚本强制要求必须在虚拟环境(venv)中安装,而默认不认为conda是“虚拟环境”。

    报错

  6. setup.py 中找到is_virtualenv()函数并对其做如下修改,这样即使是conda,只要激活环境,就能通过这个检查。不会触发raise ValueError("You are not using a virtual environment")

    def is_virtualenv():return (hasattr(sys, "real_prefix") or    # old virtualenvsys.base_prefix != sys.prefix or  # venv'CONDA_PREFIX' in os.environ      # conda support)
    

    修改

  7. 完成对setup.py的修改后,激活conda环境并安装 PyAV

    conda activate myenv  # 激活虚拟环境
    cd PyAV
    pip install .  # 安装到虚拟环境
    

    安装成功

  8. 执行指令pip show av,确认 PyAV 是否真的安装到了虚拟环境中,如果有如下输出则证明安装成功,正确安装到了虚拟环境中的site-packages目录下。

    路径

  9. 非源码目录下执行如下指令,如果正确返回版本信息则可以正常导入av。如果在源码目录下执行则会报错。

    python -c "import av; print(av.__version__)"
    
  10. 执行如下指令查看 PyAV 使用的 FFmpeg 版本,将输出内容对比执行指令ffmpeg -version的结果,如果各个版本都一致那么 PyAV 已成功链接到编译的 FFmpeg

    python -c "import av; print(av.library_versions)"
    
  11. 另外,可以通过如下指令找到 PyAV 的底层动态库.so文件,检查它链接的 FFmpeg 库。

    ldd $(python -c "import av._core; print(av._core.__file__)")
    

小结

上述内容均参考官网及个人实践,如有其他问题欢迎在评论区讨论,谢谢!!

http://www.xdnf.cn/news/1180531.html

相关文章:

  • TDengine 转化类函数 TO_CHAR 用户手册
  • 【数字IC验证学习------- SOC 验证 和 IP验证和形式验证的区别】
  • 借助 VR 消防技术开展应急演练,检验完善应急预案​
  • 数据库底层索引讲解-排序和数据结构
  • 主流 BPM 厂商产品深度分析与选型指南:从能力解析到场景适配
  • 基于深度学习的CT图像3D重建技术研究
  • Python-初学openCV——图像预处理(二)
  • MySQL 表的操作
  • 大模型Prompt优化工程
  • Shell的正则表达式
  • JVM原理及其机制(二)
  • Web前端:JavaScript findIndex⽅法
  • MySQL数据库迁移至国产数据库测试案例
  • Spring MVC 统一响应格式:ResponseBodyAdvice 从浅入深
  • redis常用数据类型
  • 智慧工厂网络升级:新型 SD-WAN 技术架构与应用解析
  • Leetcode 07 java
  • 13-C语言:第13天笔记
  • C++第一节课入门
  • 基础NLP | 02 深度学习基本原理
  • PDF转Markdown - Python 实现方案与代码
  • 爬虫逆向--Day12--DrissionPage案例分析【小某书评价数据某东评价数据】
  • 使用爬虫获取游戏的iframe地址
  • 2025最新MySQL面试题实战记录,互联网公司常问题目
  • Mac电脑开发Python(基于vs code)
  • M²IV:面向大型视觉-语言模型中高效且细粒度的多模态上下文学习
  • 数字系统自动设计:从C++到门级网表
  • 如何使用 pdfMake 中文字体
  • 排序初识(上)-- 讲解超详细
  • Unity 多人游戏框架学习系列九