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:] 

指定准确的电影帧时开始记录到一个新的作品。但是,您需要更多具体的知识才能使用该方法。

+0

谢谢。不幸的是,无法检查它。将尽快接受我可以检查它。 – Ibolit

+0

谢谢。它的工作比以前更平滑。但仍然不完全平稳。你提到的那些“更具体的知识”是什么?你能告诉我在哪里可以找到它吗? 此致敬礼, Timofey。 – Ibolit

+0

你是什么意思,不完全平滑?它应该工作得很好。当我说你需要更多具体的知识时,我只是不知道你需要深入了解快速的东西有多深。大多数时候,我描述的方法足以将拍摄的电影分解成片断。但是,如果您需要更精确地切割到单个帧,则可以使用'[QTCaptureFileOutput captureOutput:didOutputSampleBuffer:fromConnection:]'方法。在这种情况下,您需要从缓冲区获取数据并对其进行分析。没有什么特别的,你可以从文档中获得几乎所有东西。 – Davyd