Ok, así que me di cuenta de la corriente h264.
cómo detectar I-Frame:
- eliminar encabezado RTP
- cheque el valor del primer byte de la carga útil h264
- si el valor es 124 (0x7C) es un I-Frame
No puedo encontrar la corriente MPEG4-ES ... ¿alguna sugerencia?
EDIT: H264 IDR
Este funciona para mi flujo h264 (fmtp:96 packetization-mode=1; profile-level-id=420029;
). Acaba de pasar la matriz de bytes que representa el fragmento h264 recibido a través de RTP. Si desea pasar un RTP completo, simplemente corrija el valor RTPHeaderBytes
para omitir el encabezado RTP. Siempre obtengo el I-Frame, porque es el único marco que se puede fragmentar, ver here. ¡Utilizo este código (simplificado) en mi servidor, y funciona como un encanto! Si I-Frame (IDR) no está fragmentado, el fragment_type
sería 5, por lo que este código devolvería true
para los IDR fragmentados y no fragmentados.
public static bool isH264iFrame(byte[] paket)
{
int RTPHeaderBytes = 0;
int fragment_type = paket[RTPHeaderBytes + 0] & 0x1F;
int nal_type = paket[RTPHeaderBytes + 1] & 0x1F;
int start_bit = paket[RTPHeaderBytes + 1] & 0x80;
if (((fragment_type == 28 || fragment_type == 29) && nal_type == 5 && start_bit == 128) || fragment_type == 5)
{
return true;
}
return false;
}
Aquí está la tabla de tipos de unidad NAL:
Type Name
0 [unspecified]
1 Coded slice
2 Data Partition A
3 Data Partition B
4 Data Partition C
5 IDR (Instantaneous Decoding Refresh) Picture
6 SEI (Supplemental Enhancement Information)
7 SPS (Sequence Parameter Set)
8 PPS (Picture Parameter Set)
9 Access Unit Delimiter
10 EoS (End of Sequence)
11 EoS (End of Stream)
12 Filter Data
13-23 [extended]
24-31 [unspecified]
EDIT 2: MPEG4 I-VOP
me olvidó actualizar esta ... Gracias a Che y ISO IEC 14496-2 documento, ¡Pude resolver esto! Che era rito, pero no es tan preciso en su respuesta ... así que aquí es cómo encontrar cuadros I, P y B (I-VOP, P-VOP, B-VOP) en resumen:
- VOP (Video Object Plane - frame) comienza con un código
000001B6
(hex). Es lo mismo para todos los cuadros MPEG4 (I, P, B)
A continuación sigue mucha más información, que no voy a describir aquí (ver el documento IEC), pero solo (como dijo) necesitamos la 2 bits más altos desde el siguiente byte (los siguientes dos bits después del byte con el valor B6
). Esos 2 bits que indican al VOP_CODING_TYPE, consulte la tabla:
VOP_CODING_TYPE (binary) Coding method
00 intra-coded (I)
01 predictive-coded (P)
10 bidirectionally-predictive-coded (B)
11 sprite (S)
Por lo tanto, para encontrar siempre el cuadro I encontrar el paquete a partir de cuatro bytes 000001B6
y que tienen los más altos dos bits del byte siguiente 00
. Esto encontrará I frame en MPEG4 stream con un tipo de objeto de video simple (no estoy seguro de simple avanzado).
Para cualquier otro problema, puede consultar el documento provisto (ISO IEC 14496-2), aquí encontrará todo lo que necesita saber sobre MPEG4.:)
eso no es correcto (ni de lejos). Puede suceder que funcione para las transmisiones que está viendo. Echa un vistazo a RFC 3984 (que pronto será reemplazado por 3984bis) en el IETF. Tenga en cuenta que puede tener NAL fragmentados (con encabezados de fragmentos, paquetes STAP con múltiples NAL (y el iframe puede comenzar en el segundo NAL de un paquete), etc., etc. Realmente desea escanear todos los NAL en la secuencia de paquetes para NALs que introducen un IDR.Tenga en cuenta que el i-frame/si-frame real puede estar precedido por un conjunto de conjuntos de parámetros de secuencia e imagen, que son * importantes * y deben considerarse parte del IDR (pero no son un marcador) – jesup
Bueno, solo funciona para mí, entonces ... = | – Cipi
@jesup ¿Los conjuntos de parámetros normalmente no se envían fuera de banda? También, ¡hola! Me apetece encontrarlo aquí ... –