ffmpeg使用NVIDIA Jeston Xavier NX 硬编码

一,需求

NX的板子外接相机,使用opencv从共享内存中取图 转化成Mat,之后利用ffmpeg进行h264编码,然后推送到rtmp服务器。开始使用cpu软编码,占用cpu在150%左右。先改用GPU的 NVENC芯片进行硬编码,cpu占用降到了80%。

二,实现

环境搭建:

(1),libnvmpi安装

​
git clone GitHub - jocover/jetson-ffmpeg: ffmpeg support on jetson nano

cd jetson-ffmpeg

mkdir build

cd build

cmake ..

make

sudo make install

sudo ldconfig

​

备注:需要修改 CMakeList.txt 中jetson_multimedia_api  引用的位置,如  /usr/environment/jetson_multimedia_api 。

(2),x264软编码器安装

git clone https://gitee.com/mirrors/x264/tree/stable/
./configure --enable-static --enable-shared --enable-debug --prefix=./bin
make
make install

(3),ffmpeg安装

1,下载 源码:git clone git://source.ffmpeg.org/ffmpeg.git -b release/4.2 --depth=1
cd ffmpeg
2,下载 补丁文件:https://github.com/jocover/jetson-ffmpeg/blob/master/ffmpeg_nvmpi.patch
3,打补丁:git apply ffmpeg_nvmpi.patch
4,配置编译选项:./configure --enable-shared --enable-static  --enable-libx264  --enable-gpl      --enable-nvmpi --prefix=./bin
5,编译:  make
6,安装:  make install

备注:x264 和ffmpeg 都安装到了当前的bin 路径下,之后在将bin中的内容拷贝到/usr/local/下使用。 并且都生成了静态库。

使用:

CMakeLists.txt 中 引用静态库,注意库的引用顺序:

target_link_libraries(${TARGET_NAME} PRIVATE   libavformat.a libavcodec.a libx264.a libnvmpi.a  libavfilter.a  libavutil.a libavdevice.a  libswscale.a libswresample.a )

代码部分:

AVCodec* videoCodec = avcodec_find_encoder_by_name("h264_nvmpi");
if (!videoCodec) {
      cout << "InitVideoCodec 获取编码器出错" << endl;
      return false;
}
// 创建编码器上下文
 videoCodecContext = avcodec_alloc_context3(videoCodec);
 if (!videoCodecContext) {
       cout << "InitVideoCodec 获取编码器上下文出错" << endl;
       return false;
 }

ffmpeg使用NVIDIA Jeston Xavier NX 硬编码_第1张图片

 参考:GitHub - jocover/jetson-ffmpeg: ffmpeg support on jetson nano

Jetson Linux API Reference: 01_video_encode (video encode) | NVIDIA Docs

你可能感兴趣的:(音视频,ffmpeg,硬编码,Xavier,NX,硬编码)