2012-04-04 19 views
5

Imagine que tengo tramas H.264 AnxB procedentes de una conversación en tiempo real. ¿Cuál es la mejor manera de encapsular en la corriente de transporte MPEG2 mientras se mantiene la información de sincronización para la reproducción posterior?encapsulando velocidades H.264 de velocidad de cuadro variable en la corriente de transporte MPEG2

Estoy usando librerías libavcodec y libavformat. Cuando obtengo el puntero a objeto (* pcc) de tipo AVCodecContext, configuro el comando foll.

pcc->codec_id = CODEC_ID_H264; 
pcc->bit_rate = br; 
pcc->width = 640; 
pcc->height = 480; 
pcc->time_base.num = 1; 
pcc->time_base.den = fps; 

Cuando recibo unidades NAL, creo un AVPacket y llamo av_interleaved_write_frame().

AVPacket pkt; 
av_init_packet(&pkt); 
pkt.flags |= AV_PKT_FLAG_KEY; 
pkt.stream_index = pst->index; 
pkt.data = (uint8_t*)p_NALunit; 
pkt.size = len; 

pkt.dts = AV_NOPTS_VALUE; 
pkt.pts = AV_NOPTS_VALUE; 

av_interleaved_write_frame(fc, &pkt); 

básicamente Tengo dos preguntas:

1) para imágenes por segundo variables, es que hay una manera de no especificar el ss. pcc-> time_base.num = 1; pcc-> time_base.den = fps; y lo reemplaza con algo para indicar una tasa de cuadros variable?

2) Al enviar los paquetes, ¿qué "marcas de tiempo" debo asignar a pkt.dts y pkt.pts?

En este momento, cuando reproduzco la salida usando ffplay, estoy reproduciendo a una velocidad de fotogramas constante (fps) que utilizo en el código anterior.

También me gustaría saber cómo acomodar la resolución espacial variable. En la transmisión que recibo, cada fotograma clave está precedido por SPS y PPS. Sé cada vez que cambia la resolución espacial. ¿Hay alguna forma de no tener que especificar pcc-> width = 640; pcc-> altura = 480; por adelantado? En otras palabras, indique que la resolución espacial puede cambiar a mitad de camino.

Muchas gracias, Eddie

Respuesta

0

DTS y PTS se miden en un reloj de 90 KHz. Ver ISO 13818 parte 1 sección 2.4.3.6 camino abajo debajo de la tabla de sintaxis.

En cuanto a la velocidad de cuadro variable, su marco puede o no tener una forma de generar esto (parámetros_vui.fixed_frame_rate_flag = 0). Si el software de reproducción lo maneja es una pregunta TOTALMENTE diferente. La mayoría de los jugadores asumen una velocidad de cuadros fija independientemente de PTS o DTS. mplayer no puede calcular la velocidad de fotogramas correctamente para un flujo de transporte de velocidad fija generado por ffmpeg.

Creo que si va a cambiar la resolución que necesita para finalizar la secuencia (tipo_unidad_nal 10 u 11) y comenzar una nueva secuencia. Puede estar en el mismo flujo de transporte (asumiendo que su cliente no es demasiado simple).

Cuestiones relacionadas