2011-04-11 12 views
23

Estoy tratando de mostrar el contenido de un archivo de video (digamos que sin el audio por el momento) en un objeto 3D mapeado con UV en OpenGL. He hecho bastante en OpenGL, pero no tengo idea de dónde comenzar en el manejo de archivos de video, y la mayoría de los ejemplos parecen ser para obtener cuadros de video de las cámaras, que no es lo que busco.iOS4: ¿cómo uso el archivo de video como una textura OpenGL?

Por el momento, creo que si puedo obtener fotogramas individuales del video como CGImageRef me gustaría configurar, así que me pregunto cómo hacerlo. Tal vez incluso hay mejores formas de hacer esto? ¿Dónde debo comenzar y cuál es el formato de archivo más sencillo para la reproducción de videos en iOS? .mov?

Respuesta

32

Disculpas; escribiendo en un iPhone así que seré un poco breve.

Cree un AVURLAsset con la URL de su video, que puede ser una URL de archivo local si lo desea. Cualquier cosa que QuickTime pueda hacer está bien, entonces MOV o M4V en H.264 es probablemente la mejor fuente.

Consulta el elemento para las pistas de tipo AVMediaTypeVideo. Deberías obtener solo uno a menos que tu video fuente tenga múltiples ángulos de cámara de algo así, así que solo al tomar ObjectAtIndex: 0 deberías darte el AVAssetTrack que deseas.

Utilícelo para crear un AVAssetReaderTrackOutput. Probablemente quiera especificar kCVPixelFormatType_32BGRA.

Cree un AVAssetReader utilizando el activo; adjunte la salida de la pista del lector de activos como salida. Y llama a startReading.

A partir de ese momento, puede invocar copyNextSampleBuffer en la salida de la pista para obtener nuevos CMSampleBuffers, colocándolo en la misma posición que si estuviera recibiendo información de la cámara. De modo que puede bloquear eso para obtener contenidos de píxeles e insertarlos en OpenGL a través de la extensión BGRA de Apple.

+8

¿Qué hay del sonido? –

+0

También gracias. Todo esto funciona perfectamente y puedes obtener FPS muy altos (dependiendo de la velocidad de datos de video). –

+0

Otra gracias. Esto funcionó bien para mí también. Solo tenga en cuenta que debe manejar la velocidad de fotogramas de la reproducción de video sincronizándose usted mismo. –

-1

Probablemente va a tener que usar una capa de jugador y aplanar su contenido en un contexto de mapa de bits. Consulte la documentación de AVPlayerLayer. El rendimiento puede ser muy pobre sin embargo.

Cuestiones relacionadas