mpegts

package
v4.15.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 27, 2024 License: MIT Imports: 8 Imported by: 9

Documentation

Index

Constants

View Source
const (
	TS_PACKET_SIZE      = 188
	TS_DVHS_PACKET_SIZE = 192
	TS_FEC_PACKET_SIZE  = 204

	TS_MAX_PACKET_SIZE = 204

	PID_PAT        = 0x0000
	PID_CAT        = 0x0001
	PID_TSDT       = 0x0002
	PID_RESERVED1  = 0x0003
	PID_RESERVED2  = 0x000F
	PID_NIT_ST     = 0x0010
	PID_SDT_BAT_ST = 0x0011
	PID_EIT_ST     = 0x0012
	PID_RST_ST     = 0x0013
	PID_TDT_TOT_ST = 0x0014
	PID_NET_SYNC   = 0x0015
	PID_RESERVED3  = 0x0016
	PID_RESERVED4  = 0x001B
	PID_SIGNALLING = 0x001C
	PID_MEASURE    = 0x001D
	PID_DIT        = 0x001E
	PID_SIT        = 0x001F
	PID_PMT        = 0x0100
	PID_VIDEO      = 0x0101
	PID_AUDIO      = 0x0102

	// program_association_section
	// conditional_access_section
	// TS_program_map_section
	// TS_description_section
	// ISO_IEC_14496_scene_description_section
	// ISO_IEC_14496_object_descriptor_section
	// Metadata_section
	// IPMP_Control_Information_section (defined in ISO/IEC 13818-11)
	TABLE_PAS               = 0x00
	TABLE_CAS               = 0x01
	TABLE_TSPMS             = 0x02
	TABLE_TSDS              = 0x03
	TABLE_ISO_IEC_14496_SDC = 0x04
	TABLE_ISO_IEC_14496_ODC = 0x05
	TABLE_MS                = 0x06
	TABLE_IPMP_CIS          = 0x07
	// 0x06 - 0x37 ITU-T Rec. H.222.0 | ISO/IEC 13818-1 reserved
	// 0x38 - 0x3F Defined in ISO/IEC 13818-6
	// 0x40 - 0xFE User private
	// 0xFF Forbidden
	STREAM_TYPE_VIDEO_MPEG1      = 0x01
	STREAM_TYPE_VIDEO_MPEG2      = 0x02
	STREAM_TYPE_AUDIO_MPEG1      = 0x03
	STREAM_TYPE_AUDIO_MPEG2      = 0x04
	STREAM_TYPE_PRIVATE_SECTIONS = 0x05
	STREAM_TYPE_PRIVATE_DATA     = 0x06
	STREAM_TYPE_MHEG             = 0x07

	STREAM_TYPE_H264   = 0x1B
	STREAM_TYPE_H265   = 0x24
	STREAM_TYPE_AAC    = 0x0F
	STREAM_TYPE_G711A  = 0x90
	STREAM_TYPE_G711U  = 0x91
	STREAM_TYPE_G722_1 = 0x92
	STREAM_TYPE_G723_1 = 0x93
	STREAM_TYPE_G726   = 0x94
	STREAM_TYPE_G729   = 0x99

	STREAM_TYPE_ADPCM = 0x11
	STREAM_TYPE_PCM   = 0x0A
	STREAM_TYPE_AC3   = 0x81
	STREAM_TYPE_DTS   = 0x8A
	STREAM_TYPE_LPCM  = 0x8B
	// 1110 xxxx
	// 110x xxxx
	STREAM_ID_VIDEO = 0xE0 // ITU-T Rec. H.262 | ISO/IEC 13818-2 or ISO/IEC 11172-2 or ISO/IEC14496-2 video stream number xxxx
	STREAM_ID_AUDIO = 0xC0 // ISO/IEC 13818-3 or ISO/IEC 11172-3 or ISO/IEC 13818-7 or ISO/IEC14496-3 audio stream number x xxxx

	PAT_PKT_TYPE = 0
	PMT_PKT_TYPE = 1
	PES_PKT_TYPE = 2
)
View Source
const (
	PSI_TYPE_PAT      = 1
	PSI_TYPE_PMT      = 2
	PSI_TYPE_NIT      = 3
	PSI_TYPE_CAT      = 4
	PSI_TYPE_TST      = 5
	PSI_TYPE_IPMP_CIT = 6
)

