Descripción detallada del protocolo de encapsulación de video TS

Descripción general del formato de encapsulación TS

TS (Transport Stream) es un formato de empaquetado de video común, utilizado principalmente en el campo de la transmisión de video en línea y televisión digital. Las ventajas y desventajas son las siguientes:
Ventajas:
1. Fuerte tolerancia a fallas: en caso de pérdida de paquetes o pérdida de información de error durante la transmisión, se puede recuperar rápidamente para garantizar la integridad de los datos.
2. Admite acceso aleatorio: el formato TS segmenta los datos y se puede acceder a cada segmento y controlarlo de forma independiente, lo que permite el acceso aleatorio al video.
3. Buen rendimiento en tiempo real: el formato de encapsulación TS adopta un método de transmisión segmentado, y el tamaño de cada segmento de datos es relativamente pequeño, lo que puede reducir efectivamente la demora y realizar la transmisión de datos en tiempo real.
4. Buena confiabilidad: el formato de encapsulación TS admite multiplexación, que puede mezclar múltiples flujos de datos para mejorar la eficiencia y confiabilidad de la transmisión de datos.

Desventajas:
1. Codificación y decodificación complicadas: el formato de encapsulación TS necesita segmentar e integrar datos de video, lo que requiere una tecnología de codificación de audio y video superior. 2.
Archivos más grandes: mecanismo de segmentación TS, que introduce cierta información de encabezado de datos.
3. No es compatible procesamiento de subtítulos: el formato de encapsulación TS no admite el procesamiento de datos de subtítulos, los usuarios deben agregar subtítulos manualmente

paquetes TS

La unidad de datos del formato de encapsulación TS es un paquete ts. Cada paquete tiene su propio pid y el tamaño del paquete se fija en 188 bytes.
El paquete ts se divide en tres categorías: paquete pat, paquete pmt, paquete pes:

  • El paquete PAT (Program Associate Table) es el primer paquete, que es la entrada de ts, y su pid está fijo en 0x00; el paquete pat contiene el pid del paquete pmt, y el paquete pmt se puede ubicar a través del paquete pat
  • PMT (tabla de mapa de programas) se utiliza para describir la información de contenido de una transmisión, incluida la información de audio, video o datos. El paquete pmt almacena el pid del paquete de flujo de datos, el PID del paquete de audio es 0x102 y el PID del paquete de video es 0x101
  • El paquete PES (Transmisión elemental paquetizada) es una unidad de datos básica utilizada para transmitir información de datos multimedia, como audio y video.

En el flujo TS, los paquetes PAT y PMT se implementan repetidamente y uno aparece en aproximadamente 0,5 segundos para garantizar la decodificación en tiempo real. La tabla PAT es la base del flujo TS, y cualquier análisis de flujo TS y búsqueda de programas comienza desde la tabla PAT.

Estructura del paquete TS

El tamaño fijo del paquete ts es de 188 bytes y la fórmula estructural correspondiente es la siguiente:
tsPacket = tsheader + campo de adaptación + carga útil;

tsheader: el encabezado del paquete de datos ts, cada paquete de datos lo tiene, el encabezado del archivo se fija en 4 bytes
campo de adaptación: campo de llenado de datos, algunos paquetes de datos tienen este campo, algunos paquetes de datos no existen este campo (usado como Datos relleno)
carga útil: campo de datos de audio y video, utilizado para almacenar datos de pes y datos originales de audio y video.

La estructura de los distintos tipos de paquetes es la siguiente:

TS流: 由一个个188字节的数据包组成                      
  +-+-+-+-+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  TS   |  =  |  Packet 1 |  Packet 2 |  Packet 3 |    ...    | Packet n-1|  Packet n |
  +-+-+-+-+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  
一个Packet:             4bytes             184bytes         
  +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Packet | =  |    ts header |       Packet data        |
  +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

PAT/PMT包结构, 只包含tsheader和PMT/PAT, 不包含adaption和pes
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | ts header |    PAT/PMT    |   Stuffing Bytss  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

PES包结构,可能包含adaption和pes字段
       4 byte         x byte                    184-x byte
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | ts header |  adaptation field |          payload(pes)       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

La estructura de datos del encabezado ts

