Documentation ¶
Index ¶
- Constants
- Variables
- func GetCRC32(data []byte) (crc uint32)
- func GetCRC32_2(data net.Buffers) (crc uint32)
- func WriteDefaultPATPacket(w io.Writer) (err error)
- func WritePAT(w io.Writer, pat MpegTsPAT) (err error)
- func WritePATPacket(w io.Writer, tsHeader []byte, pat MpegTsPAT) (err error)
- func WritePESHeader(w io.Writer, header MpegTsPESHeader) (written int, err error)
- func WritePMT(w io.Writer, pmt MpegTsPMT) (err error)
- func WritePMTBody(w io.Writer, pmt MpegTsPMT) (err error)
- func WritePMTDescriptor(w io.Writer, descs []MpegTsDescriptor) (err error)
- func WritePMTPacket(w io.Writer, videoCodec codec.VideoCodecID, audioCodec codec.AudioCodecID)
- func WritePSI(w io.Writer, pt uint32, psi MpegTsPSI, data []byte) (err error)
- func WriteTsHeader(w io.Writer, header MpegTsHeader) (written int, err error)
- type MpegTsDescriptor
- type MpegTsHeader
- type MpegTsHeaderAdaptationField
- type MpegTsOptionalPESHeader
- type MpegTsPAT
- type MpegTsPATProgram
- type MpegTsPESHeader
- type MpegTsPESPacket
- type MpegTsPMT
- type MpegTsPSI
- type MpegTsPacket
- type MpegTsPesStream
- type MpegTsPmtStream
- type MpegTsStream
- type MpegtsPESFrame
Constants ¶
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 )
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 ¶
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 )
var Crc32_Table = []uint32{}/* 256 elements not displayed */
var DefaultPATPacket = []byte{}/* 188 elements not displayed */
Functions ¶
func GetCRC32_2 ¶
func WriteDefaultPATPacket ¶
func WritePESHeader ¶
func WritePESHeader(w io.Writer, header MpegTsPESHeader) (written int, 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 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
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 (节目映射表)
type MpegTsPSI ¶
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) 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)