The Apple docs似乎表示在将视频录制到文件时,应用可以动态更改网址,没有任何问题。但我看到了一个问题。当我尝试这个时,录制代理被调用错误...
操作无法完成。 (OSStatus错误-12780。)信息 字典是:{ AVErrorRecordingSuccessfullyFinishedKey = 0; }
(“不能”的时髦单引号来自记录[error localizedDescription])
这是代码,基本上是对WWDC10 AVCam样本的调整:
1)开始录制。启动计时器每隔几秒更改一次输出URL
- (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)当计时器触发时,更改输出文件名而不停止录制
- (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];
}
注意:[self nextURL]生成文件网址,如file-0.mov,file-5.mov,file-10.mov等。
3)每次文件更改时都会调用此函数,并且每次调用都是错误...
- (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];
}
}
当这个运行时,文件-0被写入,然后我们在将url更改为file-5,文件-10被写入,然后出现错误,然后好了,等等之后立即看到错误-12780。
似乎暂时更改网址不起作用,但它会停止写入,从而允许下一次网址更改生效。
答案 0 :(得分:8)
感谢大家,对此进行了审核并提出了很好的想法。这是Apple DTS的一句话......
我与我们的AV基金会工程师交谈,这绝对是一个错误 因为这种方法没有按照文档所说的那样做 (“在调用此方法之前,您无需调用stopRecording 另一个录音正在进行中。“)。请提交错误报告 使用Apple Bug Reporter(http://developer.apple.com/bugreporter/) 所以团队可以调查。确保并包括你的最小 项目在报告中。
我已经向Apple提交了这个错误11632087
答案 1 :(得分:1)
在文档中说明了这一点:
If a file at the given URL already exists when capturing starts, recording to the new file will fail.
您确定检查nextUrl
是不存在的文件名吗?
答案 2 :(得分:0)
根据文档,不支持调用连续2次startRecordingToOutputFileURL。
你可以阅读here
在iOS中,不支持此帧精确文件切换。在再次调用此方法之前,必须调用stopRecording以避免任何错误。