2012-06-18 11 views
6

Estoy intentando leer y escribir archivos MOV H.264 escrito por AVAssetWriter simultáneamente. Logré extraer unidades NAL individuales, empacarlas en los AVPackets de ffmpeg y escribirlas en otro formato de video usando ffmpeg. Funciona y el archivo resultante funciona bien, excepto que la velocidad de reproducción no es correcta. ¿Cómo calculo los valores correctos de PTS/DTS a partir de datos H.264 sin procesar? ¿O tal vez exista alguna otra forma de obtenerlos?Obtener PTS de mdat H264 prima generada por el IOS AVAssetWriter

Aquí es lo que he intentado:

  1. límite de captura min velocidad de fotogramas/max a 30 y asumen que el archivo de salida será de 30 fps. De hecho, su fps es siempre menor que los valores que establezco. Y también, creo que el fps no es constante de un paquete a otro.

  2. Recuerde la marca de tiempo de presentación de cada muestra escrita y asuma que las muestras se correlacionan uno a uno con NALU y aplican la marca de tiempo guardada para generar el paquete. Esto no funciona

  3. Configuración STP a 0 o AV_NOPTS_VALUE. No funciona

De googlear de ello entiendo que los datos H.264 prima por lo general no contienen ninguna información de temporización. A veces puede tener alguna información de sincronización dentro de SEI, pero los archivos que uso no la tienen. Por otro lado, hay algunas aplicaciones que hacen exactamente lo que intento hacer, así que supongo que es posible de alguna manera.

+2

También estoy tratando de leer de forma simultánea H.264 desde un archivo mov escrito por AVAssetWriter, y no podía llegar a hacerlo utilizando tubos/lectura de archivos normal. ¿Cómo se las arregló para leerlo mientras se está escribiendo? ¡Gracias! –

+3

Utilice la lectura regular de archivos, pero en lugar de detenerse en EOF relea nuevamente. Tarde o temprano su operación de lectura tendrá éxito. – kolyuchiy

+2

@kolyuchiy: las fuentes de envío hacen un mejor uso del sistema. Configure una fuente de lectura en el descriptor FILE. Se llamará a un bloque cuando haya datos para leer. Si ocurre EOF, simplemente borre el error en su ARCHIVO. –

Respuesta

5

Se le puede generar por sí mismo, o tener acceso contiene información de temporización del átomo en el contenedor MP4/MOV para generar PTS/DTS información. El movimiento de FFmpeg en libavformat podría ayudar.

Cada muestra/marco se escribe con AVAssetWriter asignará uno a uno con los NAL VCL. Si todo lo que estás haciendo es convertir, haz que FFmpeg haga todo el trabajo pesado. Mantendrá adecuadamente la información de sincronización al pasar de un formato de contenedor a otro.

El tren de bits generado por AVAssetWriter no contiene datos SEI. Solo contiene cuadros SPS/PPS/I/P. El SPS tampoco contiene parámetros VUI o HRD.

- Editar -

Además, tenga en cuenta que si va a guardar la información STP a partir de entonces la base de tiempo del CMSampleBufferRef puede ser diferente de la del contenedor de destino. Por ejemplo, la base de tiempo de AVFoundation es nanosegundos, y un archivo FLV es milisegundos.

+1

Gracias! En realidad, CMSampleBuffers realmente contiene un PTS correcto que se asigna a los paquetes de salida. Era demasiado perezoso para ir todo el camino en esa dirección. Esto resolvió mi problema. – kolyuchiy

Cuestiones relacionadas