Cada paquete TS contiene el campo de encabezado ts y el tamaño se fija en bytes 4. El significado de cada bit de datos en los cuatro bytes es el siguiente: un
total de 4 bytes (32 bits)

sync_byte                       (8bit)  同步字节,固定为0x47
transport_error_indicator	    (1bit)  传输错误指示符, 通常都为'0'
payload_unit_start_indicator    (1bit)  负载单元起始标示符,一个完整的数据包开始时标记为 '1'
transport_priority              (1bit)  传输优先级,0为低优先级,1为高优先级,通常取0
pid	                            (13bit) 传输包的PID, pat包固定为0x0000 
transport_scrambling_control	(2bit)  传输加扰控制,00表示未加密
adaptation_field_control        (2bit)  是否包含自适应区(adaption):00保留;01无自适应域,含有效负载;10含自适应域,无有效负载;11为同时带有自适应域和有效负载
continuity_counter              (4bit)  递增计数器,从0-f,起始值不一定取0,但必须是连续的

Estructura de datos del campo PAT

La estructura de la tabla de asociación de programas PAT (Program Associate Table) es la siguiente:

table_id	                (8bit)	PAT表固定为0x00
section_syntax_indicator	(1bit)	段语法标志位, 固定为1
zero	                    (1bit)	固定为0
reserved	                (2bit)	保留位,固定为11
section_length	            (12bit)	段长度(后面数据的长度),表示从下一个字段开始到CRC32(包含)之间有用的字节数
transport_stream_id	        (16bit)	传输流ID,固定为0x0001, 区别于一个网络中其它多路复用的流
reserved	                (2bit)	固定为11
version_number	            (5bit)	版本号,固定为00000,如果PAT有变化则版本号加1
current_next_indicator	    (1bit)	固定为1,表示这个PAT表可以用,如果为0则要等待下一个PAT表
section_number	            (8bit)	分段的号码. PAT可能分为多段传输, 第一段为00, 以后每个分段加1, 最多可能有256个分段
last_section_number	        (8bit)	固定为0x00, 最后一个分段的号码

开始循环,按顺序可能包含多个下面结构	 	 
program_number	            (16bit)	节目号为0x0000时表示这是NIT,节目号为0x0001,表示这是PAT
reserved	                (3bbit)	固定为111
PID	                        (13bit)	节目号对应内容的PID值0x1000, 也就是pmt的pid
结束循环	

CRC32	                    (32bit)	前面数据的CRC32校验码

Estructura de datos del campo PMT

PMT (Program Map Table), tabla de mapeo de programas, el PID del paquete se puede obtener de la tabla PAT.

table_id	                (8bit)	PMT表取值随意, 这里给定0x02
section_syntax_indicator	(1bit)	段语法标志位, 固定为1
zero	                    (1bit)	固定为0
reserved	                (2bit)	保留位,固定为11
section_length	            (12bit)	后面数据的长度, 表示从下一个字段开始到CRC32()之间有用的字节数
program_number	            (16bit)	频道号码,表示当前的PMT关联到的频道, 取值0x0001
reserved	                (2bit)	固定为11
version_number	            (5bit)	PMT版本号码,固定为00000,如果PAT有变化则版本号加1
current_next_indicator	    (1bit)	发送的PMT表是当前有效还是下一个PMT有效, 固定为1
section_number	            (8bit)	固定为0x00, PMT可能分为多段传输,第一段为00, 以后每个分段加1, 最多可能有256个分段
last_section_number	        (8bit)	分段数,固定为0x00
reserved	                (3bit)	保留位, 固定为111
PCR_PID	                    (13bit)	PCR(节目参考时钟)所在TS分组的PID,指定为视频PID
reserved	                (4bit)	固定为1111
program_info_length	        (12bit)	节目描述信息,指定为0x000表示没有,2bit为00, 该域指出跟随其后对节目信息的描述的字节数。

开始循环,按顺序可能包含多个	 	 
stream_type	                (8bit)	流类型,标志是Video还是Audio还是其他数据,h.264编码对应0x1b,aac编码对应0x0f,mp3编码对应0x03
reserved	                (3bit)	固定为111
elementary_PID	            (13bit)	与stream_type对应的PID
reserved	                (4bit)	固定为1111
ES_info_length	            (12bit)	描述信息,指定为0x000表示没有
结束循环

