2012-07-04 18 views
19

Recientemente tuve la oportunidad de trabajar con dos dispositivos que están transmitiendo el H264 a través de RTSP. Y me encontré con algún problema al tratar de descomprimir esta secuencia usando la biblioteca FFmpeg.FFmpeg no puede decodificar H264 stream/frame data

Cada vez que el "avcodec_decode_video2" se llama - FFmpeg sólo dice algo así como:

[H264 @ 00339220] ningún marco!

Mi flujo H264 prima I datos de trama comienza así: " 88 84 21 3F F8 F8 0D ..." (por lo que yo entiendo esto 0x65 indica que se trata de un marco IDR?)

Otros marcos para un dispositivo comienza como: " 9A 22 07 F3 4E 48 CC ...."

y para otro dispositivo - de esta manera: " 9A 25 C1 1C 45 62 39 .... "

  • ¿Falta aquí algo de datos de marcos?
  • ¿Necesita FFmpeg configurar algunos parámetros adicionales?

que estaba esperando al menos "" bytes en el inicio de los datos de la trama ... pero esto es lo que tengo ..

Respuesta

21

Ok, lograron hacer las cosas trabajando.

  • que tenía que incluir la secuencia (MSF) y parámetros de imagen fija (PPS) para mis datos de la trama antes de enviar marco a la FFmpeg.
  • Necesitaba agregar 4 bytes adicionales "00 00 00 01" después de los datos de SPS y PPS.

Aquí es un poco de imagen que muestra lo que quiero decir: enter image description here

Bytes "65 88 ..." es donde comienza mi datos de trama original.

Esta información de SPS y PPS no se incluyó en el paquete de RTP. Estoy usando la biblioteca Live555 para la transmisión RTSP, así que he utilizado las subscripciones "fmtp_spropparametersets" para obtener lo que necesito. Esta información fue codificada en Base64. (Ejemplo: Algo como esto "Z0KAKNoC0EkQ, aM48gA ==") Tenga en cuenta que hay dos "parámetros" SPS y PPS separados por "," y esos parámetros no tienen un "00 00 00 01" incluido, por lo que necesito agregarlos

Algunos ejemplo de código (estoy usando biblioteca Qt aquí):

QByteArray  ba   = pSubSession->fmtp_spropparametersets(); 
QList<QByteArray> recordsList = ba.split(','); 

for (int i = 0; i < recordsList.size(); i++) 
{ 
    mExtraData.append(char(0x00)); 
    mExtraData.append(char(0x00)); 
    mExtraData.append(char(0x00)); 
    mExtraData.append(char(0x01)); 

    mExtraData += QByteArray::fromBase64(recordsList.at(i)); 
} 

Ahora para cada cuadro que hago algo como esto:

hace
QByteArray ba = QByteArray(4, 0); // Prepare the "00 00 00 01" 
      ba[3] = 0x01; 

mpTrackVideo->buffer.insert(0, mExtraData); 
mpTrackVideo->buffer.insert(mExtraData.size(), ba); 

Año pensé que tenía el apoyo corriente H264 Integrado en mi proyecto hasta que tuve la oportunidad de probarlo con otros dispositivos ... Por lo tanto, debe tener en cuenta que algunos dispositivos pueden enviar datos SPS y PPS por cada cuadro I ... ¡y otros no!

Cuestiones relacionadas