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 verzerrt483 × 800
ist verzerrt, aber in Farbe484 × 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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ein bitmap-Bild die Breite des Bildes MUSS ein Vielfaches von 4.
So ändern Sie die Breite wie 480, 484, 488, 492 ...
Hier ist die Methode zu ändern, um mehrere der 4
Ich hoffe, dass Sie das problem lösen.