话不多说,上码,可以看出代码写的是有多烂,纯一个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 ");
}
TS流格式文件解析
最新推荐文章于 2024-08-05 04:54:59 发布