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 に答える