FFmpeg - Jetson Orin 实战部署

📅 2026/7/10 11:06:48
FFmpeg - Jetson Orin 实战部署
FFmpeg 是一套开源、跨平台、全能的音视频处理工具集由 C 语言开发免费开源LGPL/GPL 协议几乎所有音视频相关软件底层都依赖它FF Fast Forward快进mpeg 常见视频编码标准 MPEG四大核心组件ffmpeg命令行主程序最常用工具负责转码、剪辑、拼接、压缩、录屏、水印、格式转换等所有音视频操作。 示例简单命令把 mp4 转成 movffmpeg -i input.mp4 output.movffplay播放器极简命令行播放器不用装第三方播放器就能播放视频、音频。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.xL4T r35/r36已预装 CUDA、Jetson Multimedia API两种硬编方案nvmpiJetson 专属多路摄像头 / 低延迟首选推荐自动驾驶、多路推流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 --depth1 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-nvmpiOrin 硬件 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 ~/.bashrc2. 系统全局动态链接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_nvmpiJetson 专属硬编h264_nvenc、hevc_nvenc、h264_cuvid2. 硬件转码测试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.h2642. RTMP 低延迟推流多路摄像头主流方案ffmpeg -re -c:v h264_nvmpi -i camera_rec.h264 \ -c:v h264_nvmpi -b:v 4000k -f flv rtmp://xxx/live/stream3. 视频抽帧GPU 解码不占用 CPUffmpeg -hwaccel cuda -i input.mp4 -vf fps10 frame_%06d.jpg4. 多路视频拼接 硬件编码输出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.txtcmake_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; }十二、常见问题排错找不到 nvmpisudo ldconfig pkg-config --libs nvmpiconfigure 提示 cuda 头文件缺失export PATH/usr/local/cuda/bin:$PATH运行 ffmpeg 提示 libavxxx.so 找不到source ~/.bashrc sudo ldconfigOrin Nano 无 NVENCOrin 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/ # 执行环境配置步骤八即可