3-2.À̹ÌÁö Ãâ·Â

ºñµð¿À´Â Á¤Áö ¿µ»óÀ» ½Ã°£º°·Î ¸ð¾Æ ³õÀº °ÍÀÌ°í °¢ ¿µ»óÀº Æø, ³ôÀ̸¸Å­ÀÇ Çȼ¿·Î ±¸¼ºµÈ´Ù. °¢ Çȼ¿ÀÇ »ö»óÀ» Ç¥ÇöÇÏ´Â ¹æ¹ýÀÌ »ö»ó Æ÷¸ËÀÌ´Ù. ¿øÀÚÀûÀÎ ´ÜÀ§ÀÎ Çȼ¿ÀÇ ¼Ó¼ºÀ» °áÁ¤ÇÏ´Â °ªÀ̾ Àß ¾Ë¾Æ µÎ¾î¾ß ÇÑ´Ù. Á» º¹ÀâÇÏÁö¸¸ ³ª¸§ Àç¹Ì´Â ÀÖ´Ù. ºñµð¿À ½ºÆ®¸²ÀÇ codecparÀÇ format ¸â¹ö°¡ »ö»ó Æ÷¸ËÀε¥ ´ë·« 100¿© °¡Áö°¡ ÀÖ´Ù. ÀÚÁÖ »ç¿ëÇÏ´Â »ö»ó Æ÷¸ËÀº ´ÙÀ½°ú °°´Ù.

 

Æ÷¸Ë

¼³¸í

AV_PIX_FMT_YUV420P

Æò¸é YUV 4:2:0

AV_PIX_FMT_YUYV422

ÀÏÂ÷¿ø YUV 4:2:2

AV_PIX_FMT_RGB24       

RGB

AV_PIX_FMT_BGR24       

BGR

AV_PIX_FMT_YUV444P

Æò¸é YUV 4:4:4

AV_PIX_FMT_YUV411P

Æò¸é YUV 4:1:1

PIX_FMT_GRAY8             

Y ¹à±â°ª 8ºñÆ®·Î¸¸ ±¸¼ºµÈ ±×·¹À̽ºÄÉÀÏ

AV_AV_PIX_FMT_MONOWHITE

1ºñÆ® Èæ¹é. 0ÀÌ Èò»ö, 1ÀÌ °ËÁ¤ÀÌ´Ù. »óÀ§ ºñÆ®¿¡¼­ ÇÏÀ§ ºñÆ®·Î Çȼ¿À» ³ª¿­ÇÑ´Ù.

AV_PIX_FMT_PAL8

8ºñÆ® ÆÈ·¹Æ®¸¦ »ç¿ëÇÏ´Â Æ÷¸Ë

 

°¡Àå Á÷°üÀûÀ̰í ÀÌÇØÇϱ⠽¬¿î »ö»ó Æ÷¸ËÀº »¡°­, ÃÊ·Ï, ÆÄ¶û»öÀÇ °­µµ¸¦ Á¶ÇÕÇÏ¿© Ç¥ÇöÇÏ´Â RGBÀÌ´Ù. ±×°Íµµ ¹ÙÀÌÆ® ¼ø¼­¿¡ µû¶ó RGB¿Í BGR µÎ °¡Áö Á¾·ù°¡ ÀÖ°í ¾ËÆÄ±îÁö Æ÷ÇÔÇϸé ARGB, BGRA°¡ µÈ´Ù. À©µµ¿ì°¡ ±âº»ÀûÀ¸·Î »ç¿ëÇÏ´Â Æ÷¸ËÀÌ ARGBÀÌ´Ù.

