Jetson Xavier NX developing with FFmpeg


一、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代替即可,其他都是常规的参数。
常用命令


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值