当前位置:网站首页>RTP GB28181 文件测试工具
RTP GB28181 文件测试工具
2022-07-06 04:35:00 【qianbo_insist】
以下情况时使用了GB28181 中 udp发送视频流的情况,有的相机udp丢包比较严重,有的可以,对有问题的相机着重进行分析
read ps
RTP测试工具进一步升级
今天写了一段程序,为了解决花屏的问题,需要知道问题到底在哪里,保存了几百个ps文件,然后读出按照流程保存成h264文件,使用vlc 工具读,有简单跳帧。
int main_ps()
{
int meetkeyframe = 0;
const char* buffer = "j:/ps/h264save%d.264";
char filename[128];
uint8_t* h264buffer = new uint8_t[1024 * 500];
int h264length = 0;
int skip = 0;
FILE* fpw = fopen("j:/out1.264", "wb");
for (int i = 0; i < 2855; i++)
{
sprintf(filename, buffer, i);
FILE* fp = fopen(filename, "rb");
if (fp != NULL)
{
fseek(fp, 0, SEEK_END);
long len = ftell(fp);
fseek(fp, 0, SEEK_SET);
//fread(pp, sizeof(char) * 4, 1, fp);
uint8_t* data = new uint8_t[len];
fread(data, len, 1, fp);
if (*data == 0x00 && *(data + 1) == 0x00 && *(data + 2) == 0x01 && *(data + 3) == 0xba)
{
GetH264FromPs((char*)data, len, (char*)h264buffer, &h264length);
if (h264length > 0)
{
if (meetkeyframe == 0)
{
uint8_t* pos = h264buffer + 4;
if ((*pos & 0x1f) == 0x07)
meetkeyframe = 1;
}
if (meetkeyframe == 1)
{
std::cout << "the length "<<len<< "--" << h264length << std::endl;
fwrite(h264buffer, h264length, 1, fpw);
}
else
{
std::cout << "skip num" << skip++ << std::endl;
}
}
}
std::cout << "the file of" << i << std::endl;
fclose(fp);
}
}
fclose(fpw);
return 0;
}