Variables

View Source
var (
	TSHeader = []byte{0x47, 0x40 | (PID_PMT >> 8), PID_PMT & 0xff, 0x10, 0x00} //PID:0x100
	PSI      = []byte{0x02, 0xb0, 0x17, 0x00, 0x01, 0xc1, 0x00, 0x00}
	PMT      = []byte{0xe0 | (PID_VIDEO >> 8), PID_VIDEO & 0xff, 0xf0, 0x00} //PcrPID:0x101

	Stuffing []byte
)
View Source
var Crc32_Table = []uint32{}/* 256 elements not displayed */
View Source
var DefaultPATPacket = []byte{}/* 188 elements not displayed */

Functions

func GetCRC32

func GetCRC32(data []byte) (crc uint32)

func GetCRC32_2 added in v4.8.4

func GetCRC32_2(data net.Buffers) (crc uint32)

func WriteDefaultPATPacket

func WriteDefaultPATPacket(w io.Writer) (err error)

func WritePAT

func WritePAT(w io.Writer, pat MpegTsPAT) (err error)

func WritePATPacket

func WritePATPacket(w io.Writer, tsHeader []byte, pat MpegTsPAT) (err error)

func WritePESHeader

func WritePESHeader(w io.Writer, header MpegTsPESHeader) (written int, err error)

func WritePMT

func WritePMT(w io.Writer, pmt MpegTsPMT) (err error)

func WritePMTBody

func WritePMTBody(w io.Writer, pmt MpegTsPMT) (err error)

func WritePMTDescriptor

func WritePMTDescriptor(w io.Writer, descs []MpegTsDescriptor) (err error)

func WritePMTPacket

func WritePMTPacket(w io.Writer, videoCodec codec.VideoCodecID, audioCodec codec.AudioCodecID)

func WritePSI

func WritePSI(w io.Writer, pt uint32, psi MpegTsPSI, data []byte) (err error)

func WriteTsHeader

func WriteTsHeader(w io.Writer, header MpegTsHeader) (written int, err error)

Types

type MpegTsDescriptor

type MpegTsDescriptor struct {
	Tag    byte // 8 bits 标识每一个描述符
	Length byte // 8 bits 指定紧随 descriptor_length 字段的描述符的字节数
	Data   []byte
}

func ReadPMTDescriptor

func ReadPMTDescriptor(lr *io.LimitedReader) (Desc []MpegTsDescriptor, err error)

type MpegTsHeader

type MpegTsHeader struct {
	SyncByte                   byte   // 8 bits  同步字节,固定为0x47,表示后面是一个TS分组
	TransportErrorIndicator    byte   // 1 bit  传输错误标志位
	PayloadUnitStartIndicator  byte   // 1 bit  负载单元开始标志(packet不满188字节时需填充).为1时,表示在4个字节后,有一个调整字节
	TransportPriority          byte   // 1 bit  传输优先级
	Pid                        uint16 // 13 bits Packet ID号码,唯一的号码对应不同的包.为0表示携带的是PAT表
	TransportScramblingControl byte   // 2 bits  加密标志位(00:未加密;其他表示已加密)
	AdaptionFieldControl       byte   // 2 bits  附加区域控制.表示TS分组首部后面是否跟随有调整字段和有效负载.01仅含有效负载(没有adaptation_field),10仅含调整字段(没有Payload),11含有调整字段和有效负载(有adaptation_field,adaptation_field之后是Payload).为00的话解码器不进行处理.空分组没有调整字段
	ContinuityCounter          byte   // 4 bits  包递增计数器.范围0-15,具有相同的PID的TS分组传输时每次加1,到15后清0.不过,有些情况下是不计数的.

	MpegTsHeaderAdaptationField
}

前面32bit的数据即TS分组首部,它指出了这个分组的属性

func ReadTsHeader

func ReadTsHeader(r io.Reader) (header MpegTsHeader, err error)

type MpegTsHeaderAdaptationField

