若该文为原创文章,转载请注明原文出处。
基于RK3568的RTMP推流测试,此代码是基于勇哥的github代码修改的,源码地址MontaukLaw/3568_rknn_rtmp: rk3568的推理+推流 (github.com)
感兴趣的可以clone下来测试。
也可以下载修改后的代码测试。Yinyifeng18/rk3568_rknn_rtmp: 正点原子RK3568 RTMP公网推流 (github.com)
此代码可以在正点原子的ATK-DLRK3568板子直接运行。
推流主要是参考雷神的RTMP推流代码:simplest_ffmpeg_streamer: 最简单的基于FFmpeg的推流器(推送RTMP) (gitee.com)
一、介绍
RTMP推流器(Streamer)的在流媒体系统中的作用可以用下图表示。首先将视频数据以RTMP的形式发送到流媒体服务器端(Server,比如FMS,Red5,Wowza等),然后客户端(一般为Flash Player)通过访问流媒体服务器就可以收看实时流了。
运行本程序之前需要先运行RTMP流媒体服务器,并在流媒体服务器上建立相应的Application。有关流媒体服务器的操作不在本文的论述范围内,在此不再详述。本程序运行后,即可通过RTMP客户端(例如 Flash Player, FFplay等等)收看推送的直播流。
二、注意
1、封装格式
RTMP采用的封装格式是FLV。因此在指定输出流媒体的时候需要指定其封装格式为“flv”。同理,其他流媒体协议也需要指定其封装格式。例如采用UDP推送流媒体的时候,可以指定其封装格式为“mpegts”。
2、延时
发送流媒体的数据的时候需要延时。不然的话,FFmpeg处理数据速度很快,瞬间就能把所有的数据发送出去,流媒体服务器是接受不了的。因此需要按照视频实际的帧率发送数据。
3、PTS/DTS问题
没有封装格式的裸流(例如H.264裸流)是不包含PTS、DTS这些参数的。在发送这种数据的时候,需要自己计算并写入AVPacket的PTS,DTS,duration等参数
4、音视频同步
此代码只有视频没有音频,后续会增加音频,待增加。
三、推流流程图
四、RK3568推流流程
1、初始化编码器
编码器使用的是MPP
void init_encoder(int w, int h, int fps);
2、加载参数
int load_hyperm_param(MODEL_INFO *m, int argc, char **argv);
3、打开摄像头
cv::VideoCapture cap(0);
4、启动新线程,用于YOLOV5推理
pthread_create(&rknn_thread, NULL, rknn_process, NULL);
3、初始化rtmp
init_rtmp_connection("rtmp_sample.h264", "rtmp://159.75.182.56/live/livestream?secret=334a72b548e8443fa51531391bfe2a2f",
VIDEO_WIDTH, VIDEO_HEIGHT, 20);
5、读取视频流
cap.read(orig_img);
6、复制数据,用于推理
cv::cvtColor(orig_img, buf_img, cv::COLOR_BGR2RGB);
7、进行h264编码
encode_rgb_image_to_h264((char *)orig_img.data, VIDEO_HEIGHT * VIDEO_WIDTH * 3, h264_data, &h264_len);
8、发送到服务器
send_to_rtmp_server((uint8_t *)h264_data, h264_len, time_stamp); // 20000;
基本流程如上,具体查看代码。
五、MPP编译
通过勇哥知道,才知道MPP分为两下,一个是NPU用于RKNN的,一个是RK的。两个是不同的,增加了见识。
1、下载
git clone https://github.com/rockchip-linux/mpp.git
mpp具体用法看doc下的Rockchip_Developer_Guide_MPP_CN.md
MPP源代码编译脚本为cmake,需要依赖2.8.12以上的版本,建议使用3.x版。cmake-3.28版本验证通过。
使用高版本的cmake工具可能会产生较多的warning。
先配置build/linux/arm/目录下arm.linux.cross.cmake文件里的工具链,
再运行make-Makefiles.bash脚本通过cmake生成Makefile,最后运行make –j16进行编译。
6、项目编译测试
编译前需要修改CMakeLists.txt和交叉编译工具链,
1、CMakeLists.txt修改
修改路径,主要是MPP,为编译好的MPP路径
2、交叉工具链
使用的是正点原子提供的,需要根据自己安装路径修改。
3、测试结果
运行时需要rtmp_sample_h264.h264文件,需要把文件拷贝到板子和可执行程序的同级目录下
公网测试结果
如有侵权,或需要完整代码,请及时联系博主。