PS流数据原理网上基本能够搜索到,这里我也就没必要粘贴复制,解析PS数据包主要分 00 00 00 ba 这是ps头,然后是系统头00 00 00 bb ,然后是Program Stream map包 00 00 00 bc 然后是H264数据00 00 00 e0 。
下面我附上代码,网上有类似的代码,但是有点问题,直接用的话会在视频下半部分出现花屏显现。这里所附C++代码形成两个文件可直接编译使用。
MediaPsAnaly.h:
MediaPsAnaly.h:
#ifndef MEDIAPSANALY_H
#define MEDIAPSANALY_H
#pragma pack(1)
union littel_endian_size {
unsigned short int length;
unsigned char byte[2];
};
struct pack_start_code {
unsigned char start_code[3];
unsigned char stream_id[1];
};
struct program_stream_pack_header { //14字节
pack_start_code PackStart;// 4
unsigned char Buf[9];
unsigned char stuffinglen;
};
struct program_stream_system_head { //可能有系统头,pack_start_code为00 00 01 BB
pack_start_code PackStart;
littel_endian_size PackLength;
};
struct program_stream_map {
pack_start_code PackStart;
littel_endian_size PackLength;
};
struct program_stream_e {
pack_start_code PackStart; //4字节
littel_endian_size PackLength;//we mast do exchange 2字节
char PackInfo1[2]; //2字节
unsigned char stuffing_length; //1字节
};
#pragma pack()
class MediaPsAnaly {
private:
MediaPsAnaly();
~MediaPsAnaly();
public:
/* 获取MediaManage对象唯一实例 */
static MediaPsAnaly* getInstance();
/* 获取h264数据 */
int GetH246FromPs(unsigned char* buffer,int length, unsigned char *h264Buffer, int *h264length);
private:
/* 解析ps头 */
int inline ProgramStreamPackHeader(unsigned char* Pack, int length, unsigned char **NextPack, int *leftlength);
/* 去掉系统头 */
inline int ProgramStreamSystemHead(unsigned char* Pack,in