type MpegTsHeaderAdaptationField struct {
	AdaptationFieldLength             byte // 8bits 本区域除了本字节剩下的长度(不包含本字节!!!切记), if adaptationFieldLength > 0, 那么就有下面8个字段. adaptation_field_length 值必须在 0 到 182 的区间内.当 adaptation_field_control 值为'10'时,adaptation_field_length 值必须为 183
	DiscontinuityIndicator            byte // 1bit 置于"1"时,指示当前传输流包的不连续性状态为真.当 discontinuity_indicator 设置为"0"或不存在时,不连续性状态为假.不连续性指示符用于指示两种类型的不连续性,系统时间基不连续性和 continuity_counter 不连续性.
	RandomAccessIndicator             byte // 1bit 指示当前的传输流包以及可能的具有相同 PID 的后续传输流包,在此点包含有助于随机接入的某些信息.特别的,该比特置于"1"时,在具有当前 PID 的传输流包的有效载荷中起始的下一个 PES 包必须包含一个 discontinuity_indicator 字段中规定的基本流接入点.此外,在视频情况中,显示时间标记必须在跟随基本流接入点的第一图像中存在
	ElementaryStreamPriorityIndicator byte // 1bit 在具有相同 PID 的包之间,它指示此传输流包有效载荷内承载的基本流数据的优先级.1->指示该有效载荷具有比其他传输流包有效载荷更高的优先级
	PCRFlag                           byte // 1bit 1->指示 adaptation_field 包含以两部分编码的 PCR 字段.0->指示自适应字段不包含任何 PCR 字段
	OPCRFlag                          byte // 1bit 1->指示 adaptation_field 包含以两部分编码的 OPCR字段.0->指示自适应字段不包含任何 OPCR 字段
	SplicingPointFlag                 byte // 1bit 1->指示 splice_countdown 字段必须在相关自适应字段中存在,指定拼接点的出现.0->指示自适应字段中 splice_countdown 字段不存在
	TrasportPrivateDataFlag           byte // 1bit 1->指示自适应字段包含一个或多个 private_data 字节.0->指示自适应字段不包含任何 private_data 字节
	AdaptationFieldExtensionFlag      byte // 1bit 1->指示自适应字段扩展的存在.0->指示自适应字段中自适应字段扩展不存在

	// Optional Fields
	ProgramClockReferenceBase              uint64 // 33 bits pcr
	Reserved1                              byte   // 6 bits
	ProgramClockReferenceExtension         uint16 // 9 bits
	OriginalProgramClockReferenceBase      uint64 // 33 bits opcr
	Reserved2                              byte   // 6 bits
	OriginalProgramClockReferenceExtension uint16 // 9 bits
	SpliceCountdown                        byte   // 8 bits
	TransportPrivateDataLength             byte   // 8 bits 指定紧随传输private_data_length 字段的 private_data 字节数. private_data 字节数不能使专用数据扩展超出自适应字段的范围
	PrivateDataByte                        byte   // 8 bits 不通过 ITU-T|ISO/IEC 指定
	AdaptationFieldExtensionLength         byte   // 8 bits 指定紧随此字段的扩展的自适应字段数据的字节数,包括要保留的字节(如果存在)
	LtwFlag                                byte   // 1 bit 1->指示 ltw_offset 字段存在
	PiecewiseRateFlag                      byte   // 1 bit 1->指示 piecewise_rate 字段存在
	SeamlessSpliceFlag                     byte   // 1 bit 1->指示 splice_type 以及 DTS_next_AU 字段存在. 0->指示无论是 splice_type 字段还是 DTS_next_AU 字段均不存在

	// Optional Fields
	LtwValidFlag  byte   // 1 bit 1->指示 ltw_offset 的值必将生效.0->指示 ltw_offset 字段中该值未定义
	LtwOffset     uint16 // 15 bits 其值仅当 ltw_valid 标志字段具有'1'值时才定义.定义时,法定时间窗补偿以(300/fs)秒为度量单位,其中 fs 为此 PID 所归属的节目的系统时钟频率
	Reserved3     byte   // 2 bits 保留
	PiecewiseRate uint32 // 22 bits 只要当 ltw_flag 和 ltw_valid_flag 均置于‘1’时,此 22 比特字段的含义才确定
	SpliceType    byte   // 4 bits
	DtsNextAU     uint64 // 33 bits (解码时间标记下一个存取单元)

}

调整字段,只可能出现在每一帧的开头(当含有pcr的时候),或者结尾(当不满足188个字节的时候) adaptionFieldControl 00 -> 高字节代表调整字段, 低字节代表负载字段 0x20 0x10 PCR字段编码在MPEG-2 TS包的自适应字段(Adaptation field)的6个Byte中,其中6 bits为预留位,42 bits为有效位() MpegTsHeaderAdaptationField + stuffing bytes

