本系列的第一篇文章讲解了如何把ts包拼装为pes包,本章主要讲解如何解析pes包。
一、pes包的格式如下图所示:

二、相关字段解析
packet_start_code_prefix         标识包起始端的包起始码。固定值为  0000 0000 0000 0000 0000 0001 (0x000001)
stream_id                                  指示基本流的类型
PES_packet_length                  指示 PES 包中跟随该字段最后字节的字节数。
PES_scrambling_control          指示 PES 包有效载荷的加扰方式。
PTS (presentation time stamp) 显示时间戳
DTS (decoding time stamp)      解码时间戳


三、pes解析代码

int mpeg_pes_packet_parse(pes_packet_t *ppespkt, uint8_t *data, uint32_t size, uint32_t type)
{uint8_t *ptr = data;if (NULL==ptr || NULL==ppespkt) {print_err("phdrts=%p data=%p\n", ptr, ppespkt);return -1;}if (MPEG_STREAM_TYPE_VIDEO == type) {if (!MPEG_STREAM_IS_VIDEO(ptr[3])) {print_err("pes stream_id=0x%x is not video\n", ptr[3]);return -1;}}else if (MPEG_STREAM_TYPE_AUDIO == type) {if (!MPEG_STREAM_IS_AUDIO(ptr[3])) {print_err("pes stream_id=0x%x is not audio\n", ptr[3]);return -1;}}else { /*暂不支持其他类型*/print_err("pes type=%d\n", type);return -1;}ppespkt->packet_start_code_prefix  = ((ptr[0] << 16) | (ptr[1] << 8) | (ptr[2]));ppespkt->stream_id                 = ((ptr[3]));ppespkt->packet_length             = ((ptr[4]<< 8) | (ptr[5]));ppespkt->reserved_0                = ((ptr[6]&0xc0) >> 6);ppespkt->scrambling_control        = ((ptr[6]&0x30) >> 4);ppespkt->priority                  = ((ptr[6]&0x08) >> 3); /* 1 bslbf*/ppespkt->data_alignment_indicator  = ((ptr[6]&0x04) >> 2); /* 1 bslbf*/ppespkt->copyright                 = ((ptr[6]&0x02) >> 1); /* 1 bslbf*/ppespkt->original_or_copy          = ((ptr[6]&0x01));      /* 1 bslbf*/ppespkt->pts_dts_flags             = ((ptr[7]&0xc0) >> 6); /* 2 bslbf*/ppespkt->escr_flag                 = ((ptr[7]&0x20) >> 5); /* 1 bslbf*/ppespkt->es_rate_flag              = ((ptr[7]&0x10) >> 4); /* 1 bslbf*/ppespkt->dsm_trick_mode_flag       = ((ptr[7]&0x08) >> 3); /* 1 bslbf*/ppespkt->additional_copy_info_flag = ((ptr[7]&0x04) >> 2); /* 1 bslbf*/ppespkt->crc_flag                  = ((ptr[7]&0x02) >> 1); /* 1 bslbf*/ppespkt->extension_flag            = ((ptr[7]&0x01));      /* 1 bslbf*/ppespkt->header_data_length        = ((ptr[8]));           /* 8 uimsbf*/ptr += 9;ppespkt->playload_offset = ppespkt->header_data_length + 9;switch (ppespkt->pts_dts_flags) {case 2:ppespkt->pts = ((uint64_t)((ptr[0]&0x0e)>>1)<<30) | ((((ptr[1]<<8)|(ptr[2]&0xfe))>>1)<<15) | (((ptr[3]<<8)|(ptr[4]&0xfe))>>1);ppespkt->dts = NOPTS_VALUE;break;case 3:ppespkt->pts = ((uint64_t)((ptr[0]&0x0e)>>1)<<30) | ((((ptr[1]<<8)|(ptr[2]&0xfe))>>1)<<15) | (((ptr[3]<<8)|(ptr[4]&0xfe))>>1);ptr += 5;ppespkt->dts = ((uint64_t)((ptr[0]&0x0e)>>1)<<30) | ((((ptr[1]<<8)|(ptr[2]&0xfe))>>1)<<15) | (((ptr[3]<<8)|(ptr[4]&0xfe))>>1);ptr += 5;break;default:ppespkt->pts = NOPTS_VALUE;ppespkt->dts = NOPTS_VALUE;}return 0;
}

四、关于pts和dts
这里的pts、dts都是以90kHz为基准,转换为毫秒的算法:
pts * 1000 / 90000
pts和dts都是一个由27MHz脉冲触发计数器生成,再经300分频器分频成90kHz脉冲送入一个33位计数器生成90kHz基值是时间戳。这就是pts、dts位33位并以90khz为基准的原因。

五、pes解析运行结果

