2011-10-12 128 views
1

我想創建一個應用程序的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]; }

回答

2

有一種天然的機制,制動設備拍攝成片。使用

[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