type MpegTsOptionalPESHeader

type MpegTsOptionalPESHeader struct {
	ConstTen               byte // 2 bits 常量10
	PesScramblingControl   byte // 2 bit 指示 PES 包有效载荷的加扰方式.当加扰在 PES 等级上实施时, PES 包头,其中包括任选字段只要存在,应不加扰(见表 2-23)
	PesPriority            byte // 1 bit 指示在此 PES 包中该有效载荷的优先级.1->指示该 PES 包有效载荷比具有此字段置于"0"的其他 PES 包有效载荷有更高的有效载荷优先级.多路复用器能够使用该PES_priority 比特最佳化基本流内的数据
	DataAlignmentIndicator byte // 1 bit 1->指示 PES 包头之后紧随 2.6.10 中data_stream_alignment_descriptor 字段中指示的视频句法单元或音频同步字,只要该描述符字段存在.若置于值"1"并且该描述符不存在,则要求表 2-53,表 2-54 或表 2-55 的 alignment_type"01"中所指示的那种校准.0->不能确定任何此类校准是否发生
	Copyright              byte // 1 bit 1->指示相关 PES 包有效载荷的素材依靠版权所保护.0->不能确定该素材是否依靠版权所保护
	OriginalOrCopy         byte // 1 bit 1->指示相关 PES 包有效载荷的内容是原始的.0->指示相关 PES 包有效载荷的内容是复制的
	PtsDtsFlags            byte // 2 bits 10->PES 包头中 PTS 字段存在. 11->PES 包头中 PTS 字段和 DTS 字段均存在. 00->PES 包头中既无任何 PTS 字段也无任何 DTS 字段存在. 01->禁用
	EscrFlag               byte // 1 bit 1->指示 PES 包头中 ESCR 基准字段和 ESCR 扩展字段均存在.0->指示无任何 ESCR 字段存在
	EsRateFlag             byte // 1 bit 1->指示 PES 包头中 ES_rate 字段存在.0->指示无任何 ES_rate 字段存在
	DsmTrickModeFlag       byte // 1 bit 1->指示 8 比特特技方式字段存在.0->指示此字段不存在
	AdditionalCopyInfoFlag byte // 1 bit 1->指示 additional_copy_info 存在.0->时指示此字段不存在
	PesCRCFlag             byte // 1 bit 1->指示 PES 包中 CRC 字段存在.0->指示此字段不存在
	PesExtensionFlag       byte // 1 bit 1->时指示 PES 包头中扩展字段存在.0->指示此字段不存在
	PesHeaderDataLength    byte // 8 bits 指示在此 PES包头中包含的由任选字段和任意填充字节所占据的字节总数.任选字段的存在由前导 PES_header_data_length 字段的字节来指定

	// Optional Field
	Pts                  uint64 // 33 bits 指示时间与解码时间的关系如下: PTS 为三个独立字段编码的 33 比特数.它指示基本流 n 的显示单元 k 在系统目标解码器中的显示时间 tpn(k).PTS 值以系统时钟频率除以 300(产生 90 kHz)的周期为单位指定.显示时间依照以下公式 2-11 从 PTS 中推出.有关编码显示时间标记频率上的限制参阅 2.7.4
	Dts                  uint64 // 33 bits 指示基本流 n 的存取单元 j 在系统目标解码器中的解码时间 tdn(j). DTS 的值以系统时钟频率除以 300(生成90 kHz)的周期为单位指定.依照以下公式 2-12 从 DTS 中推出解码时间
	EscrBase             uint64 // 33 bits 其值由 ESCR_base(i) 给出,如公式 2-14 中给出的
	EscrExtension        uint16 // 9 bits 其值由 ESCR_ext(i) 给出,如公式 2-15 中给出的. ESCR 字段指示包含 ESCR_base 最后比特的字节到达 PES流的 PES-STD 输入端的预期时间(参阅 2.5.2.4)
	EsRate               uint32 // 22 bits 在PES 流情况中,指定系统目标解码器接收 PES 包字节的速率.ES_rate 在包括它的 PES 包以及相同 PES 流的后续 PES 包中持续有效直至遇到新的 ES_rate 字段时为止.ES 速率值以 50 字节/秒为度量单位.0 值禁用
	TrickModeControl     byte   // 3 bits 指示适用于相关视频流的特技方式.在其他类型基本流的情况中,此字段以及后随 5 比特所规定的那些含义未确定.对于 trick_mode 状态的定义,参阅 2.4.2.3 的特技方式段落
	TrickModeValue       byte   // 5 bits
	AdditionalCopyInfo   byte   // 7 bits 包含与版权信息有关的专用数据
	PreviousPESPacketCRC uint16 // 16 bits 包含产生解码器中 16 寄存器零输出的 CRC 值, 类似于附件 A 中定义的解码器. 但在处理先前的 PES 包数据字节之后, PES 包头除外,采用多项式

	// PES Extension
	PesPrivateDataFlag               byte // 1 bit 1->指示该 PES 包头包含专用数据. 0->指示 PES 包头中不存在专用数据
	PackHeaderFieldFlag              byte // 1 bit 1->指示 ISO/IEC 11172-1 包头或节目流包头在此 PES包头中存储.若此字段处于节目流中包含的 PES 包中,则此字段应设置为"0.传输流中, 0->指示该 PES 头中无任何包头存在
	ProgramPacketSequenceCounterFlag byte // 1 bit 1->指示 program_packet_sequence_counter, MPEG1_MPEG2_identifier 以及 original_stuff_length 字段在 PES 包中存在.0->它指示这些字段在 PES 头中不存在
	PSTDBufferFlag                   byte // 1 bit 1->指示 P-STD_buffer_scale 和 P-STD_buffer_size 在 PES包头中存在.0->指示这些字段在 PES 头中不存在
	Reserved                         byte // 3 bits
	PesExtensionFlag2                byte // 1 bits 1->指示 PES_extension_field_length 字段及相关的字段存在.0->指示 PES_extension_field_length 字段以及任何相关的字段均不存在.

	// Optional Field
	PesPrivateData               [16]byte // 128 bits 此数据,同前后字段数据结合,应不能仿真packet_start_code_prefix (0x000001)
	PackHeaderField              byte     // 8 bits 指示 pack_header_field() 的长度,以字节为单位
	ProgramPacketSequenceCounter byte     // 7 bits
	Mpeg1Mpeg2Identifier         byte     // 1 bit 1->指示此 PES 包承载来自 ISO/IEC 11172-1 流的信息.0->指示此 PES 包承载来自节目流的信息
	OriginalStuffLength          byte     // 6 bits 在原始 ITU-T H.222.0 建议书| ISO/IEC 13818-1 PES 包头或在原始 ISO/IEC 11172-1 包头中所使用的填充字节数
	PSTDBufferScale              byte     // 1bit 它的含义仅当节目流中包含此 PES 包时才规定.它指示所使用的标度因子用于解释后续的 P-STD_buffer_size 字段.若前导 stream_id 指示音频流,则P-STD 缓冲器标度字段必为"0"值.若前导 stream_id 指示视频流,则 P-STD_buffer_scale 字段必为"1"值.对于所有其他流类型,该值可为"1"或为"0"
	PSTDBufferSize               uint16   // 13 bits 其含义仅当节目流中包含此 PES包时才规定.它规定在 P-STD 中,输入缓冲器 BSn 的尺寸.若 STD_buffer_scale 为 "0"值,则 P-STD_buffer_size以 128 字节为单位度量该缓冲器尺寸.若 P-STD_buffer_scale 为"1",则 P-STD_buffer_size 以 1024 字节为单位度量该缓冲器尺寸
	PesExtensionFieldLength      byte     // 7 bits 指示 PES 扩展字段中跟随此长度字段的直至并包括任何保留字节为止的数据长度,以字节为度量单位
	StreamIDExtensionFlag        byte     // 1 bits

}

