开源地址
最近增加了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;
GETALLPoint
AnalyseNalu(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这样良好得作品,考虑了很多,望大家加入。