FFmpeg - Jetson Orin 实战部署

FFmpeg 是一套开源、跨平台、全能的音视频处理工具集,由 C 语言开发,免费开源(LGPL/GPL 协议),几乎所有音视频相关软件底层都依赖它:

  • FF = Fast Forward(快进)
  • mpeg = 常见视频编码标准 MPEG

四大核心组件

  1. ffmpeg(命令行主程序) 最常用工具,负责转码、剪辑、拼接、压缩、录屏、水印、格式转换 等所有音视频操作。 示例简单命令:把 mp4 转成 mov

    复制代码
    ffmpeg -i input.mp4 output.mov
  2. ffplay(播放器) 极简命令行播放器,不用装第三方播放器就能播放视频、音频。

  3. ffprobe(媒体信息查看工具) 读取视频编码、分辨率、码率、时长、声道、字幕等元数据,多用于自动化脚本分析媒体文件。

  4. libav 系列库(开发核心) * 供程序员嵌入程序使用的底层库,是 FFmpeg 的灵魂:

    • libavformat:封装 / 解封装(MP4、MKV、FLV、MOV 等容器格式)
    • libavcodec:编码 / 解码器(H.264、H.265、AV1、AAC、MP3 等)
    • libavfilter:音视频滤镜(裁剪、缩放、加水印、调色、降噪)
    • libavutil:基础工具(内存、时间、像素格式)
    • libswscale:图像缩放、像素格式转换
    • libswresample:音频重采样、声道转换

FFmpeg支持 Windows /macOS/ Linux / Android /iOS/ 嵌入式开发板(树莓派、车载、边缘设备如 Orin),无硬件绑定。可以实现格式互转,视频压缩,剪辑拼接,音视频处理,批量自动化。

Jetson Orin FFmpeg 完整部署流程(本地编译,支持 NVMPI 硬件编解码)

  1. 硬件:Jetson AGX Orin / Orin NX / Orin Nano
  2. 系统:JetPack 5.x/ 6.x(L4T r35/r36),已预装 CUDA、Jetson Multimedia API
  3. 两种硬编方案:
    • nvmpi:Jetson 专属,多路摄像头 / 低延迟首选(推荐自动驾驶、多路推流)
    • nvenc/nvdec:通用 GPU 硬件编解码,PC/Orin 通用
  4. 全程脚本化,复制即可一键执行;附验证、推流、C++ 调用示例

一、环境前置检查

复制代码
# 查看L4T版本
cat /etc/nv_tegra_release
# 查看CUDA
nvcc -V
# 多媒体API必须存在
ls /usr/src/jetson_multimedia_api/

二、一键安装编译依赖

复制代码
sudo apt update
sudo apt install -y build-essential yasm nasm cmake git wget unzip pkg-config \
libx264-dev libx265-dev libmp3lame-dev libpulse-dev libv4l-dev libnuma-dev \
libegl1-mesa-dev libtool

三、安装 NVIDIA NVCODEC 头文件(通用 nvenc/nvdec 支持)

复制代码
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
sudo make install
cd ..

四、编译 Jetson-NVMPI 底层库(关键,启用 Orin 硬件多媒体引擎)

复制代码
git clone https://github.com/Keylost/jetson-ffmpeg.git
cd jetson-ffmpeg
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
# 更新动态链接库
sudo ldconfig
# 验证nvmpi是否安装成功
pkg-config --libs nvmpi
# 输出 -L/usr/local/lib -lnvmpi 即为正常
cd ../../

五、下载 FFmpeg 源码 + 打 Orin 硬件加速补丁(FFmpeg 6.0 稳定版)

复制代码
# 拉取FFmpeg 6.0
git clone git://source.ffmpeg.org/ffmpeg.git -b release/6.0 --depth=1
cd ffmpeg

# 下载对应nvmpi补丁
wget -O ffmpeg_nvmpi.patch https://github.com/Keylost/jetson-ffmpeg/raw/master/ffmpeg_patches/ffmpeg6.0_nvmpi.patch
# 打入补丁
git apply ffmpeg_nvmpi.patch

