2011-12-13 15 views
9

Desidero convertire l'immagine YUV420P (ricevuta dallo streaming H.264) a RGB, ridimensionandola, utilizzando sws_scale.
La dimensione dell'immagine originale è 480 × 800. La semplice conversione con le stesse dimensioni funziona bene.
Ma quando provo a cambiare le dimensioni, ottengo un'immagine distorta, con il seguente schema:sws_scale YUV -> RGB immagine distorta

  • cambiando 481 × 800 produrrà un'immagine W B & distorta che sembra è tagliato a metà
  • 482 × 800 sarà ancora più distorta
  • 483 × 800 è distorto ma a colori
  • 484 × 800 è ok (in scala correttamente).

Ora questo modello segue - il ridimensionamento sarà solo funzionare bene se la differenza tra divide per 4.

Ecco un codice di esempio del modo in cui ho decodificare e convertire l'immagine. Tutti i metodi mostrano "successo".

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); 
+0

In sws_getContext() funzione che si sta passando come parametro il formato identificatore PIX_FMT_BGR24 invece di PIX_FMT_RGB24 come si fa in avpicture_fill –

+0

sentitevi liberi di inviare un bug a https://ffmpeg.org/trac/ffmpeg/newticket –

+0

Hai mai farlo funzionare? – sendmoreinfo

risposta

-1

Quando si effettua un'immagine bitmap, la larghezza dell'immagine deve essere multiplo di 4.

Quindi bisogna modificare la larghezza, come 480, 484, 488, 492 ...

Qui è il metodo per passare a più di 4

#define WIDTHBYTES(bits) (((bits) + 31)/32 * 4) 

void main() 
{ 
    BITMAPFILEHEADER bmFileHeader; 
    BITMAPINFOHEADER bmInfoHeader; 

    // load image 
    // ... 

    // when you use the method, put parameter like this. 
    int tempWidth = WIDTHBYTES(width * bmInfoHeader.biBitCount); 
} 

Spero che tu risolvi il problema.

+0

No, non deve essere un multiplo di 4. Lo snippet di codice è ancora più lontano dal tutto mentre mostra come allineare la larghezza, è irrilevante alla domanda. –

Problemi correlati