免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5002 | 回复: 2
打印 上一主题 下一主题

关于视频TS流中PES头的解析问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-25 15:26 |只看该作者 |倒序浏览
自己写了个解析PES头取PTS和DTS的程序但感觉数据流和实际的标准相差很大啊
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/stat.h>

#define PSM 0xbc
#define PAD 0xbe
#define PS2 0xbf
#define ECM 0xf0
#define DSMMCC 0xf2
#define TYPE_E 0xf8

int main(int argc, char ** argv)
{
int fd;
char *buf;
int n, i;

unsigned char stream_id,pes_scrambling_control,pes_priority ,data_alignment_indicator ,copyright ,original_or_copy;
unsigned char pts_dts_flags, escr_flag, es_rate_flag, dsm_trick_mode_flag, additional_copy_info_flag, pes_crc_flag, pes_extension_flag,pes_header_data_length;
unsigned int pes_len;
unsigned long long pts, dts;

buf = malloc(sizeof(char) * 20000);
if(buf == NULL)
{
printf("malloc error \n");
return -1;
}

fd = open(argv[1], O_RDONLY);
if(fd == -1)
{
printf("open error:%s\n", strerror(errno));
return -1;
}
while(1)
{
n = read(fd, buf, 20000);
if(n == 0)
{
printf("end of file\n");
return 1;
}
if( n == -1)
{
printf("read error:%s\n", strerror(errno));
return -1;
}

for(i = 0; i < n; i++)
{
if(buf[i] == 0x00 && buf[i+1] == 0x00 && buf[i+2] == 0x01)
{
stream_id = buf[i+3];
pes_len = 0;
pes_len = (buf[i+4] << 8);
pes_len += buf[i+5];
printf("pes_len:%u\n", pes_len);
if(stream_id != PSM &&
stream_id != PAD &&
stream_id != PS2 &&
stream_id != ECM &&
stream_id != DSMMCC &&
stream_id != TYPE_E)
{
if((buf[i+6] & 0xc0 ) != 0x80)
printf("this may be a bad pes head\n");
pes_scrambling_control = ((buf[i+6] >> 4) & 0x03);
pes_priority = ((buf[i+6] >> 3) & 0x01);
data_alignment_indicator = ((buf[i+6] >> 2) & 0x01);
copyright = ((buf[i+6] >> 1) & 0x01);
original_or_copy = (buf[i+6] & 0x01);
pts_dts_flags = ((buf[i+7] >> 6) & 0x03);
escr_flag = ((buf[i+7] >> 5) & 0x01);
es_rate_flag = ((buf[i+7] >> 4) & 0x01);
dsm_trick_mode_flag = ((buf[i+7] >> 3) & 0x01);
additional_copy_info_flag = ((buf[i+7] >> 2) & 0x01);
pes_crc_flag = ((buf[i+7] >> 1) & 0x01);
pes_extension_flag = (buf[i+7] & 0x01);
pes_header_data_length = buf[i+8];
i+=9;
if(pts_dts_flags == 0x10)
{
if((buf[i] & 0xf0) != 0x20)
printf("this may be a bad pts \n");
pts = 0;
pts = ((buf[i] & 0x0e) << 29);
pts += (buf[i+1] << 22);
pts += ((buf[i+2] & 0xfe) << 14);
pts += (buf[i+3] << 7);
pts += (buf[i+4] >> 1) & 0x7f;
printf("PTS:%llu\n", pts);
i+=5;
}
if(pts_dts_flags == 0x11)
{
if((buf[i] & 0xf0) != 0x30)
printf("this may be a bad pts \n");
pts = 0;
pts = ((buf[i] & 0x0e) << 29);
pts += (buf[i+1] << 22);
pts += ((buf[i+2] & 0xfe) << 14);
pts += (buf[i+3] << 7);
pts += ((buf[i+4] >> 1) & 0x7f);

if((buf[i] & 0xf0) != 0x10)
printf("this may be a bad dts \n");
dts = 0;
dts = ((buf[i+5] & 0x0e) << 29);
dts += (buf[i+6] << 22);
dts += ((buf[i+7] & 0xfe) << 14);
dts += (buf[i+8] << 7);
dts += ((buf[i+9] >> 1) & 0x7f);
i+=10;
printf("PTS:%llu\tDTS:%llu\n", pts, dts);
}
}



}

}
}
}

输出:
this may be a bad pes head
pes_len:8767
pes_len:18192
this may be a bad pes head
pes_len:18192
this may be a bad pes head
pes_len:6719
pes_len:4671
pes_len:4759
this may be a bad pes head
pes_len:4714
this may be a bad pes head
pes_len:4714
this may be a bad pes head
pes_len:18192
this may be a bad pes head
pes_len:2623
pes_len:4671
pes_len:861
pes_len:4294935620
this may be a bad pes head
pes_len:6672
pes_len:8737
this may be a bad pes head
pes_len:6645
this may be a bad pes head
pes_len:6850
this may be a bad pes head
pes_len:6645
this may be a bad pes head
pes_len:4624
this may be a bad pes head
pes_len:4624
this may be a bad pes head
pes_len:6672
pes_len:4582
pes_len:4805
this may be a bad pes head
pes_len:4772
this may be a bad pes head
pes_len:4671
pes_len:4671
pes_len:4671
pes_len:6664
pes_len:6719
pes_len:6719
pes_len:8206
pes_len:6719
pes_len:6719
pes_len:8767
pes_len:8767
pes_len:6719

[[i] 本帖最后由 MyStar_api 于 2009-4-25 15:28 编辑 [/i]]

论坛徽章:
0
2 [报告]
发表于 2009-04-25 15:28 |只看该作者
if((buf[i+6] & 0xc0 ) != 0x80)
printf("this may be a bad pes head\n");

主要是这里 按照标准文档 ISO13818-1 中的说明buf[i+6]中的最高2个字节应该是10但实际读取出来却不是这样

输出了大量的this may be a bad pes head。。。

是实际的视频数据 与文档有出入的吗?

论坛徽章:
0
3 [报告]
发表于 2009-04-26 11:18 |只看该作者
虽然我没做过,但是我觉得应该没有出入,除非你的硬件有问题。
更大的可能性是你的代码有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP