当前位置: 首页 > news >正文

OpenRTP 传输增加OpenRTPServer

开源地址

最近增加了OpenRTPServer, 已经修改完成一版放在了目录下,window和linux下编译都成功了,不过由于修改代码CMakefile 需要修改,先放放

OpenRTP开源地址

vlc得纠错传输方式

我发现我代码写错以后,vlc 依然能够从错误的RTP包中解出关键信息 sps 和 pps ,这一点vlc 确实做得前无古人,后无来者,由于纠错他也多费了一些资源,但对于越来越强大得cpu 和 gpu 来说,感觉并不是不行,所以OpenRTP 需要加强包纠错能力

修改代码

在这里插入图片描述
桌面端口为6004,

   if (pkt != NULL){bool isKeyframe = pkt->flags & AV_PKT_FLAG_KEY;GETALLPointAnalyseNalu(pkt->data, pkt->size, &sps, spslen, &pps, ppslen, &se, selen, &frame, framelen);uint32_t ts = convertToRTPTimestamp();if (isKeyframe && sps != NULL && pps!=NULL){pos = GETPointRemoveStartcode(sps, spslen, retlen);v_rtp_desktop.send_video(pos, retlen, ts, isKeyframe);pos = GETPointRemoveStartcode(pps, ppslen, retlen);v_rtp_desktop.send_video(pos, retlen, ts, isKeyframe);}pos = GETPointRemoveStartcode(frame, framelen, retlen);v_rtp_desktop.send_video(pos, retlen, ts, isKeyframe);av_packet_free(&pkt);}

由于RTP协议并不发送 00 00 00 01 得startcode,但是我写手误将第一个sps发送写成了sps开头,而不是实际探测出来得pos位置,所以接收器接收不到画面。修改代码如下:

       v_rtp_desktop.send_video(sps, retlen, ts, isKeyframe);//改成v_rtp_desktop.send_video(pos, retlen, ts, isKeyframe);

这样接收器正常接收
在这里插入图片描述
接收器换成端口6004,正常播放。接收存储得h264文件也正常播放

区别

但vlc 在错误包得情况下,探测一段时间后,强力纠错,将桌面放出来了, 虽然有时候探测不到,放不出来,在尝试几次后,概率百分之50以后能够播放,这个佩服,确实在vlc团队这上面用了心,希望自己能好好向他们学习。

增加OpenRTPserver

在这里插入图片描述

这次增加了OpenRTPServer,协议为RTMP ,HTTP协议,websocket协议, RTP协议直传,ps流RTP协议直传,ts流RTP协议直传,RTMP转发,RTP bridge 协议, 规划增加ssdp协议,dlna 协议,最后是要增加三维场景传输,也就是像素流传输,当然OpenRTPServer自身已经携带得RTMP协议,是为了让使用tcp 得程序能够直接拉流,或者转成web端直接播放。

udp桥接转发

在这里插入图片描述

	uint16_t port_udp = 6000;std::string port_udp_ip = "127.0.0.1";uint16_t port_udp_bridge = 8000;c_udpserver::getInstance()->start(port_udp, port_udp_ip, port_udp_bridge);

如代码所示,udp接收端口6000, 转发到8000,而receiver接收在8000,正常收流

成熟度

注意,OpenRTPServer 还没有成熟,代码在linux上编译也通过了,通过了一阶段得RTMP 协议测试,不过代码一直在改,增加RTP直传和排序代码等等,CMakeLists文件已经错误了,先放下这个,主要还是在调试问题上面,主要像通过这样得方式能够找到程序员们一起合作。

在这里插入图片描述
采用此种方式得原因是推流转储后,Receiver不直接进行主动拉流,而在于接收流进行下一步得动作。

OpenRTPServer 存储和解码

OpenRTPServer增加解码方式将会增加各类硬件解码,为了让代码更容易编译,并不直接增加解码,而是通过调用动态库进行解码,解码后得数据统一为nv12 和 BGR24方式。

在这里插入图片描述
上图为经过发送器到OpenRTPServer, OpenRTPServer 提供rtmp 转flv到网页,再次通过OpenRtpServer转发到RtpReceive ,测试程序整个流通是成功得。现在最重要得是再OpenRtpServer上解码,传递给python,以及存储成DBAI,DBAI得意思是要将很多识别物体存储到db中,元数据和识别号码等存储到数据库中,这里得数据库我会自己编写,并不使用现有得数据库,可能有些工作量

发送器得音频

发送器得音频刚加上系统音频,只是为了做直播得程序员能够比较方便地做出像obs这样得软件,前面得音频也只是采集了话筒,也只是在windows上测试而已,各类兼容还没有开始,有很多不到之处。

后续

一直在找合作,希望能做出像vlc, obs, ffmpeg这样良好得作品,考虑了很多,望大家加入。

http://www.lryc.cn/news/470090.html

相关文章:

  • 使用vue3+cesium+earthsdk+supermap实现通视分析(有版本报错问题)
  • python 轮子是什么
  • 农作物大豆病虫害识别分类数据集(猫脸码客第227期)
  • 如何在算家云搭建GPT-SOVITS(语音转换)
  • ThinkPad T480拆机屏幕改装:便携式显示器DIY指南
  • C++ (8) C++11及更新特性:探索魔法新领域
  • 【vue】Mammoth.js的使用:将.docx和doc 文件转换成HTML
  • HarmonyOS介绍 第一课习题答案
  • c/c++ stdcall cdel fastcall等函数调用约定说明
  • 【ROS概述】概念及环境搭建
  • MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询
  • java核心技术点都有哪些
  • 4404 - 提高:二分与三分:曲线(三分)
  • 软件工程--需求分析与用例模型
  • 预测房价学习
  • 电脑无法上网,但是微信、QQ可以正常使用
  • C++11新特性(列表初始化与右值引用折叠与完美转发)
  • 基于SSH的物流运输货运车辆管理系统源码
  • 基于RabbitMQ,Redis,Redisson,RocketMQ四种技术实现订单延时关闭功能及其相关优缺点介绍(以12306为主题)
  • HarmonyOS ArkTS与C++数据类型转换
  • 腾讯云或阿里云centos7安装Redis,并解决端口无法访问的问题
  • 【小问题】距离估计和频率估计的方差下界推导出距离估计的方差下界
  • Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容
  • Z-BlogPHP显示错误Undefined array key 0 (set_error_handler)的解决办法
  • java-实例化一个List,然后添加数据的方法详解
  • 【Linux系统】Ubuntu的简单操作
  • 标准日志插件项目【C/C++】
  • SpingBoot原理
  • Cout输出应用举例
  • java的无锁编程和锁机制