read rtp
为了进一步确定问题,读了1万6000个RTP包存储成文件,在存储成h264看情况如何
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "../libRtpReceive/analysevideo.h"
#include "../libRtpReceive/c_rtp.h"
s_rtp_context g_ctx;
//解ps流,qianbo 请按照这条路走下去
int live_rtp_unpack_ps(s_rtp_context* ctx, uint8_t* payload, int payloadlen, uint32_t ssrc)
{
uint8_t* buffer = ctx->v_buffer;
int& buflen = ctx->v_len;
//analyse_struct &as = ctx->v_as;
#define D(x) *(payload+x)
if (D(0) == 0x00 && D(1) == 0x00 && D(2) == 0x01 && D(3) == 0xc0)
{
//(音频数据包)
//std::cout << "audio packet" << std::endl;
return 0;
}
if (D(0) == 0x00 && D(1) == 0x00 && D(2) == 0x01 && D(3) == 0xba)
{
if (buflen > 0)//数据已经凑齐,可以发送或者显示
{
#define B(x) *(buffer+x)
if (B(0) == 0x00 && B(1) == 0x00 && B(2) == 0x01 && B(3) == 0xba)
{
int h264length = 0;
uint8_t* h26xbuffer = new uint8_t[buflen];
GetH264FromPs((char*)buffer, buflen, (char*)h26xbuffer, &h264length);
if (h264length > 0)
{
if (g_ctx.v_meet_keyframe == 0)
{
uint8_t* pos = h26xbuffer + 4;
if ((*pos & 0x1f) == 0x07)
g_ctx.v_meet_keyframe = 1;
}
if (g_ctx.v_meet_keyframe == 1)
{
if (g_ctx.fwp == NULL)
g_ctx.fwp = fopen("j:/out2.264","wb");
//std::cout << "the length " << len << "--" << h264length << std::endl;
fwrite(h26xbuffer, h264length, 1, g_ctx.fwp);
}
else
{
//std::cout << "skip num" << skip++ << std::endl;
}
}
if (ctx->v_meet_keyframe == 0)
{
//写入文件
}
delete[]h26xbuffer;
}
buflen = 0;
}
}
//合帧
std::memcpy(buffer + buflen, payload, payloadlen);
buflen += payloadlen;
return 0;
}
int ReadRTPPacket(uint8_t* data, int dlen)
{
RTPFrame_ frame(data, (int)dlen);
uint8_t* payload = frame.GetPayloadPtr();
int payloadlen = frame.GetPayloadSize();
uint32_t timestamp = frame.GetTimestamp();
rtp_header* rtp = (rtp_header*)data;
//big(net) to little(home)
uint32_t ssrc = b2l(rtp->ssrc);
#define D(x) *(payload+x)
//if (ctx->v_is_ps == -1)//未曾确定是否ps流
if (D(0) == 0x00 && D(1) == 0x00 && D(2) == 0x01 && D(3) == 0xba)
{
//std::cout << " the stream is " << stream << std::endl;
g_ctx.v_ssrc = ssrc;
g_ctx.v_is_ps = 1;
}
if (g_ctx.v_is_ps == 1)
{
uint16_t nowseq = frame.GetSequenceNumber();
std::cout << "seq:" << nowseq << " ";
if (nowseq - g_ctx.v_last_sequenceNum != 1)
{
std::cout << "not continue seq "<< nowseq - g_ctx.v_last_sequenceNum <<std::endl;
}
g_ctx.v_last_sequenceNum = frame.GetSequenceNumber();
g_ctx.v_payloadtype = frame.GetPayloadType();
live_rtp_unpack_ps(&g_ctx, payload, payloadlen, ssrc);
}
return 0;
}
int main()
{
const char* buffer = "j:/rtp/h264saveRTP%d.264";
char filename[128];
uint8_t* h264buffer = new uint8_t[1024 * 500];
int h264length = 0;
int skip = 0;
//FILE* fpw = fopen("j:/out2.264", "wb");
for (int i = 0; i < 16445; i++)
{
sprintf(filename, buffer, i);
FILE* fp = fopen(filename, "rb");
if (fp != NULL)
{
fseek(fp, 0, SEEK_END);
long len = ftell(fp);
fseek(fp, 0, SEEK_SET);
//fread(pp, sizeof(char) * 4, 1, fp);
uint8_t* data = new uint8_t[len];
fread(data, len, 1, fp);
ReadRTPPacket(data, len);
//std::cout <<i <<" ";
fclose(fp);
}
}
if(g_ctx.fwp!=NULL)
fclose(g_ctx.fwp);
}
通过打印RTP包的sequence number,相减后发现,丢包较多,平均每隔一定的时间会丢3-4个RTP包,有时会丢掉几十个,上几百个包,乱序的情况比较少,有一次,通过seq number相减后会得到负数。
RTP工具以后会同时增加分析RTP协议的可视化。
边栏推荐
- Visio draws Tai Chi
- The implementation of the maize negotiable digital warehouse receipt standard will speed up the asset digitization process of the industry
- MySQL reported an error datetime (0) null
- MIT CMS. 300 session 8 – immersion / immersion
- MySQL learning record 13 database connection pool, pooling technology, DBCP, c3p0
- 1008 circular right shift of array elements (20 points)
- Unity screen coordinates ugui coordinates world coordinates conversion between three coordinate systems
- Fedora/rehl installation semanage
- npm命令--安装依赖包--用法/详解
- Implementation of knowledge consolidation source code 2: TCP server receives and processes half packets and sticky packets
猜你喜欢

MySQL learning record 13 database connection pool, pooling technology, DBCP, c3p0

The most detailed and comprehensive update content and all functions of guitar pro 8.0

In depth MySQL transactions, stored procedures and triggers

食品行业仓储条码管理系统解决方案

Certbot failed to update certificate solution

How to estimate the population with samples? (mean, variance, standard deviation)

Visio draws Tai Chi

Lora gateway Ethernet transmission

题解:《单词覆盖还原》、《最长连号》、《小玉买文具》、《小玉家的电费》

11. Intranet penetration and automatic refresh
随机推荐
POI add border
BOM - location, history, pop-up box, timing
HotSpot VM
2/13 review Backpack + monotonic queue variant
SharedPreferences 源码分析
Database - MySQL storage engine (deadlock)
Explain in simple terms node template parsing error escape is not a function
满足多元需求:捷码打造3大一站式开发套餐,助力高效开发
捷码赋能案例:专业培训、技术支撑,多措并举推动毕业生搭建智慧校园毕设系统
729. 我的日程安排表 I(set or 动态开点线段树)
[Zhao Yuqiang] deploy kubernetes cluster with binary package
I'd like to ask about the current MySQL CDC design. In the full volume phase, if a chunk's binlog backfill phase,
Fedora/REHL 安装 semanage
When debugging after pycharm remote server is connected, trying to add breakpoint to file that does not exist: /data appears_ sda/d:/segmentation
CADD course learning (7) -- Simulation of target and small molecule interaction (flexible docking autodock)
Can CDC pull the Oracle table in full
The implementation of the maize negotiable digital warehouse receipt standard will speed up the asset digitization process of the industry
【HBZ分享】云数据库如何定位慢查询
View 工作流程
Stable Huawei micro certification, stable Huawei cloud database service practice