可选的PES Header = MpegTsOptionalPESHeader + stuffing bytes(0xFF) m * 8

type MpegTsPAT

type MpegTsPAT struct {
	// PSI
	TableID                byte   // 8 bits 0x00->PAT,0x02->PMT
	SectionSyntaxIndicator byte   // 1 bit  段语法标志位,固定为1
	Zero                   byte   // 1 bit  0
	Reserved1              byte   // 2 bits 保留位
	SectionLength          uint16 // 12 bits 该字段的头两比特必为'00',剩余 10 比特指定该分段的字节数,紧随 section_length 字段开始,并包括 CRC.此字段中的值应不超过 1021(0x3FD)
	TransportStreamID      uint16 // 16 bits 该字段充当标签,标识网络内此传输流有别于任何其他多路复用流.其值由用户规定
	Reserved2              byte   // 2 bits  保留位
	VersionNumber          byte   // 5 bits  范围0-31,表示PAT的版本号
	CurrentNextIndicator   byte   // 1 bit  发送的PAT是当前有效还是下一个PAT有效,0则要等待下一个表
	SectionNumber          byte   // 8 bits  分段的号码.PAT可能分为多段传输.第一段为00,以后每个分段加1,最多可能有256个分段
	LastSectionNumber      byte   // 8 bits  最后一个分段的号码

	// N Loop
	Program []MpegTsPATProgram // PAT表里面的所有频道索引信息

	Crc32 uint32 // 32 bits 包含处理全部传输流节目映射分段之后,在附件 B 规定的解码器中给出寄存器零输出的 CRC 值
}

