1

opengl フレームバッファ データを AVCodec にできるだけ速く転送したい。

私はすでにシェーダーでRGBをYUVに変換し、glReadPixelsでそれを読んでいます

AVFrame データを手動で入力する必要があります。もっと良い方法はありますか?

AVFrame *frame;
// Y
frame->data[0][y*frame->linesize[0]+x] = data[i*3];
// U
frame->data[1][y*frame->linesize[1]+x] = data[i*3+1];
// V
frame->data[2][y*frame->linesize[2]+x] = data[i*3+2];
4

1 に答える 1

0

使用できますsws_scale

実際、RGB から YUV への変換にシェーダーは必要ありません。私を信じてください、それは非常に異なるパフォーマンスをするつもりはありません.

swsContext = sws_getContext(WIDTH, HEIGHT, AV_PIX_FMT_RGBA, WIDTH, HEIGHT, AV_PIX_FMT_YUV, SWS_BICUBIC, 0, 0, 0 );
sws_scale(swsContext, (const uint8_t * const *)sourcePictureRGB.data, sourcePictureRGB.linesize, 0, codecContext->height, destinyPictureYUV.data, destinyPictureYUV.linesize);

のデータはdestinyPictureYUV、コーデックに移動する準備が整います。

このサンプルでは、​​destinyPictureYUVAVFrameを塗りつぶします。次のように設定してみてください。

AVFrame * frame;
AVPicture destinyPictureYUV;

avpicture_alloc(&destinyPictureYUV, codecContext->pix_fmt, newCodecContext->width, newCodecContext->height);

// THIS is what you want probably
*reinterpret_cast<AVPicture *>(frame) = destinyPictureYUV;

このセットアップでは、必要に応じて、GPU で既に YUV に変換したデータで埋めることもできます... 必要な方法を選択できます。

于 2015-09-21T18:33:50.673 に答える