YUVJ420P
にFFMPEG AVFrame
があり、CVPixelBufferRef
にCVPixelBufferCreateWithBytes
と変換したいと思います。私がこれをしたい理由は、AVFoundationを使ってフレームを表示/エンコードすることです。YUVJ420PのFFMPEG AVFrameをAVFoundation cVPixelBufferRefに変換するにはどうすればいいですか?
Iは、kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
を選択しAVFrameは、3つの平面 Cb240
Y480
Cr240
のデータを有しているので、それを変換しようとしました。私が調査したところによると、これは選択したkCVPixelFormatType
と一致します。双平面にすることで、私はそれをY480
とCbCr480
のインターリーブを含むバッファに変換する必要があります。
Iは、2面のバッファを作成しようとした:第1の平面上
frame->data[0]
をframe->data[1]
及び第二面上にインターリーブframe->data[2]
を。
しかし、私はCVPixelBufferCreateWithBytes
からリターンエラー-6661 (invalid a)
を取得しています:
"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)
フレームはFFMPEG復号から生データとAVFrame
です。
'cvPixelBufferSample'はCVPixelBufferRefですか?その場合、新しいピクセルバッファへのポインタが参照によって返されるようにする代わりに、 'CVPixelBufferCreateWithBytes()'の最後のパラメータは '&cvPixelBufferSample'である必要があります。 –