資源簡介
TS demux到ES流,然后ES到PES再到TS進行打包,童叟無欺。

代碼片段和文件信息
#include?
unsigned?char?Mbuf[10*188?*?1024];
//分離TS?
int?Tsdumx(char?*srcfilechar?*tsfileunsigned?short?pid)
{
unsigned?char?*p;
int?Tssize=0;
FILE?*fpd*fp;
unsigned?short?Pid;
fp?=?fopen(srcfile“rb“);
fpd?=?fopen(tsfile“wb“);
// if(fp==NULL?)printf(“*********************“);
// if(fpd?==?NULL)printf(“*********************“);
if(fp==NULL?||?fpd?==?NULL)
{return?-1;}
????do{
Tssize?=?fread(Mbuf?1?sizeof(Mbuf)?fp);
p?=?Mbuf;
while(?p?+?188?<=?Mbuf?+?Tssize?)//尋找TS包的起始點
{
if(?p?+?376? {
if(?*p?==?0x47?&&?*(p+188)?==?0x47?&&?*(p+376)?==?0x47?)
break;
}
else?if(?p?+?188? {
if(?*p?==?0x47?&&?*(p+188)?==?0x47?)
break;
}
else?if(?*p?==?0x47?)//ts為一個包長
break;
????p++;
}
while(?p? {
Pid?=?((p[1]?&?0x1f)<<8)?|?p[2];
if(?Pid?==?pid)
fwrite(p1188fpd);
p?+=?188;
}
}while(!?feof(?fp?));
fclose(fp?);
fclose(fpd?);
printf(“TS包已經分離完!\n“);
return?0;
}
//提取PES?
int?Ts2Pes(char?*tsfilechar?*pesfileunsigned?short?pid)
{
FILE?*fpd*fp;
int?start?=?0;
int?sizenumtotal;
int?count?=?0;
unsigned?char?*p*payload;
unsigned?short?Pid;
unsigned?char?Lcounter?=?0xff;
unsigned?char?Adapcontrol;
unsigned?char?counter;?//計數(shù)器
fp?=?fopen(?tsfile?“rb“);
fpd?=?fopen(?pesfile?“wb“);
if(fp?==?NULL?||?fpd?==?NULL?)
return?-1;
//初始化設置值大小
total?=?0;?
num?=?0;
size?=?0;
while(?!?feof(?fp?))
{
size?=?fread(Mbuf?1sizeof(Mbuf)?fp);
p?=?Mbuf;
do{
Pid?=?(((p[1]?&?0x1f)<<8)?|?p[2]);?//獲取pid
Adapcontrol?=?(p[3]>>4)&0x3?;??//判斷自適應區(qū)是否有可調整字段
counter?=?p[3]&0xf?;?//提取連續(xù)計數(shù)器
if(?Pid?==?pid)
{
payload?=?NULL;
switch(Adapcontrol)
{
case?0:?//保留?
case?2:
break;??//2為只有調整無負載
case?1:
payload?=?p?+?4;??//無調整字段
break;
case?3:
payload?=?p?+?5?+?p[4];??//調整字段后是凈荷
break;
}
if((p[1]?&?0x40)!=?0?)//取出有效荷載單元起始指示符,確定TSpes數(shù)據(jù)開始
{
start?=?1;
}
if(start?&&?payload?&&?fpd)//往fpd寫pes包數(shù)據(jù)
{
fwrite(payload?1p+188-payload?fpd);
}
if(?Lcounter?!=?0xff?&&?((Lcounter?+?1)&0xf)?!=?counter)//判斷數(shù)據(jù)是否丟失
{
??///////////// printf(“%ddata?lost\n“count);
count++;
}
Lcounter?=?counter?;?
}
p?+=?188;
total?+=?188;
}while(p }
fclose(?fp?);
fclose(?fpd?);
printf(?“PES包分離完!\n“?);
return?0;
}
//提取ES
int?pes2es(?char?*pesfile?char?*esfile?)
{
FILE?*fpd?*fp;
unsigned?char?*p?*payload?*tmp;
int?size?num?rdsize;
unsigned?int?last?=?0;
__int64?total?=?0?wrsize?=?0;
unsigned?int?Lenght;
unsigned?char?PES_extension_flag;
unsigned?char?PES_header_data_Lenghtgth;
????unsigned?char?PTS_DTS_flags;
int?k=0;
fp?=?fopen(?pesfile?“rb“?);??
fpd?=?fopen(?esfile?“wb“?);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????41984??2011-03-24?19:05??if
?????文件?????176212??2011-03-25?08:48??if
?????文件?????180392??2011-03-25?08:48??if
?????文件??????20998??2011-03-25?08:48??if
?????文件?????175484??2011-03-24?19:19??if
?????文件?????353280??2011-03-25?08:48??if
?????文件??????????0??2011-03-24?19:05??if
?????文件??????33792??2011-03-25?08:48??if
?????文件??????53248??2011-03-25?08:48??if
?????文件??????14246??2011-03-25?08:46??if
?????文件???????3387??2011-03-24?19:23??if
?????文件????????535??2011-03-24?21:13??if
?????文件??????41984??2011-03-25?08:58??if
?????文件??????53760??2011-03-25?08:58??if
?????文件???????1541??2011-03-25?08:48??if
?????目錄??????????0??2011-03-25?08:48??if
?????目錄??????????0??2011-03-25?09:02??if
-----------?---------??----------?-----??----
??????????????1150843????????????????????17
評論
共有 條評論