私は FFMPEG を持っていて、AVFrameそれをwithYUVJ420Pに変換したいと思っています。これを行う理由は、AVFoundation を使用してフレームを表示/エンコードするためです。CVPixelBufferRefCVPixelBufferCreateWithBytes
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRangeAVFrame は 3 つのプレーンにデータがあるので、それ
を選択して変換してみましY480 Cb240 Cr240た。そして、私が調査したところによると、これは選択しkCVPixelFormatTypeた . Y480バイプラナーであるため、CbCr480インターリーブを含むバッファーに変換する必要があります。
2つのプレーンでバッファを作成しようとしました:
frame->data[0]最初の飛行機で、frame->data[1]frame->data[2]2 番目のプレーンでインターリーブされます。
ただし、次のエラーが返さ-6661 (invalid a)れCVPixelBufferCreateWithBytesます。
"Invalid function parameter. For example, out of range or the wrong type."
私は画像処理に関する専門知識をまったく持っていないので、この問題への適切なアプローチを開始できるドキュメントへのポインタをいただければ幸いです。私の C スキルも一流ではないので、ここで基本的な間違いを犯している可能性があります。
uint8_t **buffer = malloc(2*sizeof(int *));
buffer[0] = frame->data[0];
buffer[1] = malloc(frame->linesize[0]*sizeof(int));
for(int i = 0; i<frame->linesize[0]; i++){
if(i%2){
buffer[1][i]=frame->data[1][i/2];
}else{
buffer[1][i]=frame->data[2][i/2];
}
}
int ret = CVPixelBufferCreateWithBytes(NULL, frame->width, frame->height, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, buffer, frame->linesize[0], NULL, 0, NULL, cvPixelBufferSample)
フレームは、AVFrameFFMPEG Decoding からの rawData を使用したものです。