一文速通GPU版FFmpeg视频转码的安装使用

目录

写在前面

[一、FFmpeg 版本](#一、FFmpeg 版本)

二、完整安装步骤

[1. 安装编译依赖](#1. 安装编译依赖)

[2.安装nv-codec-headers SDK 12.0](#2.安装nv-codec-headers SDK 12.0)

[3.如果需要 x264/x265(软件编码备用)](#3.如果需要 x264/x265(软件编码备用))

[4. 下载 FFmpeg 6.0 源码](#4. 下载 FFmpeg 6.0 源码)

[5. 配置编译选项](#5. 配置编译选项)

[6. 编译并安装](#6. 编译并安装)

[三、 验证安装](#三、 验证安装)

1.查看FFmpeg版本

[2.检查 NVENC 编码器是否可用](#2.检查 NVENC 编码器是否可用)

[3.检查 CUVID 解码器是否可用](#3.检查 CUVID 解码器是否可用)

[4. 检查 NVIDIA 硬件加速是否启用](#4. 检查 NVIDIA 硬件加速是否启用)

5.试着转码一个视频

四、NVENC是什么

[五、nv-codec-headers SDK是什么](#五、nv-codec-headers SDK是什么)


写在前面

我有一张破显卡(P100),我要在这张显卡上用FFmpeg 进行视频转码。因为这张卡虽然破,也比纯CPU转码要快的多,配置如下:

**显卡:**Tesla P100 PCIe 16GB

**显卡驱动:**525.105.17

CUDA 版本: 12.0

**操作系统:**Ubuntu 18.04.1

一、FFmpeg 版本

我的配置不高,但是FFmpeg 的 GPU 加速(NVENC/NVDEC)完全可用,只是不能使用最高版本的FFmpeg 。驱动 525.105.17 最高支持 Video Codec SDK 12.0,可以安装最高 FFmpeg 6.0+ 版本。

最终方案:编译 FFmpeg 6.0 配合 nv-codec-headers SDK 12.0 分支,以避免 "Driver does not support the required nvenc API version" 错误。

二、完整安装步骤

1. 安装编译依赖

复制代码
sudo apt-get update
sudo apt-get install -y build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev git pkg-config

2.安装nv-codec-headers SDK 12.0

复制代码
wget -O nv-codec-headers-sdk-12.0.tar.gz "https://github.com/FFmpeg/nv-codec-headers/archive/refs/heads/sdk/12.0.tar.gz"
tar -xzf nv-codec-headers-sdk-12.0.tar.gz
cd nv-codec-headers-sdk-12.0
sudo make install

3.如果需要 x264/x265(软件编码备用)

a.安装依赖

复制代码
sudo apt-get install -y libx264-dev libx265-dev libnuma-dev

b.如果 libx264-dev 找不到,用:

复制代码
sudo apt-get install -y libx264-163 libx264-dev

4. 下载 FFmpeg 6.0 源码

先准备文件夹,我所有ffmpeg相关的文件都放在/mnt/ffmpeg目录:

复制代码
cd /mnt/ffmpeg
wget https://ffmpeg.org/releases/ffmpeg-6.0.1.tar.xz
tar -xJf ffmpeg-6.0.1.tar.xz
cd ffmpeg-6.0.1

5. 配置编译选项

复制代码
./configure \
  --enable-nonfree \
  --enable-cuda-nvcc \
  --enable-libnpp \
  --enable-cuvid \
  --enable-nvenc \
  --enable-ffnvcodec \
  --enable-cuda \
  --extra-cflags=-I/usr/local/cuda/include \
  --extra-ldflags=-L/usr/local/cuda/lib64 \
  --disable-static \
  --enable-shared \
  --enable-gpl \
  --enable-libx264 \
  --enable-libx265

关键参数说明:

  • --enable-cuda-nvcc:启用 CUDA 编译

  • --enable-cuvid:启用 NVDEC 硬件解码

  • --enable-nvenc:启用 NVENC 硬件编码

  • --enable-libnpp:启用 NVIDIA Performance Primitives(用于 GPU 滤镜如 scale_npp)

  • --extra-cflags=-I/usr/local/cuda/include:指向 CUDA 头文件

  • --extra-ldflags=-L/usr/local/cuda/lib64:指向 CUDA 库文件

6. 编译并安装

复制代码
make -j$(nproc)
sudo make install
sudo ldconfig

三、 验证安装

1.查看FFmpeg版本

复制代码
ffmpeg -version

2.检查 NVENC 编码器是否可用

复制代码
ffmpeg -hide_banner -encoders | grep nvenc

3.检查 CUVID 解码器是否可用

复制代码
ffmpeg -hide_banner -decoders | grep cuvid

4. 检查 NVIDIA 硬件加速是否启用

复制代码
ffmpeg -hide_banner -hwaccels | grep cuda

5.试着转码一个视频

复制代码
ffmpeg \
  -hwaccel cuda \
  -hwaccel_output_format cuda \
  -i input_video.mp4 \
  -vf "scale_npp=1920:1080" \
  -c:v h264_nvenc \
  -preset fast \
  -b:v 4M \
  -maxrate 6M \
  -bufsize 8M \
  -r 30 \
  -c:a copy \
  -y output_1080p_4m_gpu_video.mp4

四、NVENC是什么

上面提到了NVENC,NVENCNVIDIA Video Encoder 的缩写,NVIDIA 的硬件视频编码器

简单地说,NVENC 是 NVIDIA 显卡上的一个独立硬件模块 ,专门负责视频编码,不占用 GPU 的 CUDA 核心

Tesla P100 有这个模块,所以可以用显卡硬件编码视频,而不是用 CPU 软编码。

|---------|-----------------|------------|--------|--------|
| 方式 | 命令 | 占用资源 | 速度 | 质量 |
| CPU 软编码 | -c:v libx264 | CPU 核心 | 慢 | 好 |
| GPU 硬编码 | -c:v h264_nvenc | NVENC 专用芯片 | 快 | 够用 |

我们注意到表格中最后一列中:CPU 软编码质量更好。没错,同码率下 CPU 软编码(libx264)通常比 GPU 硬编码(h264_nvenc)画质更清晰,但差距在缩小。

|---------|--------------------------------|
| 原因 | 说明 |
| 压缩算法更精细 | CPU 可以做更复杂的运动估计、帧间预测,找到更优的压缩方式 |
| 码率分配更智能 | 复杂画面(如树叶、水波纹)给更多码率,简单画面省码率 |
| B帧更多 | CPU 编码可以用更多 B帧(双向预测),压缩率更高 |
| 心理视觉优化 | x264 的 psychovisual 优化更成熟 |

但差距没那么大(特别是高码率时)

|-----------------------------|-----------------------|
| 场景 | 差距 |
| 低码率(<2Mbps 1080p) | CPU 优势明显,GPU 可能有明显块效应 |
| 中等码率(4Mbps 1080p) | 差距较小,肉眼难分辨 |
| 高码率(>8Mbps 1080p) | 几乎看不出区别 |
| HEVC(h265_nvenc vs libx265) | GPU 差距更小,HEVC 本身压缩率高 |

所以,同码率下 CPU 更清晰,但 GPU 快 5-10 倍 。如果 GPU 编码,码率给高一点(比如 CPU 用 3M,GPU 用 5M),画质就能追平,速度还是快很多。

五、nv-codec-headers SDK是什么

nv-codec-headers 是 NVIDIA 视频编解码的头文件库,FFmpeg 编译 GPU 加速功能时必须用到。

简单的说,它是 NVIDIA 提供的接口定义文件.h 头文件),让 FFmpeg 知道怎么调用显卡上的NVENC (硬件编码器)和NVDEC/CUVID(硬件解码器)。没有它,FFmpeg 编译时就找不到这些接口,GPU 编解码功能就启用不了。

为什么需要单独安装?

NVIDIA 的 Video Codec SDK 是闭源的,但头文件是开源的。FFmpeg 不能直接链接 SDK,只能通过这些头文件动态加载显卡驱动里的编码/解码功能。

版本必须匹配

|-------------------------|----------------------|------------------|
| nv-codec-headers 分支 | 对应 NVIDIA SDK 版本 | 适用 FFmpeg 版本 |
| sdk/11.1 | Video Codec SDK 11.1 | FFmpeg 5.1, 6.0 |
| sdk/12.0 | Video Codec SDK 12.0 | FFmpeg 6.0+ |
| sdk/12.1 | Video Codec SDK 12.1 | FFmpeg 6.1+ |

六、CPU版FFmpeg

这是CPU版预编译的FFmpeg下载地址,可以下载直接用,不需要上面的一系列操作:FFbinaries - Download binaries for ffmpeg, ffprobe, ffserver and ffplay (cross-platform: Windows, Mac, Linux)

GPU版FFmpeg的安装就介绍到这里。

关注不迷路(*^▽^*),暴富入口==》 https://bbs.csdn.net/topics/619691583

相关推荐
美狐美颜SDK开放平台1 小时前
直播APP平台开发如何降低成本?视频美颜SDK方案解析
人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk·美颜api
luoyayun3612 小时前
Qt/QML音视频文件原始十六进制查看器
qt·音视频·十六进制查看
小鹿软件办公5 小时前
如何利用 Mac 自带 iMovie 裁剪去除视频 Logo 或文字水印
macos·音视频·视频去水印·简鹿水印助手
blanks20204 天前
ffmpeg 学习笔记 通过命令行采集音频
ffmpeg
RTC实战笔记4 天前
实时互动数字人怎么做,才不是一个只会说话的视频?
音视频·数字人·rtc·数字人接入
Mahut8 天前
我用 Electron + FFmpeg 做了一个本地视频处理工作站 ClipForge
前端·ffmpeg·electron
RTC实战笔记16 天前
Android 实时音视频接入教程:媒体补充增强信息(SEI)
音视频·媒体·rtc
潜创微科技17 天前
HDMI1.3 无线传输芯片方案 空旷 150 米量产级音视频方案
音视频
VidDown17 天前
VidDown 工具站:免费、本地优先的开发者工具箱
javascript·编辑器·音视频·视频编解码·视频