ºñµð¿À´Â Á¤Áö ¿µ»óÀ» ½Ã°£º°·Î ¸ð¾Æ ³õÀº °ÍÀÌ°í °¢ ¿µ»óÀº Æø, ³ôÀ̸¸ÅÀÇ
Çȼ¿·Î ±¸¼ºµÈ´Ù. °¢ Çȼ¿ÀÇ »ö»óÀ» Ç¥ÇöÇÏ´Â ¹æ¹ýÀÌ »ö»ó Æ÷¸ËÀÌ´Ù. ¿øÀÚÀûÀÎ
´ÜÀ§ÀÎ Çȼ¿ÀÇ ¼Ó¼ºÀ» °áÁ¤ÇÏ´Â °ªÀÌ¾î¼ Àß ¾Ë¾Æ µÎ¾î¾ß ÇÑ´Ù. Á» º¹ÀâÇÏÁö¸¸ ³ª¸§ Àç¹Ì´Â ÀÖ´Ù. ºñµð¿À ½ºÆ®¸²ÀÇ 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 »ö»óÀ¸·Î Á¡À» Âï±â¸¦ À̹ÌÁö
¸éÀû¸¸Å ¹Ýº¹ÇÑ´Ù.
µåµð¾î ù Àå¸éÀÌ È¸é¿¡ ³ªÅ¸³µ´Ù. ÀÏÀÏÀÌ Á¡À» ÂïÀ¸´Ï ´À¸®Áö¸¸ ¾î·°Å³ª ÇÑ Àå¸éÀÌ ±×·ÁÁø´Ù. ¸¶¿ì½º
¹öưÀ» °è¼Ó ´©¸£¸é ´ÙÀ½ Àå¸éµµ Àß ±×¸°´Ù. °è¼Ó Ŭ¸¯ÇÏ¸é µ¿¿µ»óÀ» ³¡±îÁö º¼ ¼ö ÀÖÁö¸¸ ¼Óµµ°¡ ³Ê¹«
´À¸®´Ù. ¿ø·ÐÀûÀÎ ¹æ¹ýÀ» Àß º¸¿© ÁÖ´Â ¿¹Á¦·Î¼ °¡Ä¡°¡ ÀÖÁö¸¸ ½Ç¿ëÀûÀ¸·Î ¾²±â¿¡´Â ¾ÆÁ÷ ¹®Á¦°¡ ¸¹´Ù. Çϳª¾¿ °³¼±ÇØ º¼ °ÍÀÌ´Ù.