Program Association Table (节目关联表) 节目号为0x0000时,表示这是NIT,PID=0x001f,即3. 节目号为0x0001时,表示这是PMT,PID=0x100,即256

func ReadPAT

func ReadPAT(r io.Reader) (pat MpegTsPAT, err error)

type MpegTsPATProgram

type MpegTsPATProgram struct {
	ProgramNumber uint16 // 16 bit 节目号
	Reserved3     byte   // 3 bits 保留位
	NetworkPID    uint16 // 13 bits 网络信息表(NIT)的PID,节目号为0时对应的PID为network_PID
	ProgramMapPID uint16 // 13 bit 节目映射表的PID,节目号大于0时对应的PID.每个节目对应一个
}

PAT表主要包含频道号码和每一个频道对应的PMT的PID号码,这些信息我们在处理PAT表格的时候会保存起来,以后会使用到这些数据

type MpegTsPESHeader

type MpegTsPESHeader struct {
	PacketStartCodePrefix uint32 // 24 bits 同跟随它的 stream_id 一起组成标识包起始端的包起始码.packet_start_code_prefix 为比特串"0000 0000 0000 0000 0000 0001"(0x000001)
	StreamID              byte   // 8 bits stream_id 指示基本流的类型和编号,如 stream_id 表 2-22 所定义的.传输流中,stream_id 可以设置为准确描述基本流类型的任何有效值,如表 2-22 所规定的.传输流中,基本流类型在 2.4.4 中所指示的节目特定信息中指定
	PesPacketLength       uint16 // 16 bits 指示 PES 包中跟随该字段最后字节的字节数.0->指示 PES 包长度既未指示也未限定并且仅在这样的 PES 包中才被允许,该 PES 包的有效载荷由来自传输流包中所包含的视频基本流的字节组成

	MpegTsOptionalPESHeader

	PayloadLength uint64 // 这个不是标准文档里面的字段,是自己添加的,方便计算
}

func ReadPESHeader

func ReadPESHeader(r io.Reader) (header MpegTsPESHeader, err error)

type MpegTsPESPacket

type MpegTsPESPacket struct {
	Header  MpegTsPESHeader
	Payload util.Buffer //从TS包中读取的数据
	Buffers net.Buffers //用于写TS包
}

PES--Packetized Elementary Streams (分组的ES),ES形成的分组称为PES分组,是用来传递ES的一种数据结构 1110 xxxx 为视频流(0xE0) 110x xxxx 为音频流(0xC0)

type MpegTsPMT

