1

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

4

1 回答 1

2

有一种本地机制可以将捕获的电影分解成碎片。采用

[QTCaptureFileOutput setMaximumRecordedDuration:]

指定乐曲的持续时间或

[QTCaptureFileOutput setMaximumRecordedFileSize:]

指定文件大小限制。

当达到限制时,将调用委托方法:

[QTCaptureFileOutput_Delegate captureOutput: shouldChangeOutputFileAtURL: forConnections: dueToError:]

在此方法中,您可以设置新文件名:

[QTCaptureFileOutput recordToOutputFileURL:]

这将允许您非常精确地剪切录制的电影片段。

请注意, [QTCaptureFileOutput_Delegate captureOutput: didFinishRecordingToOutputFileAtURL: forConnections: dueToError:] 将在实际完成重新编码到文件后稍后调用。如果您使用此方法设置新文件,您将在最终视频中出现间隙。但这并不意味着您不需要使用此方法。此方法将指示电影片段何时可​​以使用。

如果您需要更精确的切割,您可以使用

[QTCaptureFileOutput captureOutput: didOutputSampleBuffer: fromConnection:]

指定何时开始录制新片段的确切电影帧。但是,您需要更具体的知识才能使用该方法。

于 2011-10-17T10:59:03.390 回答