RK3568笔记二十九:RTMP推流

若该文为原创文章,转载请注明原文出处。

基于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文件,需要把文件拷贝到板子和可执行程序的同级目录下

公网测试结果


 

如有侵权,或需要完整代码,请及时联系博主。

相关推荐

  1. RK3568笔记三:Zlmedia测试

    2024-06-07 06:46:04       50 阅读
  2. 一套rk3588 rtsp服务器的 github 方案及记录 -02

    2024-06-07 06:46:04       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 06:46:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 06:46:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 06:46:04       82 阅读
  4. Python语言-面向对象

    2024-06-07 06:46:04       91 阅读

热门阅读

  1. 【SCSS】use的详细使用规则

    2024-06-07 06:46:04       31 阅读
  2. AR编程入门:解锁虚拟与现实交融的新世界

    2024-06-07 06:46:04       34 阅读
  3. spring boot 之 整合 knife4j 在线接口文档

    2024-06-07 06:46:04       25 阅读
  4. Sass混合宏(Mixins)使用

    2024-06-07 06:46:04       32 阅读
  5. Android中ANR的分析和解决

    2024-06-07 06:46:04       25 阅读
  6. 人机验证问题库

    2024-06-07 06:46:04       27 阅读
  7. Pytorch语义分割(2)--------模型搭建

    2024-06-07 06:46:04       32 阅读
  8. ChatGPT-3

    2024-06-07 06:46:04       31 阅读