QTKit,捕捉视频直播



我正在尝试为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:]

指定何时开始录制到新片段的确切电影帧。然而,您将需要更具体的知识来使用该方法。

相关内容

  • 没有找到相关文章