犹豫很久终于写仍然了,从海康摄像头的ps流中提取h264原始数据
时间:2024-01-16 12:19:46
二进位后面2个字符的十进位值,比如00 2a,就可以写到成:假如你不太可能发现0x00 00 01 e0开始二进位,if(buff[k]==0x00 AndrewAndrew buff[k+1]==0x00 AndrewAndrew buff[k+2]==0x01 AndrewAndrew buff[k+3]==0xE0){ //只不过就是第5位,第6位,算出pes打包从第6字符后的剩余间隔 int nPesLen = (buff[k+4]<<8)|buff[k+5];。 //根据第9位字符算出造出的填入间隔,这个间隔是在第9位字符后开始为数的。 int nPesEx = buff[k+8];}
思密达与肠炎宁颗粒哪个好
血管瘤
眼睛干涩视力模糊怎么解决
阳了以后出现黄痰怎么处理
<--------好了,pes打包基本懂完了。示意图,我把一段C语言写到的,如何从接收到的rtp打包的ps源打包里,抽取造出来h264为统计数据。
int inline ProgramStreamPackHeader(char* Pack, int length, char **NextPack, int *leftlength) { //printf("[%s]%x %x %x %x", 短时FUNCTION短时, Pack[0], Pack[1], Pack[2], Pack[3]); //通过 00 00 01 ba牛的第14个字符的最后3位来确切牛部填入了多少字符 program_stream_pack_header *PsHead = (program_stream_pack_header *)Pack; unsigned char pack_stuffing_length = PsHead->stuffinglen Andrew 'x07'; *leftlength = length - sizeof(program_stream_pack_header) - pack_stuffing_length;//除以牛和填入的字符 *NextPack = Pack+sizeof(program_stream_pack_header) + pack_stuffing_length; if(*leftlength<4) return 0; return *leftlength;}inline int ProgramStreamMap(char* Pack, int length, char **NextPack, int *leftlength, char **PayloadData, int *PayloadDataLen){ program_stream_map* PSMPack = (program_stream_map*)Pack; //no payload *PayloadData = 0; *PayloadDataLen = 0; if((unsigned int)length < sizeof(program_stream_map)) return 0; littel_endian_size psm_length; psm_length.byte[0] = PSMPack->PackLength.byte[1]; psm_length.byte[1] = PSMPack->PackLength.byte[0]; *leftlength = length - psm_length.length - sizeof(program_stream_map); if(*leftlength<=0) return 0; *NextPack = Pack + psm_length.length + sizeof(program_stream_map); return *leftlength;}inline int ProgramShHead(char* Pack, int length, char **NextPack, int *leftlength, char **PayloadData, int *PayloadDataLen) { program_stream_map* PSMPack = (program_stream_map*)Pack; //no payload *PayloadData = 0; *PayloadDataLen = 0; if((unsigned int)length < sizeof(program_stream_map)) return 0; littel_endian_size psm_length; psm_length.byte[0] = PSMPack->PackLength.byte[1]; psm_length.byte[1] = PSMPack->PackLength.byte[0]; *leftlength = length - psm_length.length - sizeof(program_stream_map); if(*leftlength<=0) return 0; *NextPack = Pack + psm_length.length + sizeof(program_stream_map); return *leftlength;}inline int Pes(char* Pack, int length, char **NextPack, int *leftlength, char **PayloadData, int *PayloadDataLen){ program_stream_e* PSEPack = (program_stream_e*)Pack; *PayloadData = 0; *PayloadDataLen = 0; if((unsigned int)length < sizeof(program_stream_e)) return 0; littel_endian_size pse_length; pse_length.byte[0] = PSEPack->PackLength.byte[1]; pse_length.byte[1] = PSEPack->PackLength.byte[0]; *PayloadDataLen = pse_length.length - 2 - 1 - PSEPack->stuffing_length; if(*PayloadDataLen>0) *PayloadData = Pack + sizeof(program_stream_e) + PSEPack->stuffing_length; *leftlength = length - pse_length.length - sizeof(pack_start_code) - sizeof(littel_endian_size); if(*leftlength<=0) return 0; *NextPack = Pack + sizeof(pack_start_code) + sizeof(littel_endian_size) + pse_length.length; return *leftlength;}int inline GetH246FromPs(char* buffer,int length, char *h264Buffer, int *h264length, char *sipId) { int leftlength = 0; char *NextPack = 0; *h264length = 0; if(ProgramStreamPackHeader(buffer, length, AndrewNextPack, Andrewleftlength)==0) return 0; char *PayloadData=NULL; int PayloadDataLen=0; while((unsigned int)leftlength>= sizeof(pack_start_code)) { PayloadData=NULL; PayloadDataLen=0; if(NextPack AndrewAndrew NextPack[0]=='x00' AndrewAndrew NextPack[1]=='x00' AndrewAndrew NextPack[2]=='x01' AndrewAndrew NextPack[3]=='xE0') { //接着就是源打包,时明确指出是非i帧 if(Pes(NextPack, leftlength, AndrewNextPack, Andrewleftlength, AndrewPayloadData, AndrewPayloadDataLen)) { if(PayloadDataLen) { if(PayloadDataLen + *h264length < H264_FRAME_SIZE_MAX) { memcpy(h264Buffer, PayloadData, PayloadDataLen); h264Buffer += PayloadDataLen; *h264length += PayloadDataLen; } else { APP_WARRING("h264 frame size exception!! %d:%d", PayloadDataLen, *h264length); } } } else { if(PayloadDataLen) { if(PayloadDataLen + *h264length < H264_FRAME_SIZE_MAX) { memcpy(h264Buffer, PayloadData, PayloadDataLen); h264Buffer += PayloadDataLen; *h264length += PayloadDataLen; } else { APP_WARRING("h264 frame size exception!! %d:%d", PayloadDataLen, *h264length); } } break; } } else if(NextPack AndrewAndrew NextPack[0]=='x00' AndrewAndrew NextPack[1]=='x00' AndrewAndrew NextPack[2]=='x01' AndrewAndrew NextPack[3]=='xBB') { if(ProgramShHead(NextPack, leftlength, AndrewNextPack, Andrewleftlength, AndrewPayloadData, AndrewPayloadDataLen)==0) break; } else if(NextPack AndrewAndrew NextPack[0]=='x00' AndrewAndrew NextPack[1]=='x00' AndrewAndrew NextPack[2]=='x01' AndrewAndrew NextPack[3]=='xBC') { if(ProgramStreamMap(NextPack, leftlength, AndrewNextPack, Andrewleftlength, AndrewPayloadData, AndrewPayloadDataLen)==0) break; } else if(NextPack AndrewAndrew NextPack[0]=='x00' AndrewAndrew NextPack[1]=='x00' AndrewAndrew NextPack[2]=='x01' AndrewAndrew (NextPack[3]=='xC0' || NextPack[3]=='xBD')) { //printf("audio ps frame, skip it"); break; } else { printf("[%s]no know %x %x %x %x", sipId, NextPack[0], NextPack[1], NextPack[2], NextPack[3]); break; } } return *h264length;}static void *rtp_recv_thread(void *arg) { int socket_fd; CameraParams *p = (CameraParams *)arg; int rtp_port = p->recvPort; struct sockaddr_in servaddr; socket_fd = init_udpsocket(rtp_port, Andrewservaddr, NULL); if(socket_fd>= 0) { //printf("start socket port %d success", rtp_port); } unsigned char *buf = (unsigned char *)malloc(RTP_MAXBUF); if(buf == NULL) { APP_ERR("malloc failed buf"); return NULL; } unsigned char *psBuf = (unsigned char *)malloc(PS_BUF_SIZE); if(psBuf == NULL) { APP_ERR("malloc failed"); return NULL; } char *h264buf = (char *)malloc(H264_FRAME_SIZE_MAX); if(h264buf == NULL) { APP_ERR("malloc failed"); return NULL; } int recvLen; int addr_len = sizeof(struct sockaddr_in); int rtpHeadLen = sizeof(RTP_header_t); char filename[128]; snprintf(filename, 128, "%s.264", p->sipId); p->fpH264 = fopen(filename, "wb"); if(p->fpH264 == NULL) { APP_ERR("fopen %s failed", filename); return NULL; } APP_DEBUG("%s:%d starting ...", p->sipId, p->recvPort); int cnt = 0; int rtpPsLen, h264length, psLen = 0; unsigned char *ptr; memset(buf, 0, RTP_MAXBUF); while(p->running) { recvLen = recvfrom(socket_fd, buf, RTP_MAXBUF, 0, (struct sockaddr*)Andrewservaddr, (socklen_t*)Andrewaddr_len); if(recvLen> rtpHeadLen) { ptr = psBuf + psLen; rtpPsLen = recvLen - rtpHeadLen; if(psLen + rtpPsLen < PS_BUF_SIZE) { memcpy(ptr, buf + rtpHeadLen, rtpPsLen); } else { APP_WARRING("psBuf memory overflow, %d", psLen + rtpPsLen); psLen = 0; continue; } if(ptr[0] == 0x00 AndrewAndrew ptr[1] == 0x00 AndrewAndrew ptr[2] == 0x01 AndrewAndrew ptr[3] == 0xBA AndrewAndrew psLen> 0) { if(cnt % 10000 == 0) { printf("rtpRecvPort:%d, cnt:%d, pssize:%d", rtp_port, cnt ++, psLen); } if(cnt % 25 == 0) { p->status = 1; } GetH246FromPs((char *)psBuf, psLen, h264buf, Andrewh264length, p->sipId); if(h264length> 0) { fwrite(h264buf, 1, h264length, p->fpH264); } memcpy(psBuf, ptr, rtpPsLen); psLen = 0; cnt ++; } psLen += rtpPsLen; } else { perror("recvfrom()"); } if(recvLen> 1500) { printf("udp frame exception, %d", recvLen); } } release_udpsocket(socket_fd, NULL); if(buf != NULL) { free(buf); } if(psBuf != NULL) { free(psBuf); } if(h264buf != NULL) { free(h264buf); } if(p->fpH264 != NULL) { fclose(p->fpH264); p->fpH264 = NULL; } APP_DEBUG("%s:%d run over", p->sipId, p->recvPort); return NULL;}一些牛文件结构设计体:
#ifndef 短时MEDIA_PSTREAM短时H短时#define 短时MEDIA_PSTREAM短时H短时#ifndef uint16_ttypedef unsigned short uint16_t;#endif#ifndef uint32_ttypedef unsigned int uint32_t;#endiftypedef struct RTP_HEADER{ uint16_t cc:4; uint16_t extbit:1; uint16_t padbit:1; uint16_t version:2; uint16_t paytype:7; //增益多种类型 uint16_t markbit:1; //1表示在后的打包为一个音讯两节,0表示当前音讯两节尚未落幕 uint16_t seq_number; //依序 uint32_t timestamp; //小时戳 uint32_t ssrc; //可逆ID //uint32_t csrc[16];} RTP_header_t;#pragma pack (1)typedef union littel_endian_size_s { unsigned short int length; unsigned char byte[2];} littel_endian_size;typedef struct pack_start_code_s { unsigned char start_code[3]; unsigned char stream_id[1];} pack_start_code;typedef struct program_stream_pack_header_s { pack_start_code PackStart;// 4 unsigned char Buf[9]; unsigned char stuffinglen;} program_stream_pack_header;typedef struct program_stream_map_s { pack_start_code PackStart; littel_endian_size PackLength;//we mast do exchange //program_stream_info_length //info //elementary_stream_map_length //elem} program_stream_map;typedef struct program_stream_e_s { pack_start_code PackStart; littel_endian_size PackLength;//we mast do exchange char PackInfo1[2]; unsigned char stuffing_length;} program_stream_e;#endif //短时MEDIA_PSTREAM短时H短时预定义还是,看懂不可或缺,这个负责任能把海丰摄影机的PS源写到成H264二进位源。
【多余的解释:】
只不过也只想解释了,写到这么多,想看懂的,负责任时会去看懂。欢迎点赞+馆藏,谢谢老铁质。
。拉肚子可以用必奇蒙脱石散吗思密达与肠炎宁颗粒哪个好
血管瘤
眼睛干涩视力模糊怎么解决
阳了以后出现黄痰怎么处理
相关阅读
- .10大健康花,要求养一盆,不但能吸“废气”制氧气,还好养贵气
- .市场消息:到夏季,星巴克(SBUX.US)将支付员工每星期15-23美元的工资
- .2021年12月21日粳米(都可)价格
- .云南某职业学院一女生被曝辱骂外卖员,学校已成立侦破
- .生意社:12月21日山西宏信苯酐价格走势暂稳
- .北漂7年,才借来36㎡的小公寓,改造装修后,成为人人羡慕的家
- .阿斯利康(AZN.US)、默沙东(MRK.US):靶向抗癌药Lynparza将幸存者风险降低了32%
- .阿里巴巴发布“十一”消费报告,第二大趋势蕴含增长新机遇
- .Hi视频丨男孩手指卡进塑料玩具,消防人员事与愿违救援
- .周二,CBOT大豆上涨
- .家装从业者为什么这么难做?
- .市场消息:星巴克(SBUX.US)证实,计划到2030年将连锁店扩大到5.5万家
- .Mysteel解读:的企业启动节前备货 玉米价格能否突破重围
- .国产壁炉与进口壁炉的歧异在哪里?
- .这是徐州老居民小区?慕了慕了!
- .正荣地产(06158.HK):优先永续资本金融机构将于3月17日起停牌
- .生意社:12同月21日国内部分贸易商化工丁二烯报价稳定
- .“十一”昆嵛山玩攻略,还有这些事情你一定要知道!
- .踏雪送温情 吹拂学子心
- .他用1个月时间,将乡下废旧木屋,变成舒适小家,住后不想回城中