Tengo una transmisión H.264 sin procesar desde una cámara IP empaquetada en tramas RTP. Quiero obtener datos H.264 sin formato en un archivo para poder convertirlo con ffmpeg
.H.264 sobre RTP - Identificar tramas SPS y PPS
Así que cuando quiero escribir los datos en mi archivo H.264 prima descubrí que tiene que tener este aspecto:
00 00 01 [SPS]
00 00 01 [PPS]
00 00 01 [NALByte]
[PAYLOAD RTP Frame 1] // Payload always without the first 2 Bytes -> NAL
[PAYLOAD RTP Frame 2]
[... until PAYLOAD Frame with Mark Bit received] // From here its a new Video Frame
00 00 01 [NAL BYTE]
[PAYLOAD RTP Frame 1]
....
por lo que obtener la SPS
y la PPS
del Session Description Protocol
de mi precedente a la comunicación RTSP
. Además, la cámara envía SPS
y PPS
en dos mensajes individuales antes de comenzar con la transmisión de video.
Así que capturan los mensajes en este orden:
1. Preceding RTSP Communication here (including SDP with SPS and PPS)
2. RTP Frame with Payload: 67 42 80 28 DA 01 40 16 C4 // This is the SPS
3. RTP Frame with Payload: 68 CE 3C 80 // This is the PPS
4. RTP Frame with Payload: ... // Video Data
Luego vienen algunos marcos con carga útil y en algún momento un marco de RTP con el Marker Bit = 1
. Esto significa (si lo hice bien) que tengo un marco de video completo. Después de esto, escribo la Secuencia de Prefijo (00 00 01
) y el NAL
de la carga útil nuevamente y continúo con el mismo procedimiento.
Ahora mi cámara me envía después de cada 8 marcos de video completos al SPS
y al PPS
nuevamente. (De nuevo en dos marcos RTP, como se ve en el ejemplo anterior). Sé que especialmente el PPS
puede cambiar entre transmisiones, pero ese no es el problema.
Mis preguntas son ahora:
1. ¿Es necesario escribir el SPS/PPS cada fotograma de vídeo octava?
Si mi SPS
y mi PPS
no cambian, debería ser suficiente para tenerlos escritos al comienzo de mi archivo y nada más?
2. ¿Cómo distinguir entre SPS/PPS y marcos RTP normales?
En mi código C++ que analiza los datos transmitidos, necesito hacer una diferencia entre las tramas RTP con carga normal y las que llevan el SPS/PPS
. ¿Cómo puedo distinguirlos? De acuerdo, los marcos SPS/PPS
son generalmente mucho más pequeños, pero eso no es una llamada a guardar en la que confiar. Porque si los ignoro necesito saber qué datos puedo descartar, o si necesito escribirlos tengo que poner el Prefijo 00 00 01
delante de ellos. ? ¿O es una regla fija que ocurren cada 8vo Video Frame?
Gracias por esta pregunta. Tengo la misma pregunta que tú. Leí el código fuente de live555 y no sé por qué guardan cada paquete/foto de esa manera. Después de leer este hilo, las cosas se vuelven claras para mí. Como una sugerencia basada en la implementación de live555, el bit marcador solo se usa en otro códec, H264 tiene su propio bit de inicio y final para representar para el inicio/fin del cuadro, el bit marcador no se usa para H264. – user534498