从mpeg ts文件中提取I帧(3):pes包的解析
本系列的第一篇文章讲解了如何把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包的解析相关推荐
- 从mpeg ts文件中提取I帧(2):pat pmt解析
一.PAT用途 1.描述当前传输流中 PMT 的 PID 信息. 2.描述PMT,与SDT的对应关系. 3.program_number=0时为network pid即nit的pid,接收pmt时注意 ...
- 从mpeg ts文件中提取I帧(1):将ts包拼装为section或pes包
写在前面的话: 不觉中已经在数码工作了十年有余,十年的青春.十年的汗水,如今即将离开,个中滋味难以言表! 以后可能不会在广电行业工作了,就用这个小程序,为自己十年的广电工作画上一个句号 ...
- ffmpeg-从mp4、flv、ts文件中提取264视频流数据
ffmpeg-从mp4.flv.ts文件中提取264视频流数据 main.c #include <stdio.h> #include <libavutil/log.h> #in ...
- 从TS文件中提取DVB Subtitle字幕的有效方法
从TS文件中提取DVB Subtitle字幕的有效方法 深圳市同洲电子股份有限公司韦斌 (本文发表于<卫星电视与宽带多媒体>2013年16期) 摘要:DVB Subtitling标准 ...
- 使用ffmpeg从视频文件中提取音频文件、视频抽帧和切割视频
目录 ffmpeg下载 使用ffmpeg从视频文件中提取音频文件 批量提取文件夹下多个视频文件的音频 使用ffmpeg从视频文件中提取视频帧 使用ffmpeg将按固定时长将视频切割成多个小片段 将分割 ...
- ffmpeg-从flv文件中提取AAC音频数据保存为文件
AAC ADTS格式协议: 从flv文件中提取AAC音频数据保存为文件. 如果需要详细了解AAC ADTS格式,可以查询文档. 原文件: 提取aac文件: main.c #include <st ...
- [SimplePlayer] 4. 从视频文件中提取音频
提取音频,具体点来说就是提取音频帧.提取方法与从视频文件中提取图像的方法基本一样,这里仅列出其中的不同点: 1. 由于目的提取音频,因此在demux的时候需要指定的是提取audio stream Au ...
- klg日志文件中提取RGBD图像数据
main函数 本程序用于从klg日志文件中提取RGB图像和Depth图像信息,klg文件在ElasticFusion中被用于保存数据集. 涉及的相关开源代码如下: LogView mp3guy/Log ...
- 【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
原文地址为: [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph A ...
最新文章
- [数位dp] spoj 10738 Ra-One Numbers
- ​基于BCI的现代神经反馈有助于认知增强(二)
- Alpha 冲刺报告(3/10)
- sklearn与pandas的缺失值处理
- MAC下搭建java的开发环境
- html div 转图片或视频投放大屏
- Android studio 0.5.0 注意事项
- java keytool详解
- 16. jQuery - 获取并设置 CSS 类
- ArcGIS Engine中添加点、线、面元素
- 汉澳sinox领先特性助其成为领先的操作系统
- 2021年社工必备查询网址汇总
- 对计算机科学的认识论文,关于对计算机的认识论文
- 学信网忘记原手机号码的解决办法
- QT警告Slots named on_foo_bar are error prone
- 高级WEB前端游戏开发视频教程
- 分布式系统与计算机网络
- linux中的df和du命令
- 汽车零部件行业SRM供应商协同系统:提升汽车零部件企业采购质量,驱动供应商快速响应
- 简单对比创建对象的三种方式
热门文章
- linux hexo使用教程,Linux下使用Hexo搭建github博客(示例代码)
- 剑网三一个服务器最多有多少人,人比怪多,剑网三缘起刚开服,升级最大的阻碍居然是玩家...
- 调光LED RGB色准校准方案
- UL-1973-2022 储能电池安全标准
- python面向对象编程结题报告_《华东师大基于点猫KITTEN计算思维课程开发》结题...
- 量化交易领域最重要的10本参考书推荐
- 谁偷了我的奶酪(上)
- 滴滴副总裁叶杰平离职,他是出行巨头的AI掌门人
- 计算机工程师自荐信英语作文,IT工程师英文自荐信
- 计算机管理系统工具 下没有用户名密码,电脑设置管理系统用户账户,更改用户名,设置密码等...