六、Configure 编译配置(完整开启 Orin 硬件能力)

复制代码
./configure \
--prefix=/usr/local/ffmpeg-orin \
--enable-shared --enable-static \
--enable-gpl --enable-nonfree --enable-version3 \
# NVMPI Jetson专属硬编解码
--enable-nvmpi \
# 通用CUDA/NVENC/NVDEC
--enable-cuda --enable-cuvid --enable-nvenc --enable-nvdec --enable-libnpp \
# 软件编码兜底
--enable-libx264 --enable-libx265 --enable-libmp3lame \
# 音频/滤镜
--enable-libpulse --enable-swresample --enable-swscale --enable-filter \
# V4L2摄像头采集
--enable-libv4l2 \
# CUDA路径
--extra-cflags="-I/usr/local/cuda/include -I/usr/src/jetson_multimedia_api/include" \
--extra-ldflags="-L/usr/local/cuda/lib64 -L/usr/lib/aarch64-linux-gnu/tegra -lnvbuf_utils"

参数说明

  • --enable-nvmpi:Orin 硬件 H264/H265 硬编解码(多路摄像头首选)
  • --enable-nvenc/nvdec:标准 GPU 硬件编解码
  • --prefix:安装目录,便于多版本隔离

七、编译 + 安装

复制代码
# 多核编译,nproc自动匹配CPU核心
make -j$(nproc)
sudo make install

八、系统环境配置(永久生效)

1. 添加环境变量

复制代码
echo 'export PATH=/usr/local/ffmpeg-orin/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/ffmpeg-orin/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

2. 系统全局动态链接

复制代码
sudo echo "/usr/local/ffmpeg-orin/lib" > /etc/ld.so.conf.d/ffmpeg-orin.conf
sudo ldconfig

九、验证 FFmpeg 硬件加速是否生效

1. 查看支持的硬件编解码器

复制代码
ffmpeg -encoders | grep nv
ffmpeg -decoders | grep nv

正常输出:

  • h264_nvmpihevc_nvmpi(Jetson 专属硬编)
  • h264_nvenchevc_nvench264_cuvid

2. 硬件转码测试(NVMPI 硬解 + 硬编)

复制代码
# 本地视频硬转码
ffmpeg -c:v h264_nvmpi -i test.mp4 -c:v hevc_nvmpi -b:v 4M out_h265.mp4
# 纯GPU解码加速
ffmpeg -hwaccel cuda -i test.mp4 -c copy output.mp4

十、Orin 常用工程命令(自动驾驶 / 多路摄像头场景)

1. V4L2 摄像头采集 + NVMPI 硬编码本地保存

复制代码
ffmpeg -f v4l2 -s 1920x1080 -r 30 -i /dev/video0 \
-c:v h264_nvmpi -preset p4 -b:v 6M camera_rec.h264

2. RTMP 低延迟推流(多路摄像头主流方案)

复制代码
ffmpeg -re -c:v h264_nvmpi -i camera_rec.h264 \
-c:v h264_nvmpi -b:v 4000k -f flv rtmp://xxx/live/stream

3. 视频抽帧(GPU 解码,不占用 CPU)

复制代码
ffmpeg -hwaccel cuda -i input.mp4 -vf fps=10 frame_%06d.jpg

4. 多路视频拼接 + 硬件编码输出

复制代码
ffmpeg \
-hwaccel cuda -i cam1.mp4 \
-hwaccel cuda -i cam2.mp4 \
-filter_complex "[0:v][1:v]hstack" \
-c:v h264_nvmpi out_concat.mp4

十一、C++ 调用 FFmpeg libav 示例(最小可运行代码)

CMakeLists.txt

复制代码
cmake_minimum_required(VERSION 3.16)
project(ffmpeg_orin_demo)
set(CMAKE_CXX_STANDARD 17)

