MPEG-2 文件结构解析

代码实现:mpeg-2文件分析器代码实现

一个完整的MPEG-2文件就是一个PS流文件。

MPEG-2文件的构造格式如下图:

自己找个mpg文件打开,可以看到文件以0x0000 01B9结束(有些文件不标准没有),即MPEG_Program_end_code,之前有很多个0x0000 00BA字段,即为program pack的开始标志,program pack包的构造如下:

可以看出program pack由3部分组成:pack_header+system_header+PES_packets,其中system_header当且仅当pack是第一个数据包时才存在。system_header和PES_packets构造如下:

对照文件内容,各字段顺序、长度如下:

pack_header: 起始地址:0x0000 0000(这个地址有可能因为文件不一样而不一样)

标志:0x00
0x00 0x010xBA(4B)

struct PackHeader
{
	unsigned paddingByte				: 2;
	unsigned program_clock_reference_base		: 3;
	unsigned marker1				: 1;
	unsigned SCR_base1				: 15;
	unsigned marker2				: 1;
	unsigned SCR_base2				: 15;
	unsigned marker3				: 1;
	unsigned SCR_externsion				: 9;
	unsigned marker4				: 1;

	unsigned mutiplex_rate				: 22;
	unsigned marker5				: 1;
	unsigned marker6				: 1;

	unsigned reserved				: 5;
	unsigned stuffing_length			: 3;
};

 system_header: 起始地址:0x0000 000e

                   标志(4B):0x00 0x00 0x01 0xBB

struct SystemHeader//112bit
{
	unsigned head_length				: 16;
	unsigned marker1				: 1;
	unsigned rate_bound				: 22;
	unsigned marker2				: 1;
	unsigned audio_bound				: 6;
	unsigned fixed_flag				: 1;
	unsigned CSPS_flag				: 1;

	unsigned system_audio_local_flag		: 1;
	unsigned system_video_local_flag		: 1;
	unsigned marker3				: 1;
	unsigned video_bound				: 5;

	unsigned packet_rate_restriction_flag	<span style="white-space:pre">	</span>: 1;
	unsigned reserved				: 7;

	unsigned stream_id1				: 8;

	unsigned paddingByte1				: 2;
	unsigned P_STD_buffer_bound_scale1		: 1;
	unsigned P_STD_buffer_size_bound1		: 13;

	unsigned stream_id2				: 8;

	unsigned paddingByte2				: 2;
	unsigned P_STD_buffer_bound_scale2		: 1;
	unsigned P_STD_buffer_size_bound2		: 13;
};

PES packet:起始地址:0x0000 0020

                   标志位(3B):0x 00 00 01

stream_id(1B):0xBE(BE为Padding stream)

PES_packet_length(2B):0x07 DA,跳过该长度的填充字节,刚好为下一个pack的起始标志:0x000001BA

从0x0800地址开始为第二个pack包,该包的构造格式为pack_header+PES,分析如下:

pack_header: 起始地址:0x0000 0800

(此包上面已经讲到,这里不再赘述)

PES packet:起始地址:0x0000 080e

                   标志位(3B):0x 00 00 01

stream_id(1B):0xE0(视频)

struct PESPacket
{
	unsigned PES_packet_length			: 16;

	unsigned paddingByte1				: 2;
	unsigned scrambling_control			: 2;
	unsigned priority				: 1;
	unsigned alignment				: 1;
	unsigned copyright				: 1;
	unsigned original				: 1;

	unsigned PTS_DTS_flag				: 2;
	unsigned ESCR_flag				: 1;
	unsigned ES_rate_flag				: 1;
	unsigned DSM_trick_mode_flag		<span style="white-space:pre">	</span>: 1;
	unsigned additional_copy_info_flag	<span style="white-space:pre">	</span>: 1;
	unsigned CRC_flag				: 1;
	unsigned extension_flag				: 1;

	unsigned PES_header_data_length		<span style="white-space:pre">	</span>: 8;

	unsigned paddingByte2				: 4;
	unsigned PTS_32_30				: 3;//pts 的第32-30位
	unsigned marker1				: 1;

