web-dev-qa-db-ja.com

CMSampleBufferRefからバイトを取得してネットワーク経由で送信する方法

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を送信して送信する???

間違ったアルゴリズムの後ろに乗っている場合は、書き込み方向に経路を教えてください

前もって感謝します

27
Asta ni enohpi

バッファで取得するコードは次のとおりです。このコードは、フラットな画像(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接続が必要です。

35
Steve McFarlin

CMSampleBufferGetImageBufferを使用してサンプルバッファーからCVImageBufferRefを取得し、CVPixelBufferGetBaseAddressを使用してビットマップデータを取得します。これにより、不必要にイメージをコピーすることが回避されます。

2