私は FFMPEG を持っていて、AVFrame
それをwithYUVJ420P
に変換したいと思っています。これを行う理由は、AVFoundation を使用してフレームを表示/エンコードするためです。CVPixelBufferRef
CVPixelBufferCreateWithBytes
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
AVFrame は 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)
フレームは、AVFrame
FFMPEG Decoding からの rawData を使用したものです。