»ï¿ø»öÀ» Á¶ÇÕÇÏ´Â ¹æ½ÄÀÌ °¡Àå Æí¸®ÇÏÁö¸¸ °¢ Çȼ¿¿¡ ¸ðµç »ö ¿ä¼Ò Á¤º¸°¡ ´Ù ÀÖ¾î ¿ë·®ÀÌ Å©°í Èæ¹é µð½ºÇ÷¹ÀÌ¿¡´Â ºñÈ¿À²ÀûÀÌ´Ù. Èæ¹é ÅÚ·¹ºñÀü ½ÃÀý¿¡ ¹æ¼Û±¹Àº °¢ Çȼ¿ÀÇ ¹à±â Á¤º¸¸¸ ½î¸é µÇ¾úÀ¸³ª Ä÷¯ ÅÚ·¹ºñÀüÀÌ µîÀåÇÔÀ¸·Î½á »ö»ó Á¤º¸¸¦ º¸³»¾ß Çß´Ù. À̶§ RGB¸¦ º¸³»¸é Èæ¹é ÅÚ·¹ºñÀüÀº »ö»óÀ» ¹à±â·Î ¹Ù²Ù´À¶ó ´À·ÁÁø´Ù.

±×·¡¼­ °í¾ÈÇÑ »ö»ó Æ÷¸ËÀÌ YUVÀÌ´Ù. YUV´Â ¹à±â Á¤º¸ÀÎ Y¿Í û»öÀÎ U, Àû»öÀÎ V Á¤º¸·Î ±¸¼ºµÈ´Ù. »ç¶÷ÀÇ ´«Àº RGBÀÇ Á¶ÇÕÀÌ ¾Æ´Ñ »ö»ó°ú ¹à±â·Î »ç¹°À» ÀνÄÇϴµ¥ ÀÌ ¹æ½Ä´ë·Î »ö»óÀ» ¸¸µå´Â °ÍÀÌ´Ù. Èæ¹é ÅÚ·¹ºñÀüÀº YÁ¤º¸¸¸ »©³» »ç¿ëÇÏ¸é ¹à±â¸¦ ½±°Ô Ç¥ÇöÇÒ ¼ö ÀÖ¾î È¿À²ÀûÀÌ´Ù. ÀÌ·± ¿ª»çÀûÀÎ ÀÌÀ¯·Î °í¾ÈÇÑ YUV´Â Çȼ¿ ¾ÐÃà¿¡µµ È¿°úÀûÀ̾ ÀÌÈÄ¿¡µµ °è¼Ó »ç¿ëµÇ°í ÀÖ´Ù.

RGB Æ÷¸ËÀº °¢ Á¡¸¶´Ù ¼¼ ¿ä¼Ò°¡ ´Ù ÇÊ¿äÇϸç Çϳª¸¦ »ý·«ÇÏ¸é ±Ý¹æ Æ¼°¡ ³­´Ù. ±×·¯³ª YUV Æ÷¸ËÀº ¹à±âÀÎ Y¿¡ ¹Î°¨ÇÒ »Ó »öÁ¶¿¡ ÇØ´çÇÏ´Â U, V´Â ÀÎÁ¢ Çȼ¿ÀÌ ºñ½ÁÇØµµ º°·Î Ƽ°¡ ³ªÁö ¾Ê´Â´Ù. ±×·¡¼­ ÀÎÁ¢ÇÑ Çȼ¿ÀÇ U, V Á¤º¸¸¦ ÇÕÄ¡´Âµ¥ À̸¦ ¼­ºê »ùÇøµÀ̶ó°í ÇÑ´Ù.

     

RGB³ª YUV 4:4:4´Â °¢ Çȼ¿´ç 3¹ÙÀÌÆ®¾¿ÀÇ »ö»ó ¿ä¼Ò¸¦ °³º°ÀûÀ¸·Î °¡Áø´Ù. Á¡ 4°³ Ç¥Çö¿¡ 12¹ÙÀÌÆ®¸¦ »ç¿ëÇϸç È­ÁúÀÌ °¡Àå ÁÁ´Ù. YUV 4:2:2´Â Y°ªÀº Çȼ¿º°·Î °¢°¢ °¡ÁöÁö¸¸ ÀÎÁ¢ÇÑ µÎ Çȼ¿Àº U, V°ªÀ» °øÀ¯ÇÑ´Ù. ÀÌ·¯¸é Á¡ 4°³ Ç¥Çö¿¡ 8¹ÙÀÌÆ®¸é µÇ´Ï 4¹ÙÀÌÆ®°¡ Àý¾àµÈ´Ù.

