Estoy tratando de analizar cuadros H.264 desde un archivo .mov. Creo que he llegado a la conclusión de que mov.c de AVFormat, parte de FFMPEG, es el camino a seguir. Pero mov.c es ~ 2600 líneas de código siguiente sin comentario. Estoy buscando ejemplos de uso de FFMPEG, especialmente analizando la estructura de cualquier tipo de archivo. no importa si es MPEG4 o Quicktime Movie ya que son bastante similares en estructura.Analizando cuadro por cuadro desde .mov usando ffmpeg
si no hay ejemplos existentes (no puedo encontrar ninguno) tal vez alguien lo haya usado y pueda darme un par de líneas de código, o explicar cómo empezar?
Lo que estoy tratando de hacer: yo uso AVCaptureSession para capturar muestras de la cámara de vídeo, estas muestras se codifican en H264 y por escrito para presentar con la ayuda de AVAssetsWriter, AVAssetsWriterInput y AVAssetsWriterInputPixelBufferAdaptor. El motivo es que no puedo acceder directamente a la codificación de hardware H264, ya que Apple no lo permite. Lo que ahora necesito hacer (yo creo que no seguro) es omita:
Los "mdat" -atom (datos de película, puede haber más de un pienso) desde el archivo .mov. luego el "vide" -entorno y luego dentro del átomo de vide (muestra de datos de video, podría haber más de uno). Creo que habrá varios átomos que creo que son los marcos. estos serán del tipo "avc1" (ese es el tipo de H264). Corrígeme en esto porque estoy bastante seguro de que todavía no he recibido todo esto correctamente.
mi pregunta es, ¿cómo voy a proceder a analizar los cuadros individuales. He estado leyendo the documentation y miré iFrameExtractor (que no es muy útil ya que decodifica los marcos). Creo que lo he entendido correctamente cuando se supone que debo usar mov.c desde FFMPEG-AVFormat, pero no estoy seguro.
Editar: Ahora estoy tratando de esta manera:
funciono con la función init ligeramente reducida i iFrameExtractor que encuentra el videostream en el Mov-archivo.
puedo obtener los datos para la trama de la siguiente manera:
AVPacket packet; av_read_frame(pFormatCtx, &packet); NSData *frame; if(packet.stream_index == videoStream){ frame = [NSData dataWithBytes:packet.data length:packet.size]; } videoStream++; av_free_packet(&packet); return frame;
i luego pasarlo a una subclase de NSOperation donde es retenido a la espera de carga. pero recibo un EXC_BAD_ACC, ¿estoy haciendo algo mal al copiar los datos del marco? algunas ideas. obtengo el EXC _... cuando intento establecer la variable de clase NSData* frame
usando su propiedad (no atómica, retener). (dice EXC_BAD_ACC en la fila sintetizar)
mov.c no lo ayudará con el objetivo final. Si necesita ayuda con el análisis de MOV/MP4, puede ser útil. Otra biblioteca útil para cuando las cosas se ponen difíciles [mp4v2] (http://code.google.com/p/mp4v2/). Básicamente, tendrás que escribir esto tú mismo. Ninguna biblioteca hará el trabajo por una variedad de razones. –
@Steve McFarlin, gracias, tienes algunos consejos sobre la lectura, excepto la qt-documentation para comprender toda la estructura del archivo mov porque realmente estoy teniendo problemas para abarcarlo todo, ¿es correcto que el átomo ni siquiera debe estar en un orden específico? ¿Cuál pensaste que era más fácil trabajar con mov o mp4? –
@ Steve McFarlin, supongo que has visto el proyecto iFrameExtractor. también es esencialmente el mismo código que en el tutorial de Martin Böhme (por ejemplo en dranger.com). en la función de siguiente cuadro solo usan av_read_frame y luego decodifican esto. ¿el AVPacket modificado por av_read_frame no será el marco codificado H264? –