4

libswscale を使用して YUV フレームを RGB に変換しようとしています。

これが私のコードです:

AVFrame *RGBFrame;
SwsContext *ConversionContext;

ConversionContext = sws_getCachedContext(NULL, FrameWidth, FrameHeight, AV_PIX_FMT_YUV420P, FrameWidth, FrameHeight, AV_PIX_FMT_RGB24, SWS_BILINEAR, 0, 0, 0);
RGBFrame = av_frame_alloc();

avpicture_fill((AVPicture *)RGBFrame, &FillVect[0], AV_PIX_FMT_RGB24, FrameWidth, FrameHeight);

sws_scale(ConversionContext, VideoFrame->data, VideoFrame->linesize, 0, VideoFrame->height, RGBFrame->data, RGBFrame->linesize);

私のプログラムは、sws_scale 関数で SEGFAULT を実行します。

VideoFrame は、デコードされたフレームを保持する AVFrame 構造体です。

これは、YUV フレームが次のような配列を返す avcodec_decode_video2 から来ているためだと思います。

VideoFrame->data[0] // Y array, linesize = frame width
VideoFrame->data[1] // U array, linesize = frame width/2
VideoFrame->data[2] // V array, linesize = frame width/2

YUV420P には理論的には 1 つの平面しかありません (ウィキペディアによると、YUV420P は平面フォーマットであり、Y、U、V データがグループ化されています)。そのため、swscaleを使用して、Y、U、VデータがRGB24に分離されている配列を変換する方法がわかりません。

私を助けてください、ありがとう:)

4

1 に答える 1

1

av_frame_allocフレームオブジェクト自体にメモリを割り当てるだけで、画像データを格納するためのメモリは割り当てません。やったことがありますか:

FillVect.resize( avpicture_get_size( PIX_FMT_RGB24, FrameWidth, FrameHeight ) );

呼び出す前にコードのどこかにavpicture_fill? または、FillVect がデコードされた画像全体を保持するのに十分なメモリを割り当てることを確認する他の方法はありますか?

SEGFAULT を正確にトリガーするものを確認するために、valgrind の下で実行しようとしましたか?

于 2014-07-28T00:11:44.930 に答える