ubuntu20.04已安装 11.6版本 cuda,现需要通过源码编译方式安装使用 cuda 加速的 ffmpeg 步骤

复制代码
ubuntu20.04上已经安装了 11.6版本的 cuda(CUDA_HOME=/usr/local/cuda-11.6),现在需要通过源码编译的方式安装使用cuda加速的 ffmpeg,请问我该下载具体哪个版本的ffmpeg源码?并给出详细的安装步骤

‌一、版本选择策略‌
    FFmpeg 主版本‌:
    ‌推荐 v5.1.2‌(2023 年 4 月发布),该版本完整支持 CUDA 11.x 的 NVDEC/NVENC 硬件加速接口,且修复了早期版本与 CUDA 11.6 的兼容性问题‌
    替代方案:若需更低版本,可选择 v4.4.3‌(需手动打补丁修复 API 兼容性)‌
    ‌依赖组件版本‌:
    NVIDIA Video Codec SDK 12.1‌:需与 CUDA 11.6 配套使用‌
    nv-codec-headers 12.0.16‌:提供 FFmpeg 所需的头文件‌

‌二、详细安装步骤‌
    1. 安装编译依赖
        1.1. 基础编译工具:
            sudo apt install build-essential nasm yasm cmake pkg-config libtool

        1.2. CUDA 加速依赖:
            1.2.1. sudo apt install libcuda1-510 nvidia-cuda-toolkit  # 驱动版本需 ≥510.39.01
                过程比较顺利,只是有点慢
            1.2.2. sudo apt install nvidia-cuda-dev  # CUDA 开发库
                过程比较顺利,只是有点慢
            1.2.2. sudo apt install libnvcuvid1  # CUDA 开发库
                    报错 Package 'libnvcuvid1' has no installation candidate 的解决方案:
                        方法1. 确认 libnvcuvid1 是否已经存在了(存在的话就不用重新安装了,还需要配置环境变量即可):
                            若 CUDA 11.6 已通过 .run 文件正确安装,libnvcuvid1 可能已存在于 /usr/local/cuda-11.6/lib64/ 目录下
                            但是我在 /usr/local/cuda-11.6/lib64/ 下没发现任何 libnvcuvid.so 前缀的文件
                            倒是使用 ldconfig -p | grep libnvcuvid 发现在  /usr/lib/wsl/lib/ 下有一个 libnvcuvid.so.1 文件( 对,你没看错,我的 ubuntu20.04是win10 wsl2下的虚拟环境 )
                            将 /usr/lib/wsl/lib/libnvcuvid.so.1 复制到 /usr/local/cuda-11.6/lib64/ 下
                            执行 echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc  # 配置环境变量‌
                            执行 source ~/.bashrc
                            此时相当于 libnvcuvid1 已经安装成功了
                        方法2. 若最初通过 .run 文件安装 CUDA 11.6,需重新添加 CUDA 官方 APT 源:
                            1. 清理旧 CUDA 安装残留(谨慎操作)
                                sudo apt purge nvidia-cuda-* cuda-* libnvcuvid1*
                                sudo rm -rf /etc/apt/sources.list.d/cuda*.list
                            2. 添加 CUDA 11.6 官方仓库(适用于 Ubuntu 20.04)
                                wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
                                sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
                                sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub
                                sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
                                sudo apt update
                            3. 安装完整 CUDA 工具包(包含 libnvcuvid1)
                                sudo apt install cuda-toolkit-11-6

    2. 部署 NVIDIA 编解码 SDK
        2.1. 下载 Video Codec SDK 12.1
            wget https://developer.nvidia.com/video-codec-sdk-12.1.14   # 404,可以官网下载:https://developer.nvidia.com/video-codec-sdk-archive
            unzip Video_Codec_SDK_12.1.14.zip -d nvidia_sdk
        2.2. 配置头文件路径
            sudo cp -r nvidia_sdk/Interface /usr/local/include/nvidia
    3. 安装 FFmpeg 源码
        3.1. 下载 FFmpeg v5.1.2
            wget https://github.com/FFmpeg/FFmpeg/archive/refs/tags/n5.1.2.tar.gz
            tar -xzf n5.1.2.tar.gz
            cd FFmpeg-n5.1.2
        3.2. 配置编译参数(关键步骤)
                ./configure \
                --prefix=/usr/local \
                --enable-cuda-nvcc \
                --enable-cuvid \
                --enable-nvenc \
                --enable-nonfree \
                --enable-libnpp \
                --extra-cflags="-I/usr/local/cuda-11.6/include -I/usr/local/include/nvidia" \
                --extra-ldflags="-L/usr/local/cuda-11.6/lib64"
                报错:ERROR: cuda requested, but not all dependencies are satisfied: ffnvcodec
                报错:ERROR: nvenc requested but not found
                    解决方案:需要安装 nv-codec-headers 12.0.16(参考:https://blog.csdn.net/liuliu123456/article/details/120998681):
                                git clone http://git.videolan.org/git/ffmpeg/nv-codec-headers.git
                                git  branch  -a发现有  remotes/origin/sdk/12.0,执行 git checkout sdk/12.0
                                make
                                sudo make install
                                export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}
                                pkg-config --modversion ffnvcodec
        3.3. 编译与安装
            3.3.1. make -j$(nproc)
                    报错: make: *** No rule to make target 'libavfilter/all_channel_layouts.inc', needed by 'libavfilter/formats.o'. Stop
                    ffmpeg 的版本不对,可能不是通过前面 3.1的方式下载 ffmpeg  n5.1.2 版本的,我最开始是使用 git  branch  -a 能查询到远端只有release/5.1,所以就直接 git  checkout  release/5.1 下载的是 release/5.1 版本,
                    其实执行 git tag -l 应该能查询到 n5.1.2 版本,然后 git checkout  n5.1.2,然后重新执行前面的 configure 步骤,但是记得先清空 make 命令产生的缓存(如下2个命令):
                            make clean  # 若 Makefile 支持 clean 规则
                            rm -rf libavfilter/*.o libavfilter/*.d

            3.3.2. sudo make install

    4. 环境验证
        4.1. 检查 CUDA 加速支持
            ffmpeg -hwaccels | grep cuda  # 应输出 "cuda"
        4.2. 验证编解码器
            ffmpeg -codecs | grep nvenc  # 应显示 h264_nvenc/hevc_nvenc
        4.3. 使用 ffmpeg 切割视频:
            1. ffmpeg -i ./demo.mp4 -c:v libx264 -ss 00:10:00 -to 00:20:00 -y -f mp4 ./demo_output.mp4    # 不使用 cuda 加速
            2. ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i ./demo.mp4 -c:v h264_nvenc -ss 00:10:00 -to 00:20:00 -y -f mp4 ./demo_output.mp4 # 使用 cuda 加速
相关推荐
刚入门的大一新生5 小时前
C++初阶-C++入门基础
开发语言·c++
weixin_428498497 小时前
Visual Studio 中使用 Clang 作为 C/C++ 编译器时,设置优化选项方法
c语言·c++·visual studio
菜鸡中的奋斗鸡→挣扎鸡7 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
c语言·c++·蓝桥杯
流星白龙8 小时前
【C++算法】50.分治_归并_翻转对
c++·算法
q567315238 小时前
使用libcurl编写爬虫程序指南
开发语言·c++·爬虫
矛取矛求9 小时前
C++ STL 详解 ——list 的深度解析与实践指南
c++·list
杰杰批10 小时前
第十四届蓝桥杯大赛软件赛国赛C/C++研究生组
c语言·c++·蓝桥杯
aaaweiaaaaaa11 小时前
蓝桥杯c ++笔记(含算法 贪心+动态规划+dp+进制转化+便利等)
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划
xyd陈宇阳11 小时前
Linux 入门五:Makefile—— 从手动编译到工程自动化的蜕变
linux·运维·服务器·makefile
FreeLikeTheWind.11 小时前
Qt 开发时可以在函数内引用的头文件
开发语言·c++·qt