YUV 4:1:1Àº ÀÎÁ¢ÇÑ ³× Çȼ¿ÀÌ U, V°ªÀ» °øÀ¯ÇÏ´Â ½ÄÀ̸ç 6¹ÙÀÌÆ®°¡ µÇ¾î ¾ÖÃÊÀÇ Àý¹ÝÀ¸·Î ÁÙ¾îµç´Ù. ±×·¯³ª 4:1:1Àº ±æ°Ô ´Ã¾î¼± Çȼ¿ÀÌ »öÁ¶¸¦ °øÀ¯ÇÏ´Â ½ÄÀ̸ç Y1°ú Y4°¡ ³Ê¹« ¶³¾îÁ® ÀÖ¾î »öÁ¶Â÷À̰¡ ´«¿¡ °Å½½¸± ¼ö ÀÖ´Ù. 4:2:0Àº ¾Æ·¡ À§·Î ÀÎÁ¢ÇÑ 4°³ÀÇ Çȼ¿ÀÌ U, V¸¦ °øÀ¯ÇÏ¿© Á» ´úÇÏ´Ù.

»ö»ó ¿ä¼Ò¸¦ ³ª¿­ÇÏ´Â ¹æ½Äµµ µÎ °¡Áö°¡ Àִµ¥ °¢ ¿ä¼Ò¸¦ ÀÏÂ÷¿øÀ¸·Î ³ª¿­ÇÏ´Â ¹æ½Ä(packed)ÀÌ ÀÖ°í º°µµÀÇ ¸Þ¸ð¸® ºí·Ï¿¡ ¿ä¼Ò³¢¸® ¹­¾î¼­ Æò¸éÀû(planar)À¸·Î Ç¥ÇöÇÏ´Â ¹æ½ÄÀÌ ÀÖ´Ù. RGB¿Í YUV 4:4:4´Â ¿ä¼Ò°ªÀÌ ±ÔÄ¢ÀûÀ¸·Î ¹Ýº¹µÇ¾î ÀÏÂ÷¿øÀûÀ¸·Î ³ª¿­ÇÏ¸é µÈ´Ù. ÇÏÁö¸¸ YUV 4:2:2´Â YÀÇ °³¼ö¿Í U, VÀÇ °³¼ö°¡ ´Þ¶ó º°µµÀÇ ¸Þ¸ð¸®¿¡ µû·Î ³ª¿­ÇÏ´Â ¹æ½ÄÀÌ È¿À²ÀûÀÌ´Ù. µÎ ¹æ½ÄÀ» ±×¸²À¸·Î ºñ±³ÇØ º¸ÀÚ.

»ùÇà µ¿¿µ»óÀÎ fire.avi°¡ ¿À¸¥ÂÊ ±×¸²Ã³·³ YUV420P »ö»ó Æ÷¸ËÀ¸·Î µÇ¾î ÀÖÀ¸¸ç µ¿¿µ»óÀº ÀÌ Æ÷¸ËÀ¸·Î µÈ °æ¿ì°¡ °¡Àå ¸¹´Ù. YÀÇ ±æÀÌ¿¡ ºñÇØ U, V´Â 1/4¹Û¿¡ µÇÁö ¾Ê´Â´Ù. FFmpegÀº ÀÌ·± ¸ðµç °æ¿ìÀÇ »ö»ó Æ÷¸ËÀ» ¸ðµÎ Áö¿øÇÑ´Ù. ±×·¡¼­ ³»ºÎÀûÀÎ ÀÚ·á ±¸Á¶°¡ º¹ÀâÇÒ ¼ö¹Û¿¡ ¾ø´Ù.

