一,需求
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;
}
参考:GitHub - jocover/jetson-ffmpeg: ffmpeg support on jetson nano
Jetson Linux API Reference: 01_video_encode (video encode) | NVIDIA Docs