我正在尝试为Mac创建一个可以创建实时视频流的应用程序。我知道VLC和其他解决方案,但仍然。
为此,我尝试使用QTKit从iSight录制视频,并将其连续保存为一系列微小的视频文件。然而,录音结果不是连续的,文件之间有间隙。
基本上,我只是设置一个计时器,开始记录到一个新的文件在一定的时间间隔,从而停止旧的记录。我还尝试设置最大记录长度,并使用委托方法…和willFinishRecording…,但结果相同(我无法真正估计这些情况下间隙之间的差异)。
如果你知道这些事情应该怎么做,请帮帮我。
下面是我当前的代码:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
QTCaptureSession *session = [[QTCaptureSession alloc] init];
QTCaptureDevice *iSight = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
[iSight open:nil];
QTCaptureDeviceInput *myInput = [QTCaptureDeviceInput deviceInputWithDevice:iSight];
output = [[QTCaptureMovieFileOutput alloc] init] ; //ivar, QTCaptureFileOutput
[output setDelegate:self];
a = 0; //ivar, int
fileName = @"/Users/dtv/filerecording_"; //ivar, NSString
[session addOutput:output error:nil];
[session addInput:myInput error:nil];
[capview setCaptureSession:session]; //IBOutlet
[session startRunning];
[output setCompressionOptions:[QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptionsSD480SizeH264Video"] forConnection:[[output connections] objectAtIndex:0]];
[output recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%i.mov", fileName, a]] bufferDestination:QTCaptureFileOutputBufferDestinationOldFile];
NSTimer *tmr = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(getMovieLength:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:tmr forMode:NSDefaultRunLoopMode];
}
‐ (void) getMovieLength:(NSTimer *) t { a++; [output recordToOutputFileURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%i.mov", fileName, a]] bufferDestination:QTCaptureFileOutputBufferDestinationOldFile]; }
有一种原生机制可以将捕获的电影分解成片段。使用
[QTCaptureFileOutput setMaximumRecordedDuration:]
指定片段的持续时间或
[QTCaptureFileOutput setMaximumRecordedFileSize:]
指定文件大小限制。
当达到限制时,将调用委托方法:
[QTCaptureFileOutput_Delegate captureOutput: shouldChangeOutputFileAtURL: forConnections: dueToError:]
在这个方法中,你可以设置新的文件名:
[QTCaptureFileOutput recordToOutputFileURL:]
这将允许您非常精确地剪切录制的电影片段。
注意,[QTCaptureFileOutput_Delegate captureOutput: didFinishRecordingToOutputFileAtURL: forConnections: dueToError:]将在重新编码到文件中实际完成后被稍后调用。如果你用这种方法来设置新文件,你会在最后的视频中有间隙。但这并不意味着你不需要使用这种方法。此方法将在影片片段准备使用时提示。
如果你需要更精确的切割,你可以使用
[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]
指定何时开始录制到新片段的确切电影帧。然而,您将需要更具体的知识来使用该方法。