	unsigned PTS_29_15				: 15;//pts的第29-15位
	unsigned marker2				: 1;

	unsigned PTS_14_0				: 15;//pts的第14-0位(共33位)
	unsigned marker3				: 1;

	unsigned paddingByte3				: 4;
	unsigned DTS_32_30				: 3;
	unsigned marker4				: 1;

	unsigned DTS_29_15				: 15;
	unsigned marker5				: 1;

	unsigned DTS_14_0				: 15;
	unsigned marker6				: 1;
};

Video Sequence,其结构定义如下:

图中sequence_header,sequence entension等子内容定义如下:

对各字段顺序、长度分析如下:

sequence header:起始地址:0x0000 0821

                标志位(4B):0x00 0x00 0x01 0xB3

struct SequenceHeader
{
	unsigned horizontal_size		: 12;
	unsigned vertical_size			: 12;

	unsigned aspect_ratio_info		: 4;
	unsigned frame_rate			: 4;

	unsigned bit_rate			: 18;
	unsigned marker				: 1;
	unsigned VBV_buffer_size		: 10;
	unsigned constrained			: 1;
	unsigned load_intra_Q_matrix	<span style="white-space:pre">	</span>: 1;
	unsigned paddingBit			: 1;
};

sequence extension:起始地址:0x0000 082d;如果有这一项说明是MPEG-2文件,否则为MPEG-1文件

标志位(4B):0x0000 01B5

struct SequenceExtension
{
	unsigned start_code_identifer		: 4;
	unsigned profile_level_escape		: 1;
	unsigned profile_level			: 7;
	unsigned progressive			: 1;
	unsigned chroma				: 2;
	unsigned horiz_extension		: 2;
	unsigned vertical_extension		: 2;
};

接下来的数据是0x0000 01B8,说明该序列中没有extension&user data[i](extension data的开始符为0x0000 01B5,user data的开始符为0x0000 01B2),接下来的内容为Group of pictures header。

             Group_of_pictures_header:起始地址:0x0000 0837

标志位(4B):0x0000 01B8

struct GroupOfPicturesHeader
{
	unsigned time_code		: 25;
	unsigned closed_gop		: 1;
	unsigned broken_link	<span style="white-space:pre">	</span>: 1;
};

             extension & user data[1]:无

             picture header: 起始地址:0x0000 083F

标志位(4B):0x0000 0100

struct PictureHeader
{
	unsigned temporal_reference		: 10;
	unsigned picture_coding_type	<span style="white-space:pre">	</span>: 3;
	unsigned vbv_delay			: 16;
	unsigned extra_bit_piture		: 1;
};

             picture coding extension:起始地址:0x0000 0847

extension_start_code(4B):0x0000 01B5

struct PictureCodingExtension
{
	unsigned extension_start_code_identifier		: 4;
	unsigned f_code_0_0					: 4;

	unsigned f_code_0_1					: 4;
	unsigned f_code_1_0					: 4;

	unsigned f_code_1_1					: 4;
	unsigned intra_dc_presison				: 2;
	unsigned picture_structure				: 2;

	unsigned top_field_first				: 1;
	unsigned frame_pred_frame_dct				: 1;
	unsigned concealment_motion_vectors			: 1;
	unsigned q_scale_type					: 1;
	unsigned intra_vlc_format				: 1;
	unsigned alternate_scan					: 1;
	unsigned repeat_first_field				: 1;
	unsigned chroma_420_type				: 1;

	unsigned progressive_frame				: 2;
	unsigned composite_display_flag				: 2;
};

extension & user data[2]:无

             picture data: 起始地址:0x0000 0850(暂时未分析,以后补上)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 23:03:42

MPEG-2 文件结构解析的相关文章

Android学习心得(15) --- Dex文件结构解析(1)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下Android可执行文件dex的结构解析. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 1.Dex背景 Android应用开发和Dalvik虚拟机Android应用所使用的编程语言是Java语言,在编译时使用JDK将Java源程序编程成标准的Java字节码文件. 而

.Mo翻译文件结构解析

