2011-12-13 14 views
9

मैं RGB को YUV420P छवि (H.264 धारा से प्राप्त) कन्वर्ट करने के लिए है, जबकि यह भी आकार बदलने, sws_scale का उपयोग कर चाहते हैं।
मूल छवि का आकार 480 × 800 है। बस समान आयामों के साथ कनवर्ट करना ठीक काम करता है।
लेकिन जब मैं आयाम बदलने की कोशिश, मैं निम्नलिखित पैटर्न के साथ एक विकृत छवि प्राप्त,:sws_scale YUV -> आरजीबी विकृत चित्र

  • 481 × 800 के लिए बदल रहा एक विकृत बी & डब्ल्यू छवि है जो लगता है कि यह मध्य
  • में कटौती है निकलेगा 482 × 800 भी अधिक
  • 483 × 800 विकृत है विकृत किया जाएगा, लेकिन रंग में
  • 484 × 800 ठीक है (सही ढंग से बढ़ाया) है।

अब इस पद्धति का अनुसरण - स्केलिंग केवल ठीक से काम करेंगे, तो द्वारा 4.

विभाजित के बीच का अंतर यहाँ जिस तरह से है कि मैं डिकोड और छवि परिवर्तित का एक नमूना कोड है। सभी विधियां "सफलता" दिखाती हैं।

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

sws_getContext में() में कार्य आप PIX_FMT_RGB24 के बजाय प्रारूप पहचानकर्ता PIX_FMT_BGR24 पैरामीटर के रूप में गुजर रहे हैं के रूप में आप avpicture_fill –

+0

में कभी किया https://ffmpeg.org/trac/ffmpeg/newticket –

+0

में एक बग पोस्ट करने के लिए आप के लिए स्वतंत्र महसूस कर इसे काम करने के लिए मिलता है? – sendmoreinfo

उत्तर

-1

आप एक बिटमैप छवि बनाने के दौरान, छवि की चौड़ाई का 4.

कई होना चाहिए, ताकि आप यहां 480 चौड़ाई की तरह, 484, 488, 492 ...

बदलना होगा 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); 
} 

में से कई को बदलने की विधि है, मुझे आशा है कि आप समस्या को हल करेंगे।

+0

नहीं, यह 4 का एक से अधिक नहीं होना चाहिए। कोड स्निपेट पूरी चीज से भी आगे है क्योंकि यह चौड़ाई को संरेखित करने का तरीका बताता है, यह प्रश्न के लिए अप्रासंगिक है। –

संबंधित मुद्दे