AVAssetWriter / AVAssetWriterInputPixelBufferAdaptor: cuadros negros y velocidad de cuadros

Estoy capturando la alimentación de la camera y escribiéndola en una película. El problema que estoy teniendo es que después de la export, la película tiene un par de segundos negros delante de ella (en relación con la hora de inicio de la grabación real).

Creo que esto está relacionado con [self.assetWriter startSessionAtSourceTime:kCMTimeZero]; Tenía una media solución de trabajo al tener una variable frameStart que solo contaba hacia arriba en el método samplebuffer delegate.

 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); frameStart++; if (self.startRecording == YES) { static int64_t frameNumber = 0; if(self.assetWriterInput.readyForMoreMediaData) { [self.pixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:CMTimeMake(frameNumber, 25)]; } frameNumber++; } } 

y luego llame a este método cuando el usuario presionó un button:

 [self.assetWriter startSessionAtSourceTime:CMTimeMake(frameStart,25)]; 

esto funciona. pero solo una vez … si quiero grabar una segunda película, los cuadros negros volverán a aparecer.

Además, cuando miro la película producida, la velocidad de fotogtwigs es de 25 fps como quiero. pero el video parece que se ha acelerado. como si no hubiera suficiente espacio entre los cuadros. Entonces, la película se reproduce aproximadamente dos veces más rápido.

 NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:640], AVVideoWidthKey, [NSNumber numberWithInt:480], AVVideoHeightKey, AVVideoCodecH264, AVVideoCodecKey, nil]; self.assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings]; self.assetWriterInput.expectsMediaDataInRealTime = YES; 

No necesita contar las marcas de time del cuadro por su count. Puede get la timestamp de la muestra actual con

 CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 

Sin embargo, me parece que estás pasando el búfer de píxeles del marco al adaptador sin modificaciones. ¿No sería más fácil pasar el búfer de muestra directamente al assetWriterInput como el siguiente?

 [self.assetWriterInput appendSampleBuffer:sampleBuffer]; 

En primer lugar, ¿por qué estás incrementando frameNumber dos veces por cada marco? Incrementar una vez, eliminar el primero. Esto debería arreglar la velocidad de reproducción.

Segundo, ¿estás restableciendo frameNumber a 0 cuando terminas de grabar? Si no, este es tu problema. Si no, necesito más explicaciones sobre lo que está sucediendo aquí …

Saludos