QTKit,捕捉视频直播
我想创建一个应用程序的Mac将创建实时视频流。我知道VLC和其他解决方案,但仍然。QTKit,捕捉视频直播
为此,我试图使用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]; }
有一种天然的机制,制动设备拍摄成片。使用
[QTCaptureFileOutput setMaximumRecordedDuration:]
指定一块的持续时间或
[QTCaptureFileOutput setMaximumRecordedFileSize:]
指定文件的大小限制。
当达到限制的委托方法将被调用:
[QTCaptureFileOutput_Delegate captureOutput: shouldChangeOutputFileAtURL: forConnections: dueToError:]
在这种方法中,你可以设置新的文件名:
[QTCaptureFileOutput recordToOutputFileURL:]
这将使你切件录制的电影相当精确。
请注意,在对文件进行重新编码实际完成后,将稍后调用[QTCaptureFileOutput_Delegate captureOutput:didFinishRecordingToOutputFileAtURL:forConnections:dueToError:]。如果您使用此方法设置新文件,则在最终视频中会有空白。这并不意味着你不需要使用这种方法。该方法将在电影片段准备好使用时显示。
如果您需要更精确的切削可以使用
[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]
指定准确的电影帧时开始记录到一个新的作品。但是,您需要更多具体的知识才能使用该方法。
谢谢。不幸的是,无法检查它。将尽快接受我可以检查它。 – Ibolit
谢谢。它的工作比以前更平滑。但仍然不完全平稳。你提到的那些“更具体的知识”是什么?你能告诉我在哪里可以找到它吗? 此致敬礼, Timofey。 – Ibolit
你是什么意思,不完全平滑?它应该工作得很好。当我说你需要更多具体的知识时,我只是不知道你需要深入了解快速的东西有多深。大多数时候,我描述的方法足以将拍摄的电影分解成片断。但是,如果您需要更精确地切割到单个帧,则可以使用'[QTCaptureFileOutput captureOutput:didOutputSampleBuffer:fromConnection:]'方法。在这种情况下,您需要从缓冲区获取数据并对其进行分析。没有什么特别的,你可以从文档中获得几乎所有东西。 – Davyd