Decodificación Raw H264 corriente en android?

Tengo un proyecto en el que se me ha pedido que muestre una secuencia de vídeo en android, el flujo es H.264 en bruto y me estoy conectando a un servidor y recibirá un flujo de bytes desde el servidor.

Básicamente me pregunto ¿hay una manera de enviar bytes sin procesar a un decodificador en android y mostrarlo en una superficie?

He tenido éxito en la decodificación H264 envuelto en un contenedor mp4 utilizando el nuevo MediaCodec y MediaExtractor API en android 4.1, por desgracia no he encontrado una manera de decodificar un archivo crudo H264 o flujo utilizando estos API.

Entiendo que una manera es compilar y utilizar FFmpeg pero prefiero utilizar un método incorporado que puede utilizar aceleración HW. También entiendo RTSP streaming es compatible con Android, pero esto no es una opción. La versión de Android no es un problema.

No puedo proporcionar ningún código para esto por desgracia, pero haré todo lo posible para explicarlo basado en cómo lo hice funcionar.

Así que aquí está mi visión general de cómo conseguí crudo H.264 codificado de vídeo para trabajar con la clase MediaCodec ( http://developer.android.com/reference/android/media/MediaCodec.html ).

Usando el enlace anterior hay un ejemplo de cómo configurar el decodificador y cómo usarlo, necesitará configurarlo para descodificar H264 AVC.

El formato de H.264 es que está compuesto por unidades NAL, cada una comenzando con un prefijo inicial de tres bytes con los valores 0x00, 0x00, 0x01 y cada unidad tiene un tipo diferente dependiendo del valor del byte 4 después de estos 3 bytes iniciales. Una unidad NAL NO es una trama en el video, cada trama está formada por un número de unidades NAL.

Básicamente, escribí un método que encuentra cada unidad individual y la pasa al decodificador (una unidad NAL es el prefijo inicial y los bytes que hay después hasta el próximo prefijo inicial).

Ahora si usted tiene la disposición del decodificador para decodificar H.264 AVC y tiene un InputBuffer del decodificador entonces usted está listo para ir. Necesita llenar este InputBuffer con una unidad NAL y pasarlo de vuelta al decodificador y seguir haciendo esto para la longitud de la secuencia. Pero, para hacer este trabajo que tenía que pasar el descodificador de un SPS (Secuencia Parámetro Set) NAL unidad en primer lugar. Esta unidad tiene un valor de byte de 0x67 después del prefijo de inicio (el 4to byte), en algunos dispositivos el decodificador se bloquearía a menos que reciba primero esta Unidad. Básicamente hasta que encuentre esta unidad, ignore todas las demás unidades NAL y siga analizando la secuencia hasta que obtenga esta unidad, entonces puede pasar todas las demás unidades al decodificador.

Algunos dispositivos no necesitaron primero el SPS y otros lo hicieron, pero es mejor pasarlo primero.

Ahora si usted tenía una superficie que usted pasó al decodificador cuando usted lo configuró entonces una vez que consigue bastantes unidades de NAL para un marco debe exhibirlo en la superficie.

Puede descargar el H.264 sin procesar desde el servidor, luego ofrecerlo a través de un servidor HTTP local que se ejecuta en el teléfono y luego permitir que VLC para Android reproduzca desde ese servidor HTTP. Debe utilizar el esquema http / h264: // de VLC para forzar el demuxor a H.264 en bruto (si no forza el demuxer, VLC puede no ser capaz de reconocer el flujo, incluso cuando el tipo MIME devuelto por el servidor HTTP es Correctamente). Ver

https://github.com/rauljim/tgs-android/blob/integrate_record/src/com/tudelft/triblerdroid/first/VideoPlayerActivity.java#L211

Para obtener un ejemplo sobre cómo crear un Intent que lanzará VLC.

Nota: H.264 crudo aparentemente no tiene información de tiempo, por lo que VLC jugará lo más rápido posible. En primer lugar, la incorporación en MPEGTS será mejor. No he encontrado una lib de Android que lo haga todavía.

  • ¿Puedo utilizar las librerías de FFmpeg en una aplicación de Android?
  • ¿Cómo enviar streaming de audio en vivo sobre RTSP en dispositivos Android?
  • Android VideoView guardar RTSP secuencia
  • Dibujar superposición (HUD) en Android VideoView?
  • Transmisión en vivo de audio retrasos mientras se reproduce en android-16?
  • VLC RTSP transmisión en vivo a Android
  • Cómo transmitir vídeo desde Http o RTSP Url en android
  • Transmisión en vivo desde IPcamera al servidor wowza a través del dispositivo Android RTSP Android
  • Stream URL RTSP utilizando VideoView en android
  • ¿Cómo usar MediaCodec para decodificar datos del servidor RTSP?
  • RTSP a través de streaming de vídeo HTTPS por GStreamer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.