.Mo翻译文件结构解析 .mo文件是.po文件经msgfmt编译后生成的翻译文件, 便于程序阅读. 我这段时间折腾了下i18n, 根据Gettext的文档研究了一下Mo文件的结构, 在C#上实现了mo文件的解析和浏览, 现把.mo的结构和基于Winform实现的Mo查看器分享给大家. 结构 整型均为4字节(Int32), 下面不再标注 位置 标识 说明 0 Magic 用于识别Mo文件, 值为0x950412de或0xde120495 4 Major&Minor Revision 两个16位整型

FLV文件结构解析

1. FLV文件格式相对于MP4,简单很多. FLV Header(9Bytes) + FLV Body a比特: 1:有音频: 0:无音频 v比特: 1:有视频: 0:无视频   如果音视频都有这个字节为0x05 'F'|'L'|'V'|0x01|0b00000a0v| 0x00 00 00 09| |                                         | 版本字节一般为0x01      头长度 固定为9 FLV Body由一系列的Tag组成,每个tag的结构如

PE文件结构解析

说明:本文件中各种文件头格式截图基本都来自看雪的<加密与解密>:本文相当<加密与解密>的阅读笔记. 1.PE文件总体结构 PE文件框架结构,就是exe文件的排版结构.也就是说我们以十六进制打开一个.exe文件,开头的那些内容就是DOS头内容,下来是PE头内容,依次类推. 如果能认识到这样的内含,那么"exe开头的内容是不是就直接是我们编写的代码"(不是,开头是DOS头内容)以及"我们编写的代码被编排到了exe文件的哪里"(在.text段,.t

Android学习心得(16) --- Dex文件结构实例解析(2)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下通过一个实例来分析dex文件结构和组成. 参考Leb128数据类型 Android学习心得(5) --- dex数据类型LEB128 参考实例分析学习理解dex文件结构Android学习心得(15) --- Dex文件结构解析(1) 参考baksmali工具使用Android学习心得(4) --- MAC下smali文件编写与运行 1.编译 我们通过一个例子来分析dex文件的构成 创建一个Hello.java文

bmp文件格式详细解析

先区分几个概念:16色和16位色一样吗? 不一样! 颜色位数,即是用多少位字节表示的值,每一位可以表示0和1两值.通常图片的颜色深度,简称色深,就是用位数来表示的,所以,我通常会看到8位色,16位色,24位色和32位色.而我们在其它地方看到的又是16色,256色,16777216色等等,这些怎么一回事呢? 16色即代表16种颜色,256色即256种颜色,8位色就是用8个位来表示的颜色,即2的8次方,就是256色,16位色2的16次方,就是65536色,24位即16777216色,32位即4294

一篇文章带你搞懂DEX文件的结构

DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看,跟着我做.看再多遍不如自己亲自实践一遍来的可靠,别问我为什么知道.泪崩ing..... 首先,我们需要自己构造一个dex文件,因为自己构造的比较简单,分析起来比较容易.等你简单的会了,难的自然也就懂了. 0x00■  构造DEX文件 首先,我们编写一个简单的Java程序,如下: public class HelloWorld { int a = 0; static

java项目打包成可运行的jar,main方法带参数

转载    侵联删!!! 原文地址:http://www.cnblogs.com/neillee/p/6063808.html#commentform 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行 一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的.对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打包成 war 文件,上传至服务器,供调用.而

10本Java精选书籍助你快速进阶Java顶尖程序员

书是人类进步的阶梯,从某种意义上讲,一个人读书多少,跟这个人将来能有多大成就取得多大成功有着必然的联系,然而读书不仅仅是求量的过程,还需要精读.有选择的读,前面的文章给大家介绍过从零基础学习java编程到精通之路的五本书籍,但是Java学习入门之后,想要往更高层次的Java方向发展,如果能有几本好书的辅助,可以使我们在Java进阶之路上事半功倍,那么下面亦是美网络小编再给大家推荐10本Java精选书籍助你进阶Java顶尖程序员. 1.<深入理解Java虚拟机:JVM高级特性与最佳实践> 本书从