|+++++++++++++++++++++++++++++++++++++++++++++|sizeof(pes_packet_t)     = 32  packet_start_code_prefix = 0x1 stream_id                = 0xea packet_length            = 0x0 reserved_0               = 0x2 scrambling_control       = 0x0 priority                 = 0x1 data_alignment_indicator = 0x1 copyright                = 0x0 original_or_copy         = 0x0 pts_dts_flags            = 0x3 escr_flag                = 0x0 es_rate_flag             = 0x0 dsm_trick_mode_flag      = 0x0 additional_copy_info_flag= 0x0 crc_flag                 = 0x0 extension_flag           = 0x0 header_data_length       = 0xa playload_offset          = 0x13 reserved_1               = 0x0 pts                      = 0x121e7b6d6(4863801046)(15:00:42 233)dts                      = 0x121e78ca6(4863790246)(15:00:42 113)
|+++++++++++++++++++++++++++++++++++++++++++++|

mpeg2标准:https://download.csdn.net/download/maxzero/10402761
完整的代码:https://download.csdn.net/download/maxzero/10572383

从mpeg ts文件中提取I帧(3):pes包的解析相关推荐

  1. 从mpeg ts文件中提取I帧(2):pat pmt解析

    一.PAT用途 1.描述当前传输流中 PMT 的 PID 信息. 2.描述PMT,与SDT的对应关系. 3.program_number=0时为network pid即nit的pid,接收pmt时注意 ...

  2. 从mpeg ts文件中提取I帧(1):将ts包拼装为section或pes包

    写在前面的话:         不觉中已经在数码工作了十年有余,十年的青春.十年的汗水,如今即将离开,个中滋味难以言表! 以后可能不会在广电行业工作了,就用这个小程序,为自己十年的广电工作画上一个句号 ...

  3. ffmpeg-从mp4、flv、ts文件中提取264视频流数据

    ffmpeg-从mp4.flv.ts文件中提取264视频流数据 main.c #include <stdio.h> #include <libavutil/log.h> #in ...

  4. 从TS文件中提取DVB Subtitle字幕的有效方法

     从TS文件中提取DVB Subtitle字幕的有效方法 深圳市同洲电子股份有限公司韦斌 (本文发表于<卫星电视与宽带多媒体>2013年16期) 摘要:DVB Subtitling标准 ...

  5. 使用ffmpeg从视频文件中提取音频文件、视频抽帧和切割视频

    目录 ffmpeg下载 使用ffmpeg从视频文件中提取音频文件 批量提取文件夹下多个视频文件的音频 使用ffmpeg从视频文件中提取视频帧 使用ffmpeg将按固定时长将视频切割成多个小片段 将分割 ...

  6. ffmpeg-从flv文件中提取AAC音频数据保存为文件

    AAC ADTS格式协议: 从flv文件中提取AAC音频数据保存为文件. 如果需要详细了解AAC ADTS格式,可以查询文档. 原文件: 提取aac文件: main.c #include <st ...

  7. [SimplePlayer] 4. 从视频文件中提取音频

    提取音频,具体点来说就是提取音频帧.提取方法与从视频文件中提取图像的方法基本一样,这里仅列出其中的不同点: 1. 由于目的提取音频,因此在demux的时候需要指定的是提取audio stream Au ...

  8. klg日志文件中提取RGBD图像数据

    main函数 本程序用于从klg日志文件中提取RGB图像和Depth图像信息,klg文件在ElasticFusion中被用于保存数据集. 涉及的相关开源代码如下: LogView mp3guy/Log ...

  9. 【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    原文地址为: [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph A ...

最新文章

  1. [数位dp] spoj 10738 Ra-One Numbers
  2. ​基于BCI的现代神经反馈有助于认知增强(二)
  3. Alpha 冲刺报告(3/10)
  4. sklearn与pandas的缺失值处理
  5. MAC下搭建java的开发环境
  6. html div 转图片或视频投放大屏
  7. Android studio 0.5.0 注意事项
  8. java keytool详解
  9. 16. jQuery - 获取并设置 CSS 类
  10. ArcGIS Engine中添加点、线、面元素
  11. 汉澳sinox领先特性助其成为领先的操作系统
  12. 2021年社工必备查询网址汇总
  13. 对计算机科学的认识论文,关于对计算机的认识论文
  14. 学信网忘记原手机号码的解决办法
  15. QT警告Slots named on_foo_bar are error prone
  16. 高级WEB前端游戏开发视频教程
  17. 分布式系统与计算机网络
  18. linux中的df和du命令
  19. 汽车零部件行业SRM供应商协同系统:提升汽车零部件企业采购质量,驱动供应商快速响应
  20. 简单对比创建对象的三种方式

热门文章

  1. linux hexo使用教程,Linux下使用Hexo搭建github博客(示例代码)
  2. 剑网三一个服务器最多有多少人,人比怪多,剑网三缘起刚开服,升级最大的阻碍居然是玩家...
  3. 调光LED RGB色准校准方案
  4. UL-1973-2022 储能电池安全标准
  5. python面向对象编程结题报告_《华东师大基于点猫KITTEN计算思维课程开发》结题...
  6. 量化交易领域最重要的10本参考书推荐
  7. 谁偷了我的奶酪(上)
  8. 滴滴副总裁叶杰平离职,他是出行巨头的AI掌门人
  9. 计算机工程师自荐信英语作文,IT工程师英文自荐信
  10. 计算机管理系统工具 下没有用户名密码,电脑设置管理系统用户账户,更改用户名,设置密码等...