FFmpeg 是一套开源、跨平台、全能的音视频处理工具集,由 C 语言开发,免费开源(LGPL/GPL 协议),几乎所有音视频相关软件底层都依赖它:
- FF = Fast Forward(快进)
- mpeg = 常见视频编码标准 MPEG
四大核心组件
-
ffmpeg(命令行主程序) 最常用工具,负责转码、剪辑、拼接、压缩、录屏、水印、格式转换 等所有音视频操作。 示例简单命令:把 mp4 转成 mov
ffmpeg -i input.mp4 output.mov -
ffplay(播放器) 极简命令行播放器,不用装第三方播放器就能播放视频、音频。
-
ffprobe(媒体信息查看工具) 读取视频编码、分辨率、码率、时长、声道、字幕等元数据,多用于自动化脚本分析媒体文件。
-
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 硬件编解码)
- 硬件:Jetson AGX Orin / Orin NX / Orin Nano
- 系统:JetPack 5.x/ 6.x(L4T r35/r36),已预装 CUDA、Jetson Multimedia API
- 两种硬编方案:
- nvmpi:Jetson 专属,多路摄像头 / 低延迟首选(推荐自动驾驶、多路推流)
- nvenc/nvdec:通用 GPU 硬件编解码,PC/Orin 通用
- 全程脚本化,复制即可一键执行;附验证、推流、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_nvmpi、hevc_nvmpi(Jetson 专属硬编)h264_nvenc、hevc_nvenc、h264_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;
}
十二、常见问题排错
-
找不到 nvmpi
sudo ldconfig pkg-config --libs nvmpi -
configure 提示 cuda 头文件缺失
export PATH=/usr/local/cuda/bin:$PATH -
运行 ffmpeg 提示 libavxxx.so 找不到
source ~/.bashrc sudo ldconfig -
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/
# 执行环境配置步骤八即可