sws_scale YUV --> RVB image déformée
Je veux convertir YUV420P
image (reçu de H.264
cours d'eau) à RGB
, tout en la redimensionnant, en utilisant sws_scale
.
La taille de l'image d'origine est 480 × 800
. Juste la conversion avec les mêmes dimensions fonctionne très bien.
Mais quand j'ai essayer de changer les dimensions, j'obtiens une image déformée, avec le motif suivant:
- changer de
481 × 800
donnera une vision déformée de B&W l'image de ce qui ressemble à couper au milieu 482 × 800
sera encore plus déformé483 × 800
est déformé, mais en couleur484 × 800
est ok (à l'échelle correctement).
Maintenant ce modèle suit la mise à l'échelle ne fonctionnent bien si la différence entre divise par 4.
Voici un exemple de code de la manière que je le décodage et la conversion de l'image. Toutes les méthodes show "succès".
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);
n'hésitez pas à poster un bug dans le ffmpeg.org/trac/ffmpeg/newticket
Dans sws_getContext() fonction vous êtes de passage en paramètre l'identificateur de format PIX_FMT_BGR24 au lieu de PIX_FMT_RGB24 comme vous le faites dans avpicture_fill
avez-vous jamais obtenir que cela fonctionne?
Dans sws_getContext() fonction vous êtes de passage en paramètre l'identificateur de format PIX_FMT_BGR24 au lieu de PIX_FMT_RGB24 comme vous le faites dans avpicture_fill
avez-vous jamais obtenir que cela fonctionne?
OriginalL'auteur Sami susu | 2011-12-13
Vous devez vous connecter pour publier un commentaire.
Lorsque vous effectuez une image bitmap, la largeur de l'image DOIT être un multiple de 4.
Donc, vous avez à changer la largeur comme 480, 484, 488, 492 ...
Ici, c'est la méthode pour changer de multiple de 4
J'espère que vous résoudre le problème.
OriginalL'auteur Yoon Chang Kook