# FFmpeg路径
set(FFMPEG_PREFIX "/usr/local/ffmpeg-orin")
include_directories(${FFMPEG_PREFIX}/include)
link_directories(${FFMPEG_PREFIX}/lib)

add_executable(demo main.cpp)
target_link_libraries(demo
    avformat avcodec avutil swscale swresample avfilter
    -lnvmpi -lnvbuf_utils
)

main.cpp(硬件解码读取视频帧)

复制代码
#include <iostream>
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/hwaccel.h>
}

int main() {
    av_register_all();
    avformat_network_init();

    AVFormatContext* fmt_ctx = nullptr;
    if (avformat_open_input(&fmt_ctx, "test.mp4", nullptr, nullptr) < 0) {
        std::cerr << "open file failed" << std::endl;
        return -1;
    }
    avformat_find_stream_info(fmt_ctx, nullptr);

    int v_stream_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0);
    AVStream* v_stream = fmt_ctx->streams[v_stream_idx];
    AVCodec* dec = avcodec_find_decoder_by_name("h264_nvmpi");
    AVCodecContext* dec_ctx = avcodec_alloc_context3(dec);
    avcodec_parameters_to_context(dec_ctx, v_stream->codecpar);

    // 开启Orin硬件解码
    AVDictionary* opts = nullptr;
    av_dict_set(&opts, "hwaccel", "cuda", 0);
    avcodec_open2(dec_ctx, dec, &opts);

    std::cout << "FFmpeg Orin 硬件解码器初始化成功" << std::endl;

    // 释放资源
    av_dict_free(&opts);
    avcodec_free_context(&dec_ctx);
    avformat_close_input(&fmt_ctx);
    return 0;
}

十二、常见问题排错

  1. 找不到 nvmpi

    复制代码
    sudo ldconfig
    pkg-config --libs nvmpi
  2. configure 提示 cuda 头文件缺失

    复制代码
    export PATH=/usr/local/cuda/bin:$PATH
  3. 运行 ffmpeg 提示 libavxxx.so 找不到

    复制代码
    source ~/.bashrc
    sudo ldconfig
  4. Orin Nano 无 NVENC Orin Nano 仅支持 NVDEC 硬解,编码只能用libx264软编码,去掉--enable-nvmpi改用libx264

十三、打包部署(离线部署到多台 Orin)

编译完成后打包安装目录,拷贝到其他 Orin 设备:

复制代码
# 打包
tar -zcvf ffmpeg-orin.tar.gz /usr/local/ffmpeg-orin
# 目标设备解压
sudo tar -zxvf ffmpeg-orin.tar.gz -C /usr/local/
# 执行环境配置步骤八即可
相关推荐
阿拉斯攀登1 天前
售货柜实战:IPC 拉流 → 抽帧 → YOLO 识别完整流水线
yolo·ffmpeg·音视频·webrtc·视频编解码
阿拉斯攀登1 天前
RTSP 拉流与录制:IPC 摄像头本地录像完整方案
ffmpeg·音视频·webrtc·实时音视频·视频编解码
坐望云起2 天前
FFmpeg.wasm 纯浏览器端视频压缩与格式转换实战:零服务器、零上传、100% 隐私
服务器·ffmpeg·wasm
阿拉斯攀登2 天前
FFmpeg 转码详解:封装格式、编码器、码率控制
ffmpeg·音视频·webrtc·实时音视频·视频编解码
阿拉斯攀登2 天前
FFmpeg 入门:命令行的 20 个常用场景
ffmpeg·音视频·webrtc·视频编解码
luoyayun3613 天前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
薄荷椰果抹茶4 天前
计算机导论_第6章_笔记
笔记·ffmpeg
FlightYe5 天前
FFmpeg移动端硬解机制
linux·网络·ffmpeg·音视频·实时音视频·视频编解码
小殊小殊6 天前
一文速通GPU版FFmpeg视频转码的安装使用
ffmpeg·音视频·视频编解码