style name bar apple app iphone ios avfoundation avcam

iphone - name - Llamadas consecutivas a startRecordingToOutputFileURL:



apple-mobile-web-app-status-bar-style (3)

Los documentos de Apple parecen indicar que mientras se graba un video en un archivo, la aplicación puede cambiar la URL sobre la marcha sin problemas. Pero estoy viendo un problema. Cuando intento esto, se llama al delegado de grabación con un error ...

La operación no pudo ser completada. (OSStatus error -12780.) El diccionario de información es: {AVErrorRecordingSuccessfullyFinishedKey = 0; }

(la comilla simple "no podría" proviene del registro [error localizedDescription])

Aquí está el código, que básicamente es ajustes a la muestra de WWDC10 AVCam:

1) Iniciar la grabación. Iniciar el temporizador para cambiar la URL de salida cada pocos segundos

- (void) startRecording { // start the chunk timer self.chunkTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(chunkTimerFired:) userInfo:nil repeats:YES]; AVCaptureConnection *videoConnection = [AVCamCaptureManager connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self movieFileOutput] connections]]; if ([videoConnection isVideoOrientationSupported]) { [videoConnection setVideoOrientation:[self orientation]]; } if ([[UIDevice currentDevice] isMultitaskingSupported]) { [self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]]; } NSURL *fileUrl = [[ChunkManager sharedInstance] nextURL]; NSLog(@"now recording to %@", [fileUrl absoluteString]); [[self movieFileOutput] startRecordingToOutputFileURL:fileUrl recordingDelegate:self]; }

2) Cuando se dispara el temporizador, cambie el nombre del archivo de salida sin detener la grabación

- (void)chunkTimerFired:(NSTimer *)aTimer { if ([[UIDevice currentDevice] isMultitaskingSupported]) { [self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]]; } NSURL *nextUrl = [self nextURL]; NSLog(@"changing capture output to %@", [[nextUrl absoluteString] lastPathComponent]); [[self movieFileOutput] startRecordingToOutputFileURL:nextUrl recordingDelegate:self]; }

Nota: [self nextURL] genera archivos URL como file-0.mov, file-5.mov, file-10.mov y así sucesivamente.

3) Esto se llama cada vez que cambia el archivo, y cualquier otra invocación es un error ...

- (void) captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { id delegate = [self delegate]; if (error && [delegate respondsToSelector:@selector(someOtherError:)]) { NSLog(@"got an error, tell delegate"); [delegate someOtherError:error]; } if ([self backgroundRecordingID]) { if ([[UIDevice currentDevice] isMultitaskingSupported]) { [[UIApplication sharedApplication] endBackgroundTask:[self backgroundRecordingID]]; } [self setBackgroundRecordingID:0]; } if ([delegate respondsToSelector:@selector(recordingFinished)]) { [delegate recordingFinished]; } }

Cuando esto se ejecuta, el archivo-0 se escribe, luego vemos el error -12780 justo después de cambiar la url al archivo-5, el archivo-10 se escribe, luego un error, luego está bien, y así sucesivamente.

Parece que cambiar la URL sobre la marcha no funciona, pero detiene la escritura que permite que el próximo cambio de URL funcione.


De acuerdo con la documentación, no se admite la llamada a 2 startRecordingToOutputFileURL consecutivos.

puedes leer sobre esto here

En iOS, este cambio de archivo preciso de marco no es compatible. Debe llamar a stopRecording antes de volver a llamar a este método para evitar cualquier error.


En los documentos se afirma esto:

If a file at the given URL already exists when capturing starts, recording to the new file will fail.

¿Está seguro de que comprueba que nextUrl es un nombre de archivo no existente?


Gracias a todos, por la revisión y buenos pensamientos sobre esto. Aquí está la palabra de Apple DTS ...

Hablé con nuestros ingenieros de AV Foundation, y definitivamente es un error que este método no está haciendo lo que la documentación dice que debería hacer ("No es necesario llamar a stopRecording antes de llamar a este método mientras se está realizando otra grabación"). Por favor, presente un informe de error utilizando el Apple Bug Reporter ( http://developer.apple.com/bugreporter/ ) para que el equipo pueda investigar. Asegúrese de incluir su proyecto mínimo en el informe.

He archivado esto con Apple como error 11632087