• 大小: 168KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: 其他
  • 标签: TS  demux  ES  PES  mux  

资源简介

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 < Mbuf + Tssize )//TS超过3个包长
{
if( *p == 0x47 && *(p+188) == 0x47 && *(p+376) == 0x47 )
break;
}
else if( p + 188 < Mbuf + Tssize )//TS为两个包长
{
if( *p == 0x47 && *(p+188) == 0x47 )
break;
}
else if( *p == 0x47 )//ts为一个包长
break;
    p++;
}
while( p < Mbuf + Tssize)//将视频流数据提取出来,写到另一个新的文件中
{
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; //计数器

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 ;  //判断自适应区是否有可调整字段
counter = p[3]&0xf ; //提取连续计数器
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数据开始
{
start = 1;
}

if(start && payload && fpd)//往fpd写pes包数据
{
fwrite(payload 1p+188-payload fpd);
}

if( Lcounter != 0xff && ((Lcounter + 1)&0xf) != counter)//判断数据是否丢失
{
  ///////////// 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  iframe\Debug\IFram.bsc

     文件     176212  2011-03-25 08:48  iframe\Debug\IFram.exe

     文件     180392  2011-03-25 08:48  iframe\Debug\IFram.ilk

     文件      20998  2011-03-25 08:48  iframe\Debug\IFram.obj

     文件     175484  2011-03-24 19:19  iframe\Debug\IFram.pch

     文件     353280  2011-03-25 08:48  iframe\Debug\IFram.pdb

     文件          0  2011-03-24 19:05  iframe\Debug\IFram.sbr

     文件      33792  2011-03-25 08:48  iframe\Debug\vc60.idb

     文件      53248  2011-03-25 08:48  iframe\Debug\vc60.pdb

     文件      14246  2011-03-25 08:46  iframe\IFram.c

     文件       3387  2011-03-24 19:23  iframe\IFram.dsp

     文件        535  2011-03-24 21:13  iframe\IFram.dsw

     文件      41984  2011-03-25 08:58  iframe\IFram.ncb

     文件      53760  2011-03-25 08:58  iframe\IFram.opt

     文件       1541  2011-03-25 08:48  iframe\IFram.plg

     目录          0  2011-03-25 08:48  iframe\Debug

     目录          0  2011-03-25 09:02  iframe

----------- ---------  ---------- -----  ----

              1150843                    17


评论

共有 条评论