type MpegTsPMT struct {
	// PSI
	TableID                byte   // 8 bits 0x00->PAT,0x02->PMT
	SectionSyntaxIndicator byte   // 1 bit  段语法标志位,固定为1
	Zero                   byte   // 1 bit  0
	Reserved1              byte   // 2 bits 保留位
	SectionLength          uint16 // 12 bits 该字段的头两比特必为'00',剩余 10 比特指定该分段的字节数,紧随 section_length 字段开始,并包括 CRC.此字段中的值应不超过 1021(0x3FD)
	ProgramNumber          uint16 // 16 bits 指定 program_map_PID 所适用的节目
	Reserved2              byte   // 2 bits  保留位
	VersionNumber          byte   // 5 bits  范围0-31,表示PAT的版本号
	CurrentNextIndicator   byte   // 1 bit  发送的PAT是当前有效还是下一个PAT有效
	SectionNumber          byte   // 8 bits  分段的号码.PAT可能分为多段传输.第一段为00,以后每个分段加1,最多可能有256个分段
	LastSectionNumber      byte   // 8 bits  最后一个分段的号码

	Reserved3             byte               // 3 bits  保留位 0x07
	PcrPID                uint16             // 13 bits 指明TS包的PID值.该TS包含有PCR域,该PCR值对应于由节目号指定的对应节目.如果对于私有数据流的节目定义与PCR无关.这个域的值将为0x1FFF
	Reserved4             byte               // 4 bits  预留位 0x0F
	ProgramInfoLength     uint16             // 12 bits 前两位bit为00.该域指出跟随其后对节目信息的描述的byte数
	ProgramInfoDescriptor []MpegTsDescriptor // N Loop Descriptors 可变 节目信息描述

	// N Loop
	Stream []MpegTsPmtStream // PMT表里面的所有音视频索引信息

	Crc32 uint32 // 32 bits 包含处理全部传输流节目映射分段之后,在附件 B 规定的解码器中给出寄存器零输出的 CRC 值
}

Program Map Table (节目映射表)

func ReadPMT

func ReadPMT(r io.Reader) (pmt MpegTsPMT, err error)

type MpegTsPSI

type MpegTsPSI struct {
	// PAT
	// PMT
	// CAT
	// NIT
	Pat MpegTsPAT
	Pmt MpegTsPMT
}

func ReadPSI

func ReadPSI(r io.Reader, pt uint32) (lr *io.LimitedReader, psi MpegTsPSI, err error)

当传输流包有效载荷包含 PSI 数据时,payload_unit_start_indicator 具有以下意义: 若传输流包承载 PSI分段的首字节,则 payload_unit_start_indicator 值必为 1,指示此传输流包的有效载荷的首字节承载pointer_field. 若传输流包不承载 PSI 分段的首字节,则 payload_unit_start_indicator 值必为 0,指示在此有效载荷中不存在 pointer_field 只要是PSI就一定会有pointer_field

type MpegTsPacket

type MpegTsPacket struct {
	Header  MpegTsHeader
	Payload []byte
}

Packet == Header + Payload == 188 bytes

func ReadTsPacket

func ReadTsPacket(r io.Reader) (packet MpegTsPacket, err error)

type MpegTsPesStream

type MpegTsPesStream struct {
	TsPkt  MpegTsPacket
	PesPkt MpegTsPESPacket
}

每个传输流和节目流在逻辑上都是由 PES 包构造的

type MpegTsPmtStream

type MpegTsPmtStream struct {
	StreamType    byte   // 8 bits 指示具有 PID值的包内承载的节目元类型,其 PID值由 elementary_PID所指定
	Reserved5     byte   // 3 bits 保留位
	ElementaryPID uint16 // 13 bits 指定承载相关节目元的传输流包的 PID
	Reserved6     byte   // 4 bits 保留位
	EsInfoLength  uint16 // 12 bits 该字段的头两比特必为'00',剩余 10比特指示紧随 ES_info_length字段的相关节目元描述符的字节数

	// N Loop Descriptors
	Descriptor []MpegTsDescriptor // 不确定字节数,可变
}

type MpegTsStream

type MpegTsStream struct {
	PAT       MpegTsPAT // PAT表信息
	PMT       MpegTsPMT // PMT表信息
	PESBuffer map[uint16]*MpegTsPESPacket
	PESChan   chan *MpegTsPESPacket
}

func (*MpegTsStream) Feed

func (s *MpegTsStream) Feed(ts io.Reader) (err error)

func (*MpegTsStream) ReadPAT

func (s *MpegTsStream) ReadPAT(packet *MpegTsPacket, pr io.Reader) (err error)

func (*MpegTsStream) ReadPMT

func (s *MpegTsStream) ReadPMT(packet *MpegTsPacket, pr io.Reader) (err error)

type MpegtsPESFrame

type MpegtsPESFrame struct {
	Pid                       uint16
	IsKeyFrame                bool
	ContinuityCounter         byte
	ProgramClockReferenceBase uint64
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL