一、Jetson Xavier NX
Jetson 不支持NVCDVID硬件解码,使用nvv4l2dec解码器,所以不能按编译nvcodecs的方法去编译ffmpeg,需要用另外的configure选项。
我是用Jetson Xavier NX的5.10.120-tegra内核跑的,但是不推荐用JP5,现在大部分的编译是用JP4,JP5废弃了一些库,导致在编译的时候要修改一些makefile
二、使用步骤
1.version
首先查看系统Version
head -n 1 /etc/nv_tegra_release
# R35 (release), REVISION: 4.1, GCID: 33958178, BOARD: t186ref, EABI: aarch64, DATE: Tue Aug 1 19:57:35 UTC 2023
uname -r
# 5.10.120-tegra
lsb_release -i -r
# Distributor ID: Ubuntu
# Release: 20.04
2.引入库
代码如下:
echo "deb https://repo.download.nvidia.com/jetson/ffmpeg main main" | sudo tee -a /etc/apt/sources.list
echo "deb-src https://repo.download.nvidia.com/jetson/ffmpeg main main" | sudo tee -a /etc/apt/sources.list
sudo apt update
sudo apt install autoconf automake build-essential pkg-config
sudo apt install libx264-dev libx265-dev libfreetype6-dev libv4l-dev zlib1g-dev
apt source ffmpeg
tar -xvf ffmpeg_4.2.7-nvidia.tar.xz
cd ffmpeg_4.2.7
./configure --prefix=/home/baker/build/ --disable-doc --enable-gpl --enable-libx265 --enable-libx264 --enable-libfreetype --enable-nvv4l2dec --enable-libv4l2 --extra-libs="-L/usr/lib/aarch64-linux-gnu/tegra -lnvbufsurface -lnvbufsurftransform" --extra-cflags="-I /usr/src/jetson_multimedia_api/include/"
sudo make
sudo make install
vim ~/.bashrc
export PATH=/home/baker/build/bin:$PATH
source ~/.bashrc
这里需要注意的是,JP5已经废弃NvBuffer APIs,所以网上很多案例是configure里的–extra-libs是链接 -lnvbuf_utils。进入/usr/lib/aarch64-linux-gnu/tegra/文件夹下ls,取代这个库的是libnvbufsurface.so和libnvbufsurftransform.so,所以相应的把这两个库加入链接
3.读入数据
编译完成后,ffmpeg -hwaccels 通过 ffmpeg -codecs | grep h264查看支持H264编解码方式,DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_nvv4l2dec ) (encoders: libx264 libx264rgb h264_v4l2m2m ),会发现NVIDIA ffmpeg包支持硬件解码,不支持硬件编码。看看在Jetson平台上支持硬件编解码要另寻他途。
4.引入nvmpi库
git clone https://github.com/Keylost/jetson-ffmpeg.git
cd jetson-ffmpeg
mkdir build
# 或者
git clone https://github.com/jocover/jetson-ffmpeg.git
cd jetson-ffmpeg
mkdir build
此处JP5也一样需要修改cmake选项,在jetson-ffmpeg文件夹下的CMakeLists.txt文件中,可以看到LIBNVBUF选项关联到libnvbuf_utils.so的库,因此要删除两行和LIBNVBUF有关的set,不然cmake会编译报错。
接着继续编译
cd build
cmake ..
make -j6
make install
ldconfig
然后将/jetson-ffmpeg/ffmpeg_patches/文件夹下的补丁放入ffmpeg中,注意版本
cd ../ffmpeg_patches
cp ffmpeg4.2_nvmpi.patch ~/sources/ffmpeg_4.2.7
cd ~/sources/ffmpeg_4.2.7
git apply ffmpeg_patches
# 以下是执行结果
ffmpeg4.2_nvmpi.patch:249: trailing whitespace.
ffmpeg4.2_nvmpi.patch:271: trailing whitespace.
ffmpeg4.2_nvmpi.patch:351: trailing whitespace.
ffmpeg4.2_nvmpi.patch:353: trailing whitespace.
ffmpeg4.2_nvmpi.patch:359: trailing whitespace.
warning: squelched 21 whitespace errors
warning: 26 lines add whitespace errors.
5.编译ffmpeg
./configure --prefix=/home/baker/build/ --disable-doc --enable-gpl --enable-libx265 --enable-libx264 --enable-libfreetype --enable-nvv4l2dec --enable-libv4l2 --extra-libs="-L/usr/lib/aarch64-linux-gnu/tegra -lnvbufsurface -lnvbufsurftransform -lnvv4l2 -L/usr/local/lib" --extra-cflags="-I /usr/src/jetson_multimedia_api/include/ -I /usr/local/include/" --enable-nvmpi
sudo make
sudo make install
# 后续配置
sudo gedit /etc/ld.so.conf.d/ffmpeg.conf
# 打开为空文件后加入下述内容,然后保存退出
/home/baker/build
:wq
这里extra额外链接了 -lnvv4l2 和jetson-ffmpeg所在install文件夹
不然会出现
ERROR: nvmpi not found using pkg-config
ffmpeg -codecs | grep h264 可以看到DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_nvmpi) (encoders: h264_nvmpi libx264 libx264rgb h264_v4l2m2m )
结果中带有h264_nvmpi
测试硬解码:
ffmpeg -c:v h264_nvmpi -rtsp_transport tcp -i rtsp -hls_time 10 -hls_list_size 1 -hls_flags delete_segments -f hls index.m3u8
成功
其他指令参考: 音视频学习之ffmpeg常用基础命令整理
要注意的是,这是用cuda的cuvid扩展库编译的ffmpeg,jetson上不支持 hwaccel cuvid,具体可以去NVIDIA官网看他支持的显卡型号。-c:v 我们就用h264_nvmpi代替即可,其他都是常规的参数。