reserved_5                  3bit    保留位, 固定为0x07
reserved_6                  4bit    保留位, 固定为0x0F	 	 

CRC32	                    32bit	前面数据的CRC32校验码

Información de la estructura de datos del campo de adaptación.

El campo de adaptación se llena con datos cuando los datos de audio y video son insuficientes.

adaptation_field_length                 (8bit)    adaption字段的长度(后面的字段不包括当前字段)
discontinuity_indicator                 (1bit)    指示数据流是否存在不连续的情况
randort7_acce55_indicator               (1bit)    指示数据流中是否存在重要的组或关键帧
elementary_stream_priority_indicator    (1bit)    指示数据流的优先级
PCR_flag                                (1bit)    PCR(Programme Clock Reference)字段是否存在
OPCR_flag                               (1bit)    OPCR字段是否存在
splicing_point_flag                     (1bit)    数据流中是否存在插播点 
transport_private_data_flag             (1bit)    是否存在私有数据
adaptation_field_extension_flag         (1bit)    用于指示是否存在ADAPTATION FIELD EXTENSION

//PCR_flag==1 控制TS数据流同步的42位时间戳
program_clock_reference_base            (33bit)
Reserved                                (6bit)
program_clock_reference_extension       (9bit)

//OPCR_flag==1 ( Optional Program Clock Reference)
//用于同步接收到的多个数据流,其在时间戳方面与 PCR 相似,但只在数据流中的某些节目中使用
original_program_clock_reference_base   33bit
Reserved                                6bit
original_program_clock_reference_extension 9bit

//splicing_point_flag==1
splice_countdown                        (8bit)

//transport_private_data_flag==1
transport_private_data_length           (8bit)
for (1=0,i<transport_private_data_length; i++){
    
    
        private data byte               (8bit)
}

//adaptation_field_extension_flag==1
adaptation_field_extension_length       (8bit)
Itw_flag                                (1bit)
piecewise_rate_flag                     (1bit)
seamless_splice_flag                    (1bit)
Reserved                                (5bit)
//Itw_flag==1
ltw_valid_flag                          (1bit)    
ltw_offset                              (15bit)

//piecewise_rate_flag ==1
reserved                                (2bit)
piecewise_rate                          (22bit)

//seamless_splice_flag==1
Splice_type                             (4bit)
DTS_next_AU[32..30]                     (3bit)
marker_bit                              (1bit)
DTS_next_AU[29 ..15]                    (15bit)
marker_bit                              (1bit)
DTS_next_AU[14..0]                      (15bit)
marker_bit                              (1bit)
for (i=0;i<N;i++){
    
    
reserved                                (8bit)
}

//last
for(i=0i<N;i++){
    
    
stuffing_byte                           (8bit)
}

Las tablas PAT y PMT no tienen el campo Adaptación cuando se empaqueta el flujo TS, y si la longitud no es suficiente, simplemente agregue 0xff directamente. Tanto el flujo de video como el flujo de audio deben agregar un campo de adaptación, que generalmente se agrega al primer paquete ts y al último paquete ts de un marco, y el paquete ts medio no se agrega.
Preste atención al empaquetar archivos ts, debe agregar un reloj PCR; de lo contrario, no se reproducirá en el reproductor VLC. No se puede obtener la duración del video.
Aquí, tomando la implementación de Java como ejemplo, presente el método de generación de valor de PCR:

void create_adaption_field(AdaptionField  adption_field, long pts, boolean has_pcr)
{
    
    
    int index = 0;
    Arrays.fill(adption_field.adaption_buffer,0,adption_field.adaption_buffer.length, (byte) 0xFF);

    if (has_pcr)
    {
    
    
        //包含pcr
        long pcrValue = pts * 300;
        long PCR_BSE = pcrValue / 300;
        long PCR_EXT = pcrValue % 300;
        后续可能会更新,7个字节
        adption_field.adaption_buffer[index++] = 0x07; 
        //取0x50表示包含PCR
        adption_field.adaption_buffer[index++] = 0x50; 
        adption_field.adaption_buffer[index++] = (byte)((byte)0xff & (PCR_BSE >> 25)); //PCR_BASE的前8位
        adption_field.adaption_buffer[index++] = (byte)((byte)0xff & (PCR_BSE >> 17)); //PCR_BASE的紧跟8位
        adption_field.adaption_buffer[index++] = (byte)((byte)0xff & (PCR_BSE >> 9));  //PCR_BASE的紧跟8位
        adption_field.adaption_buffer[index++] = (byte)((byte)0xff & (PCR_BSE >> 1));  //PCR_BASE的紧跟8位
        adption_field.adaption_buffer[index++] = (byte)((PCR_BSE <<  7 |  PCR_EXT >> 8 | 0x7e) & 0xFF);
        adption_field.adaption_buffer[index++] = (byte)(0xff & PCR_EXT);

    }
    else
    {
    
    
        //不包含pcr
        adption_field.adaption_buffer[index++] = 0x07; //后续可能会更新, 7个字节
        adption_field.adaption_buffer[index++] = 0x00; //0x00都不包含
    }
    adption_field.adaption_field_size = index;
}

Estructura de datos del campo PES

La capa pes (carga útil en la capa ts) agrega una marca de tiempo y otra información a cada cuadro de video/audio.El paquete pes tiene mucho contenido, y solo dejamos los más utilizados.
La longitud es de 14 (solo incluye pts)/18 (incluidos pts y dts) bytes

pes_start_code	    (24bit)        	开始码,固定为0x000001
stream id	        (8bit)	        音频取值(0xc0~0xdf),通常为0xc0,视频取值(0xe0-0xef),通常为0xe0
pes_packet_length	(16bit)	        后面pes数据的长度,0表示长度不限制,只有视频数据长度会超过0xffff
flag	            (8bit)	        是否加密, 通常取值0x80,表示数据不加密、无优先级、备份的数据
flag	            (8bit)          是否包含pts和dts, 取值0x80表示只含有pts,取值0xc0表示含有pts和dts
pes_data_length	    (8bit)        	后面数据的长度,取值510
pts	                (40bit)	        pts显示时间戳
dts	                (40bit)	        dts解码时间戳

pts es la marca de tiempo de visualización, dts es la marca de tiempo de decodificación, se requieren ambas marcas de tiempo para los datos de video, pts y dts son iguales para los datos de audio, por lo que solo se necesita pts.
Hay dos tipos de marcas de tiempo, pts y dts, que son causados ​​por fotogramas B, y los pts de los fotogramas I y los fotogramas P son iguales a dts. Si un video no tiene fotogramas B, los pts siempre serán los mismos que los dts. Lee cuadros de video secuencialmente desde el archivo, y el orden de los cuadros extraídos es el mismo que el de dts.

Estrategia de paquetización de flujo de datos TS

Aquí, un cuadro de datos de audio AAC se toma como ejemplo para ilustrar la estrategia de paquetización del formato de encapsulación TS. Por lo general, un paquete TS no puede transmitir un cuadro completo, y un cuadro de datos de audio y video debe dividirse en varios paquetes. La estrategia detallada es la siguiente:
1. Primero agregue el paquete PAT y el paquete PMT en el flujo como el comienzo del flujo
2. Luego agregue el primer paquete PES como el comienzo del paquete de datos, incluida la Adaptación y el PES. El paquete contiene información como la longitud de la trama, la tasa de muestreo, pts/dts, etc.
3. Agregue el paquete PES de datos divididos en el medio, que solo contiene tsheader y datos de audio y video
4. El último paquete de datos contiene ts header, Adaption, datos de audio y video como final, pero no contiene el campo PES.

La estructura correspondiente se muestra en la siguiente figura:

  +-+-+-+-+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
  |  TS   |  =  |  PAT包  |  PMT包 |  PES1  |    ...    | PES n | 
  +-+-+-+-+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
  
第一个PES包:            4Byte       8Byte     14Byte(pts)  162Btte
  +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Packet | =  |    ts header | Adaption |  PES |       paylod |
  +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

中间的PES包, 只包含tsheader和payload, 不包含adaption和pes
                       4Byte             184Byte
  +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Packet | =  |    ts header |       payload        |
  +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

最后一个PES包 包含tsheader、adaption、payload
       4 byte         x byte                    184-x byte
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | ts header |  adaptation field |          payload        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Supongo que te gusta

Origin blog.csdn.net/yang1fei2/article/details/130913479
Recomendado
Clasificación