3

こんにちはCMSampleBufferRef、ネットワーク経由で を送信する必要があります。その後、クライアントCMSampleBufferRefは Audio Queue Services 経由で を再生します。スタック オーバーフローの例をいくつか見てきましたが、ほとんどはバッファを送信するだけです。しかし、その後、いくつかの情報が失われます。私はそれが構造体[AVAssetReaderOutput copyNextSampleBuffer]への参照を返すことを発見しましたopaqueCMSampleBuffer。のメモリアドレスを取得する方法は知っていますopaqueCMSampleBufferが、アドレスの内容を配列にコピーして、ネットワーク経由で送信するにはどうすればよいですか? CMSampleBufferまたは、ネットワーク経由で送信するためのよりエレガントなアプローチはありますか。または、どうにかしてにアクセスできますopaqueCMSampleBufferか?

あなたの時間と助けてくれてありがとう

4

1 に答える 1

0

CMSampleBufferRef から NSData オブジェクトを作成する方法は次のとおりです。

  1. インターフェイス (.h) ファイルで、サンプル バッファー参照をプロパティとして追加し、同時にオブジェクトにキャストします。

    @property (nonatomic, strong) __attribute__((NSObject)) CMSampleBufferRef sampleBuffer;

  2. 実装ファイル (.m):

    CMSampleBufferRef sampleBuffer = (CMSampleBufferRef)[(AVAssetReaderTrackOutput *)[assetReader 出力][0] copyNextSampleBuffer];

    NSPurgeableData *sampleBufferData = (NSPurgeableData *)[self imageToBuffer:sampleBuffer];

NSData オブジェクトからサンプル バッファにアクセスするには、単純にキャストを使用します。

(CMSampleBufferRef)sampleBufferData;

別の方法は次のとおりです。

- (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;
}
于 2016-08-20T07:44:41.237 に答える