RGB ¹æ½ÄÀÇ ¸ð´ÏÅÍ´Â YUV¸¦ Á÷Á¢ Ãâ·ÂÇÏÁö ¸øÇϸç RGB·Î ¹Ù²ã¾ß ÇÑ´Ù. ÇÁ·¹ÀÓÀÇ data´Â »ö»ó ¿ä¼Ò¸¦ ÀúÀåÇÏ´Â ¹è¿­ÀÇ ¹è¿­À̸ç ÃÖ´ë Å©±â´Â 8ÀÌ´Ù. data[0]¿¡ Y°ªÀÌ ³ª¿­µÇ¾î ÀÖ°í data[1], data[2]¿¡ U, V°ªÀÌ ³ª¿­µÇ¾î ÀÖ´Ù. À§ ¿À¸¥ÂÊ ±×¸²ÀÇ ¹è¿­ÀÌ ¼ø¼­´ë·Î data[n] ¹è¿­¿¡ ÇØ´çÇÑ´Ù.

°¢ data ¹è¿­ÀÇ ±æÀÌ´Â »ö»ó Æ÷¸Ë¿¡ µû¶ó ´Þ¶óÁö´Âµ¥ ÀÌ Á¤º¸´Â ÇÁ·¹ÀÓÀÇ linesize ¹è¿­¿¡ µé¾î ÀÖ´Ù. linesize´Â ÇÑÁÙÀ» ±¸¼ºÇÏ´Â »ö»ó ¿ä¼ÒÀÇ ±æÀÌ ¹è¿­ÀÌ´Ù. Äֿܼ¡¼­ ÀÛ¼ºÇÑ ´ýÇÁ ¿¹Á¦·Î Á¡°ËÇØ º¸¸é Y´Â ÇÑÁÙÀÇ µ¥ÀÌÅÍ ±æÀ̰¡ À̹ÌÁö Æø°ú °°Àº 640°³ÀÌÁö¸¸ U, V´Â 320°³¹Û¿¡ ¾ÈµÇ¸ç µÎ ÁÙÀÇ Y°¡ °øÀ¯ÇÑ´Ù.

»ö»ó ¸ðµ¨³¢¸® º¯È¯ÇÏ´Â °ø½ÄÀº °ø°³µÇ¾î ÀÖÀ¸¹Ç·Î ±×´ë·Î °¡Á®´Ù ¾²¸é µÈ´Ù. ÀÏÁ¤ °è¼ö¸¦ °öÇÏ°í ´õÇÏ´Â ÀÏÂ÷ ¹æÁ¤½ÄÀÏ »ÓÀÌ´Ù. ÀÎÅͳÝÀ¸·Î °Ë»öÇØ º¸µÇ À§Å°¿¡ Àß Á¤¸®µÇ¾î ÀÖ´Ù. °ø½Ä´ë·Î Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ.

 

