0

RGB24 形式で初期化された AVFrame のサンプル データを埋めようとしています。次のコード スニペットを使用して、RGB データを入力します。しかし、エンコードされたビデオでは、ビデオ フレームの 1/3 しかカバーしていないグレースケール ストリップしか見えません。このコード スニペットは、赤色のみを塗りつぶすことを想定しています。ここで間違っているヒントはありますか?

AVFrame *targetFrame=.....
int height=imageHeight();
int width=imageWidth();


  for(y=0;y<encoder.getVideoParams().height ;y++){   
       for(x=0;x< encoder.getVideoParams().width;x++){


   targetFrame->data[0][(y* width)+x]=(x%255); //R  
   targetFrame->data[0][(y* width)+x+1]=0;     //G
   targetFrame->data[0][(y* width)+x+2]=0;     //B


  }
   }
4

1 に答える 1

2

RGB24 を使用している場合は、データ バッファーにインデックスを付ける前に座標をスケーリングする必要があります。これを適切に実行する内部ループのバージョンを次に示します。

int offset = 3 * (x + y * width);
targetFrame->data[0][offset + 0] = x % 255; // R
targetFrame->data[0][offset + 1] = 0; // G
targetFrame->data[0][offset + 2] = 0; // B

そして、より簡単なアプローチを次に示します。

uint8_t *p = targetFrame->data[0];
for(y = 0; y < encoder.getVideoParams().height; y++) {  
    for(x = 0; x < encoder.getVideoParams().width; x++) {
        *p++ = x % 255; // R
        *p++ = 0; // G
        *p++ = 0; // B
    }
}
于 2012-05-31T02:45:42.337 に答える