2013-03-19 136 views
2

我正在創建一個應用程序,我們可以在imageView中使用我們的手指進行繪製,同時我們也可以記錄屏幕。 到目前爲止,我已經完成了這些功能,但問題在於視頻錄製完成後,如果我們播放錄製的視頻,手指圖形在視頻中不平滑。iOS繪圖屏幕視頻拍攝不流暢

我沒有使用opengl,圖形在UIImageView上,每0.01秒我們從UIImageView捕獲圖像,並將像素緩衝區追加到AVAssetWriterInputPixelBufferAdaptor對象。

這裏是我用於轉換的UIImage到緩衝器

- (CVPixelBufferRef) pixelBufferFromCGImage:(CGImageRef) image { 

    CGSize frameSize = CGSizeMake(976, 667); 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, 
         [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, 
         nil]; 
CVPixelBufferRef pxbuffer = NULL; 
CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width, 
             frameSize.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, 
             &pxbuffer); 
CVPixelBufferLockBaseAddress(pxbuffer, 0); 
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); 

CGColorSpaceRef rgbColorSpace = CGImageGetColorSpace(image); 

CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width, 
              frameSize.height, 8, 4*frameSize.width, rgbColorSpace, 
              kCGImageAlphaPremultipliedFirst); 

CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
             CGImageGetHeight(image)), image); 

CGContextRelease(context); 

CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 
return pxbuffer; 

}

以下方法在0.01秒一個時間間隔調用代碼

CVPixelBufferRef pixelBufferX = (CVPixelBufferRef)[self pixelBufferFromCGImage:theIM]; 
bValue = [self.avAdaptor appendPixelBuffer:pixelBufferX withPresentationTime:presentTime]; 

任何一個可以引導用於視頻採集的改進?

在此先感謝

回答

1

您不應該通過每0.01秒調用一次來顯示內容。如果你想保持與視頻同步,請參閱AVSynchronizedLayer,這是明確的。或者,請參見CADisplayLink,該選項用於與屏幕刷新保持同步。 0.01秒沒有與特別的任何東西對齊,並且您可能會在與視頻和顯示不同步的地方跳動。在任何情況下,您都應該在玩家的回調中進行繪圖,而不是使用計時器。

您還在每個循環中泄漏像素緩衝區。由於您調用了CVPixelBufferCreate(),因此您最終需要在結果像素緩衝區中調用CFRelease()。如果運行一段時間,我希望你的程序最終會因內存不足而崩潰。

確保您已經學習了AV Foundation Programming Guide,以便您瞭解媒體播放中所有部分如何組合在一起。

+0

感謝您的回放,我用CADisplayLink而不是NSTimer嘗試過,但沒有運氣,仍然存在問題。我已經處理了CVPixelBufferCreate的發佈版,我沒有包括有問題的一段代碼。 – Raj 2013-03-20 13:44:09

+0

'CADisplayLink'只有在畫面以精確的屏幕刷新率進入時(即它們也作爲CADisplayLink的一部分進行處理),纔會對您有所幫助。 – 2013-03-20 15:21:49