Llamadas consecutivas para startRecordingToOutputFileURL:

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

La operación no se pudo completar. (Error de estado de OS -12780.) El dictionary de información es: {AVErrorRecordingSuccessfullyFinishedKey = 0; }

(funky single quote en "could not" proviene de logging [error localizedDescription])

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

1) Comienza la grabación. Inicie el timer para cambiar la URL de salida cada pocos segundos.

- (void) startRecording { // start the chunk timer self.chunkTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(chunkTimerFinetworking:) 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 shanetworkingApplication] beginBackgroundTaskWithExpirationHandler:^{}]]; } NSURL *fileUrl = [[ChunkManager shanetworkingInstance] nextURL]; NSLog(@"now recording to %@", [fileUrl absoluteString]); [[self movieFileOutput] startRecordingToOutputFileURL:fileUrl recordingDelegate:self]; } 

2) Cuando el timer dispare, cambie el nombre del file de salida sin detener la grabación

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

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

3) Esto se llama cada vez que el file cambia, y cada 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 shanetworkingApplication] endBackgroundTask:[self backgroundRecordingID]]; } [self setBackgroundRecordingID:0]; } if ([delegate respondsToSelector:@selector(recordingFinished)]) { [delegate recordingFinished]; } } 

Cuando esto funciona, se escribe el file-0, entonces vemos el error -12780 justo después de cambiar la url al file-5, el file-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 funcione el siguiente cambio de URL.

Cualquier ayuda sería muy apreciada.

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 porque este método no está haciendo lo que la documentation dice que debería ("No es necesario que llame a stopRecording antes de llamar a este método mientras otra grabación está en progreso"). Por favor, presente un informe de errores usando Apple Bug Reporter ( http://developer.apple.com/bugreporter/ ) para que el equipo pueda investigar. Asegúrese e incluya su proyecto mínimo en el informe.

He archivado esto con Apple como error 11632087

En los documentos se dice esto:

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

¿Estás seguro de que verifica que nextUrl es un nombre de file no existente?

De acuerdo con la documentation, no se admite llamar a 2 startRecordingToOutputFileURL consecutivos.

puedes leer sobre esto aquí

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