reconnect_delay_max ice_name h264 example bufsize stream ffmpeg h.264 rtsp

ice_name - ffmpeg stream rtsp



FFmpeg no puede decodificar datos de flujo/cuadro H264 (1)

Recientemente tuve la oportunidad de trabajar con dos dispositivos que transmiten el H264 a través de RTSP. Y me he encontrado con algún problema al intentar descomprimir esta secuencia usando la biblioteca FFmpeg.

Cada vez que se llama " avcodec_decode_video2 ", FFmpeg solo dice algo como:

[h264 @ 00339220] sin marco!

Los datos de mi cuadro H264 sin procesar en mi cuadro comienzan así: " 65 88 84 21 3F F8 F8 0D ..." (según tengo entendido, este 0x65 indica que es un cuadro IDR?)

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

y para otro dispositivo, como este: " 61 9A 25 C1 1C 45 62 39 ...."

  • ¿Estoy perdiendo algunos datos de marco aquí?
  • ¿FFmpeg necesita tener algunos parámetros adicionales configurados?

Esperaba al menos " 00 00 00 01 " bytes al comienzo para los datos del cuadro ... pero esto es lo que tengo ...


Ok, conseguí que las cosas funcionaran.

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

Aquí hay una pequeña imagen que muestra lo que quiero decir:

Bytes "65 88 ..." es donde comienzan mis datos de cuadros originales.

Esta información de SPS y PPS no se incluyó en el paquete RTP. Estoy usando la biblioteca Live555 para la transmisión RTSP, así que usé la función de 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 debe Agregalos.

Algunos ejemplos de código (estoy usando la 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 hago algo como esto:

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);

Hace un año pensé que tenía soporte para la transmisión de 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 de SPS y PPS para cada fotograma. .. y algunos podrían no!