AVFoundationフレームワークを使用してビデオをキャプチャしています。Apple Documentation http://developer.Apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/ Articles/03_MediaCapture.html%23 // Apple_ref/doc/uid/TP40010188-CH5-SW2
今私は次のことをしました
1.作成済みvideoCaptureDevice
2。作成AVCaptureDeviceInput
およびセットvideoCaptureDevice
3。AVCaptureVideoDataOutput
を作成し、デリゲートを実装しました
4.Created AVCaptureSession
-入力をAVCaptureDeviceInputとして設定し、出力をAVCaptureVideoDataOutputとして設定します
5.AVCaptureVideoDataOutput Delegateメソッド
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
cMSamplebufferを取得してUIImageに変換し、テストしてUIImageviewを印刷する
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
これまですべてがうまくいった........
私の問題は、UDP Socketを介してビデオフレームを送信する必要があることです。次の方法は悪い考えですが、UIImageをNSDataに送信し、UDP Pocket経由で送信しました。 BUtがビデオ処理に非常に遅延を生じました。主にUIImageからNSDateのために問題が発生しました
だから私に問題を解決してください
1)CMSampleBUfferまたはCVImageBufferをNSDataに変換する方法
2)Audio Queue ServiceやVideo for Queueのように、UIImageを格納し、NSImageにUIImageを送信して送信する???
間違ったアルゴリズムの後ろに乗っている場合は、書き込み方向に経路を教えてください
前もって感謝します
バッファで取得するコードは次のとおりです。このコードは、フラットな画像(BGRAなど)を想定しています。
NSData* imageToBuffer( CMSampleBufferRef source) {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(source);
CVPixelBufferLockBaseAddress(imageBuffer,0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer);
NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height];
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
return [data autorelease];
}
より効率的な方法は、NSMutableDataまたはバッファプールを使用することです。
毎秒480x360の画像を送信するには、3つのカラーチャネルを想定した4.1Mbps接続が必要です。
CMSampleBufferGetImageBuffer
を使用してサンプルバッファーからCVImageBufferRef
を取得し、CVPixelBufferGetBaseAddress
を使用してビットマップデータを取得します。これにより、不必要にイメージをコピーすることが回避されます。