2012-04-25 9 views
14

Puedo obtener los datos de la trama RGBA de la cámara, y quiero codificarla en formato H.264. He usado FFmpeg para codificar y decodificar video H.264, pero con un tamaño de fotograma de 640x480 es demasiado lento para mis necesidades.¿Cómo puedo realizar la codificación H.264 acelerada por hardware y la decodificación para la transmisión?

Me gustaría utilizar la aceleración de hardware para acelerar la codificación y la decodificación, así que ¿cómo lo haría?

Además, necesito poder transmitir el video codificado a través de la red y decodificarlo en el otro extremo. ¿Cómo puede hacerse esto?

+0

El título de la pregunta es "..video decodificación", pero la pregunta real es acerca de la codificación, ¿no? Tal vez, deberías editar el título? – Anastasia

+0

Hay una biblioteca que permite codificar tramas sin formato a H.264: http://www.foxitsolutions.com/iphone_h264_sdk.html. Esta biblioteca utiliza un codificador de hardware y ofrece marcos H.264 separados. Consulte esta pregunta y respuesta: http://stackoverflow.com/questions/7979842/video-encoding-libraries-for-ios/ – Anastasia

+0

Quizás un duplicado: http://stackoverflow.com/questions/25197169/how-to- decode-ah-264-frame-on-ios-by-hardware-decoding –

Respuesta

18

Si desea hacer una codificación de video acelerada por hardware y decodificación de video H.264 en iOS, la única forma de hacerlo es con AVFoundation. No utilice bibliotecas de terceros para la codificación o decodificación, ya que todas ellas están vinculadas a la CPU, y son mucho más lentas que las que obtiene de AVFoundation. La única razón para usar un codificador o decodificador de terceros sería si está trabajando con un formato no compatible con iOS de manera predeterminada.

Para la decodificación acelerada por hardware, querrá utilizar una instancia de AVAssetReader (o una de las clases de reproductor para la reproducción pura). Con un AVAssetReader, regularmente obtengo velocidades de reproducción 2X o superiores para leer videos codificados en H.264, por lo que los dispositivos iOS usan una muy buena aceleración de hardware para eso.

De manera similar, para la codificación acelerada, usará un AVAssetWriter. Hay algunos trucos para hacer que AVAssetWriter codifique a la mejor velocidad (alimentando tramas BGRA, utilizando un grupo de buffer de píxeles, usando los cachés de texturas iOS 5.0 si lee desde OpenGL ES), que describo detalladamente en this answer.

Si desea ver un código que utiliza las rutas más rápidas que he encontrado para la codificación y decodificación acelerada, puede consultar mi marco de código abierto GPUImage que, a diferencia del conectado por Anastasia, es totalmente gratuito. .

+1

Gracias por su código fuente y por su aspecto aproximado, pero no encontré la función o los parámetros de acceso a la codificación o decodificación de datos, necesito obtener el codificación de datos enviados a través de la red, y luego en el otro extremo de la codificación del equipo terminal, si ya tiene la interfaz o función, pero no encontré la esperanza de obtener su ayuda, muchas gracias – king

+1

Su lib es genial, pero es para aplicar filtros y procesar el video en bruto, pero no ayuda con la pregunta real, que es la codificación del hardware. Si el usuario desea enviar datos comprimidos a través de la red, ninguna de las API anteriores (lector de activos y escritor de activos) no será de ayuda. –

+0

@king - Ese podría ser el detalle que desea agregar a la pregunta, porque no especificó que quería acceso a las secuencias de entrada y salida sin procesar para la transferencia a través de la red. Mi respuesta se aplica a la codificación y decodificación de archivos, donde AVAssetReader y AVAssetWriter son claramente el camino a seguir. Aún así, usará AVFoundation para hacer su codificación aquí, como se describe en mohsenr: http://stackoverflow.com/a/3484950/19679. –

Cuestiones relacionadas