我正在尝试为Mac创建一个可以创建实时视频流的应用程序。我知道VLC和其他解决方案,但仍然。
为此,我尝试使用QTKit从iSight录制视频,并将其作为一系列微小的视频文件连续保存。但是,录制结果不是很连续,文件之间存在间隙。
基本上,我只是设置一个计时器,它以特定的时间间隔开始录制到新文件,从而停止旧的录制。我也尝试设置最大记录长度,并使用委托方法... didFinishRecording ...和... 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];
}
答案 0 :(得分:2)
有一种原生机制可将拍摄的电影制成碎片。使用
[QTCaptureFileOutput setMaximumRecordedDuration:]
指定作品的持续时间或
[QTCaptureFileOutput setMaximumRecordedFileSize:]
指定文件大小限制。
达到限制时,将调用委托方法:
[QTCaptureFileOutput_Delegate captureOutput: shouldChangeOutputFileAtURL: forConnections: dueToError:]
在此方法中,您可以设置新文件名:
[QTCaptureFileOutput recordToOutputFileURL:]
这样您就可以非常精确地剪切录制的电影片段。
注意,在重新编码到文件中之后,[QTCaptureFileOutput_Delegate captureOutput:didFinishRecordingToOutputFileAtURL:forConnections:dueToError:]稍后会被调用。如果您使用此方法设置新文件,则最终视频中会有间隙。这并不意味着您不需要使用此方法。当电影准备好使用时,此方法将指示。
如果您需要更精确的切割,可以使用
[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]
指定确切的电影帧何时开始录制成新片段。但是,您需要更多具体知识才能使用该方法。