ios cocoa-touch avfoundation video-capture

grabación de video sin fin ios



cocoa-touch avfoundation (1)

Estoy intentando desarrollar una aplicación para iPhone que usará la cámara para grabar solo los últimos minutos / segundos. Por ejemplo, graba una película durante 5 minutos, haga clic en "guardar" y solo se guardarán los últimos 30 segundos. No quiero grabar realmente cinco minutos y luego cortar los últimos 30 segundos (esto no funcionará para mí). Esta idea se llama "Grabación en bucle" .

Esto se traduce en una grabación de video sin fin, pero solo recuerda la última parte. La aplicación de precorder hace lo que quiero hacer. (Quiero usar esta función en otro contexto) Creo que esto debería simularse fácilmente con un búfer circular . Comencé un proyecto con AVFoundation. Sería increíble si pudiera de alguna manera redirigir los datos de video a un búfer circular (que implementaré). Encontré información solo sobre cómo escribirla en un archivo.

Sé que puedo cortar el video en intervalos y guardarlos, pero guardarlo y reiniciar la cámara para grabar otra parte tomará tiempo y es posible perder algunos momentos importantes en la película.

Se agradecería cualquier pista de cómo redirigir los datos de la cámara.


¡Importante! A partir de iOS 8, puede utilizar VTCompressionSession y tener acceso directo a las unidades NAL en lugar de tener que excavar en el contenedor.

Bueno, afortunadamente, puedes hacer esto y te diré cómo, pero tendrás que ensuciarte las manos con el contenedor MP4 o MOV. Un recurso útil para esto (aunque es más específico para MOV) es el manual de Introducción al Formato de Archivo Quicktime de Apple http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.html#//apple_ref/doc/uid/TP40000939-CH202-TPXREF101

Lo primero es lo primero: no podrá comenzar su película guardada desde un punto arbitrario 30 segundos antes de que finalice la grabación, tendrá que usar algunos fotogramas en aproximadamente 30 segundos. Dependiendo de cuál sea su intervalo de fotogramas clave, pueden pasar varios segundos antes o después de esa marca de 30 segundos. Podría usar todos los fotogramas I y comenzar desde un punto arbitrario, pero probablemente querrá volver a codificar el video después porque será bastante grande.

Así que sabiendo eso, sigamos adelante.

El primer paso es cuando configura su AVAssetWriter, querrá configurar la propiedad expectsMediaDataInRealTime de AVAssetWriterInput en YES.

En la devolución de llamada de captureOutput podrás hacer un subproceso del archivo al que estás escribiendo. El primer fread te dará un poco de encabezado de MP4 / MOV (sea cual sea el formato que estés usando) (es decir, el átomo ''ftyp'', el átomo ''ancho'' y el comienzo del átomo ''mdat''). Quieres lo que está dentro de la sección ''mdat''. Así que el desplazamiento desde el que comenzarás a guardar los datos será de 36 aproximadamente.

Cada lectura te dará 0 o más Unidades AVC NAL. Puede encontrar una lista de tipos de unidades NAL en la Tabla 7-1 de ISO / IEC 14496-10. Estarán en un formato ligeramente diferente al especificado en el Anexo B, pero está bien. Además, solo habrá segmentos IDR y no IDR en el archivo MP4 / MOV. IDR será el I-Frame al que quieres colgar.

El formato de la unidad NAL en el contenedor MP4 / MOV es el siguiente:

4 bytes - Size [Size] bytes - NALU Data data[0] & 0x1F - NALU Type

Así que ahora tienes los datos que estás buscando. Cuando vaya a guardar este archivo, tendrá que actualizar el contenedor de MPV / MOV con la longitud correcta, el recuento de muestras, tendrá que actualizar el átomo ''stsz'' con los tamaños correctos para cada muestra y cosas como actualizar el encabezados de medios y encabezados de pista con la duración correcta de la película y así sucesivamente. Lo que probablemente recomendaría hacer es crear un contenedor de muestra en la primera ejecución que puede más o menos simplemente sobrescribir / aumentar con los datos apropiados para esa película en particular. Usted querrá hacer esto porque los codificadores en los diversos iDevices no tienen todos los mismos ajustes y el átomo ''avcC'' contiene información del codificador.

En este caso, realmente no necesita saber mucho sobre la transmisión de AVC, por lo que probablemente querrá concentrar su experimento en la actualización del formato de contenedor que elija correctamente. Buena suerte.