TS流格式文件解析

话不多说,上码,可以看出代码写的是有多烂,纯一个ts格式文件解析并获取时间戳的功能。

public void  check(File f){
int iOffset = 0;
//System.out.println("文件大小:"+f.length());
byte[] buffer = new byte[188];
if (f.exists() && f.isFile()){  
try {
DataInputStream dis = new DataInputStream(new FileInputStream(f));
int len;
while (188 == dis.read(buffer)) 
{
PID=((buffer[1]&0x1F) << 8) | buffer[2];//计算PID
continuity_counter= (buffer[3] & 0x0F);//计算continuity_counter
payload_unit_start_indicator= (buffer[1] >> 6) & 0x01;//计算payload
adaption_field_control= (buffer[3] >> 4) & 0x03;//计算adaption_field_control
offsetCount++;
//System.out.println("包个数"+offsetCount);

/**
* 判断是否为视频流
* */
if(0x47 != buffer[0]){
System.out.println("不是一个TS文件");
break;
}
else if(0x0000 == PID){
PATCount+=1;
System.out.println("PAT表");
}
else if(0x0100 == PID){
PMTCount+=1;
System.out.println("PMT表");
}

if (PID != 0x0200)
    {
       continue;
     }

if(-1 != newContinuity_counter && continuity_counter !=(newContinuity_counter  + 1) % 16)
        {
           //判断丢包 
        flag2FramePacket = 1;
        }
if (1 == payload_unit_start_indicator)//判断帧
    {
frameAllCount++;
flag2FramePacket = 0;
       flag1=0;//
       if(-1 != newContinuity_counter && continuity_counter !=(newContinuity_counter  + 1) % 16)
        {
        //丢帧数量
            iLostAllFrame++;
            System.out.println("丢帧现象");
        }
FrameStyle=buffer[30] & 0x1f;//帧类型计算I帧 67 P帧为41
fileOffSet=offSetCount( offsetCount);
    
if (0x07 == FrameStyle)
{
    //I帧数量
    iFrameNumber++;
}
else
{
    //P帧数量
    PFrameNumber++;
}
getPts(buffer);
    }
 
/**
 * 
 * Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,
 * 那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),
 * 会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
 * 而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,
 * 结果中的高的24个比特就总会被清0,于是结果总是我们想要的
 * */
int adpLen = buffer[4] & 0xff;
if((0x03 == adaption_field_control) && (adpLen > 7))
       {
           if(1 == flag2FramePacket)
   {
            //丢包数
            losePackage++;
   }
           
           if (-1 == FrameStyle)
           {
            //丢包数
            losePackage++;
           }
           
           System.out.print(fileOffSet.toUpperCase()+ " \t ");
               System.out.println((0x07 == FrameStyle) ? ("I帧") : ("P帧")+ " \t " + (YN=(flag2FramePacket == 1)  ?"是" : "  "));
               FrameStyle = -1;
   flag1 = 0;
   flag2FramePacket = 0;  
       } 
    newContinuity_counter=continuity_counter;
}//while结束 
} 
catch (FileNotFoundException e) 
{
e.printStackTrace();
} 
catch (IOException e) 
{
e.printStackTrace();
}
}//文件存在的IF结束
System.out.println("丢帧数量"+iLostAllFrame);
System.out.print("PAT表 数量:"+PATCount+"\t");
System.out.println("PMT表 数量:"+PMTCount);
System.out.print("I帧总个数为"+iFrameNumber+"\t");
System.out.println("P帧总个数为"+PFrameNumber);
System.out.print("帧总 数量:"+frameAllCount);
}
/**
* @Title: offSetCount
* @Description: TODO(对ts文件做偏移量计算)
* @param: @param count
* @param: @param i   
* @return: void   
* @throws
*/
private String offSetCount(int count){
int offCount = 188 * (count - 1);
return Integer.toHexString(offCount);
}

private void getPts(byte[] buffer){
// System.arraycopy(buffer, 30, pts1, 0, 3); //原数组、原数组起始位、目的数组、目的数组起始位、原数组中要取得的长度
//long是8个字节64位
long pts_32_30=(buffer[21] & 0x0e) << 28;
long pts_29_15=((buffer[22] << 8) | (buffer[23] & 0xfe))  << 13;
long pts_14_0=((buffer[24] & 0xff) << 7) | ((((buffer[25]) & 0xfe)) >> 1);
long pts=(pts_32_30) |  (pts_29_15) | (pts_14_0);
//System.out.println(" "+(pts/90)+" \t ");
System.out.println(" "+pts+" \t ");

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值