int DrawFrame(HDC hdc) {

        int ret;

        AVPacket packet = { 0, };

        AVFrame vFrame = { 0, }, aFrame = { 0, };

 

        while (av_read_frame(fmtCtx, &packet) == 0) {

                   if (packet.stream_index == vidx) {

                              ret = avcodec_send_packet(vCtx, &packet);

                              if (ret != 0) { continue; }

                              for(;;) {

                                        ret = avcodec_receive_frame(vCtx, &vFrame);

                                        if (ret == AVERROR(EAGAIN)) break;

 

                                        // ¾ÐÃà ÇØÁ¦ÇÑ À̹ÌÁö Ãâ·Â

                                        for (int y = 0; y < vFrame.height; y++) {

                                                   for (int x = 0; x < vFrame.width; x++) {

                                                             // ÇÁ·¹ÀÓ ¹öÆÛ¿¡¼­ YUV ¿ä¼Ò¸¦ ±¸ÇÑ´Ù.

                                                             unsigned char Y, U, V;

                                                             Y = vFrame.data[0][vFrame.linesize[0] * y + x];

                                                             U = vFrame.data[1][vFrame.linesize[1] * (y / 2) + x / 2];

                                                             V = vFrame.data[2][vFrame.linesize[2] * (y / 2) + x / 2];

 

                                                             // °ø½Ä¿¡ µû¶ó YUV¸¦ RGB·Î º¯È¯ÇÑ´Ù.

                                                             int r, g, b;

                                                             r = int(Y + 1.3707 * (V - 128));

                                                             g = int(Y - 0.6980 * (U - 128) - 0.3376 * (V - 128));

                                                             b = int(Y + 1.7324 * (U - 128));

 

                                                             // »ö»ó ¿ä¼Ò°¡ 0 ~ 255 ¹üÀ§¸¦ ³ÑÁö ¾Êµµ·Ï ÇÑ´Ù.

                                                             r = max(0, min(255, r));

                                                             g = max(0, min(255, g));

                                                             b = max(0, min(255, b));

 

                                                             // »ö»ó°ªÀ¸·Î Á¡À» Âï´Â´Ù.

                                                             COLORREF color = RGB(r, g, b);

                                                             SetPixel(hdc, x, y, color);

                                                   }

                                        }

                              }

 

                              av_packet_unref(&packet);

                              return 0;

                   }

        }

 

        av_frame_unref(&vFrame);

        av_frame_unref(&aFrame);

        return 1;

}

 

À̹ÌÁö Å©±âÀÎ vFrame.height, vFrame.width ¸¸Å­ x, y ÀÌÁß ·çÇÁ¸¦ µ¹¸ç °¢ ÁÂÇ¥ÀÇ »ö»óÀ» Á¶»çÇÑ´Ù. Y°ªÀº data[0] ¹è¿­À» ¼ø¼­´ë·Î ÀÐÀ¸¸é µÇÁö¸¸ U, V´Â ÁÂÇ¥¸¦ Àý¹ÝÀ¸·Î ³ª´©¾î Àд´Ù. ÀÌ·¸°Ô ±¸ÇÑ °¢ ÁÂÇ¥ÀÇ YUV°ªÀ» RGB·Î ¹Ù²Û´Ù.  º¯°æ ÈÄ RGB°¡ 0~255 ¹üÀ§¸¦ ³Ñ¾î°¥ ¼öµµ ÀÖ¾î ¹üÀ§¾È¿¡ ³Ö¾î ÁØ´Ù. ÀÌ·¸°Ô Á¶»çÇÑ RGB »ö»óÀ¸·Î Á¡À» Âï±â¸¦ À̹ÌÁö ¸éÀû¸¸Å­ ¹Ýº¹ÇÑ´Ù.

µåµð¾î ù Àå¸éÀÌ È­¸é¿¡ ³ªÅ¸³µ´Ù. ÀÏÀÏÀÌ Á¡À» ÂïÀ¸´Ï ´À¸®Áö¸¸ ¾î·°Å³ª ÇÑ Àå¸éÀÌ ±×·ÁÁø´Ù. ¸¶¿ì½º ¹öưÀ» °è¼Ó ´©¸£¸é ´ÙÀ½ Àå¸éµµ Àß ±×¸°´Ù. °è¼Ó Ŭ¸¯ÇÏ¸é µ¿¿µ»óÀ» ³¡±îÁö º¼ ¼ö ÀÖÁö¸¸ ¼Óµµ°¡ ³Ê¹« ´À¸®´Ù. ¿ø·ÐÀûÀÎ ¹æ¹ýÀ» Àß º¸¿© ÁÖ´Â ¿¹Á¦·Î¼­ °¡Ä¡°¡ ÀÖÁö¸¸ ½Ç¿ëÀûÀ¸·Î ¾²±â¿¡´Â ¾ÆÁ÷ ¹®Á¦°¡ ¸¹´Ù. Çϳª¾¿ °³¼±ÇØ º¼ °ÍÀÌ´Ù.