sws_scale YUV --> RGB-verzerrtes Bild

Ich konvertieren wollen YUV420P Bild (aufgenommen von H.264 stream) zu RGB, während auch ändern der Größe, mit sws_scale.

Die Größe des ursprünglichen Bildes ist 480 × 800. Nur die Konvertierung mit gleichen Abmessungen, funktioniert einwandfrei.

Aber wenn ich versuche, ändern Sie die Dimensionen, bekomme ich ein verzerrtes Bild, mit dem folgenden Muster:

  • Wechsel zu 481 × 800 ergeben ein verzerrtes B&W-Bild, welches aussieht, wie es geschnitten wird in der Mitte
  • 482 × 800 wird noch mehr verzerrt
  • 483 × 800 ist verzerrt, aber in Farbe
  • 484 × 800 ist ok (korrekt skaliert).

Nun dieses Muster folgt - Skalierung wird nur funktionieren, wenn der Unterschied zwischen teilt sich durch 4.

Hier ist ein Beispiel code, der die Art und Weise, die ich zu decodieren und konvertieren Sie das Bild. Alle Methoden zeigen "Erfolg".

int srcX = 480;
int srcY = 800;
int dstX = 481; //or 482, 483 etc
int dstY = 800;

AVFrame* avFrameYUV = avcodec_alloc_frame();
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY);

AVFrame *avFrameRGB = avcodec_alloc_frame();

AVPacket avPacket;
av_init_packet(&avPacket);
avPacket.size = read; //size of raw data
avPacket.data = raw_data; //raw data before decoding to YUV

int frame_decoded = 0;
int decoded_length = avcodec_decode_video2(g_avCodecContext, avFrameYUV, &frame_decoded, &avPacket);
int size = dstX * dstY * 3;

struct SwsContext *img_convert_ctx = sws_getContext(srcX, srcY, SOURCE_FORMAT, dstX, dstY, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);

avpicture_fill((AVPicture *)avFrameRGB, rgb_frame, PIX_FMT_RGB24, dstX, dstY);
sws_scale(img_convert_ctx, avFrameYUV->data, avFrameYUV->linesize, 0, srcY, avFrameRGB->data, avFrameRGB->linesize);

//draws the resulting frame with windows BitBlt
DrawBitmap(hdc, dstX, dstY, rgb_frame, size);

sws_freeContext(img_convert_ctx); 
  • fühlen Sie sich frei, um post-ein Fehler in ffmpeg.org/trac/ffmpeg/newticket
  • In sws_getContext () - Funktion übergeben Sie als parameter den format-Bezeichner PIX_FMT_BGR24 statt PIX_FMT_RGB24, wie Sie in avpicture_fill
  • haben Sie jemals bekommen, das dies funktioniert?
InformationsquelleAutor Sami susu | 2011-12-13
Schreibe einen Kommentar