2-8.¿¡·¯ ó¸®

À§ ¿¹Á¦´Â ¾ÐÃàÀ» Ç®°í »ç¿ëÇÏ´Â ÁÖ¿ä È帧¸¸ »ìÆì º¸±â À§ÇØ ÆÄÀÏÀ» ¿­ ¶§ ¿Ü¿¡´Â ¿¡·¯ 󸮸¦ »ý·«Çß´Ù. ¿¡·¯ ó¸® Äڵ尡 µé¾î°¡¸é º¹ÀâÇØÁö´Ï »ùÇà µ¿¿µ»óÀÎ fire.avi¿¡ µü ¸Â´Â ÄÚµå·Î ÀÛ¼ºÇß´Ù. ±×·¯³ª ÃÖ¼ÒÇÑÀÇ ±âº»ÀûÀÎ ¿¡·¯ 󸮴 ÇØ¾ß ÇÑ´Ù. µ¿¿µ»óÀÌ ±úÁ³°Å³ª ÀÔÃâ·Â ¿¡·¯°¡ ¹ß»ýÇÏ´Â °æ¿ì°¡ ºó¹øÇϹǷΠ¼¶¼¼ÇÑ ¿¡·¯ 󸮸¦ ÇØ¾ß ÇÑ´Ù. ·ÎÄà ÆÄÀÏÀº ±×³ª¸¶ ÀÔÃâ·Â ¿¡·¯´Â µå¹°Áö¸¸ ³×Æ®¿öÅ© ½ºÆ®¸²Àº ¿¡·¯ ¹ß»ýÈ®·üÀÌ ´õ ³ô´Ù.

µ¿¿µ»óÀ̶ó°í Çؼ­ Ç×»ó ¸ðµç ½ºÆ®¸²ÀÌ ´Ù ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. À½¼º ¾øÀÌ ¿µ»ó¸¸ ÀÖ´Â Á¶¿ëÇÑ µ¿¿µ»óµµ ÀÖ°í Mp3´Â ¿µ»ó¾øÀÌ »ç¿îµå¸¸ ÀÖ´Ù. »ç½Ç Mp3´Â µ¿¿µ»ó¿¡¼­ »ç¿îµå¸¸ ÃßÃâÇÑ °ÍÀÌ´Ù. av_find_best_streamÀÌ Ç×»ó ¼º°øÇÏ´Â °ÍÀº ¾Æ´Ï¸ç À½¼öÀÇ ¿¡·¯¸¦ ¸®ÅÏÇÑ´Ù.

 

AVERROR_STREAM_NOT_FOUND : ½ºÆ®¸²ÀÌ ¾øÀ½

AVERROR_DECODER_NOT_FOUND : ½ºÆ®¸²Àº ÀÖÀ¸³ª ÄÚµ¦ÀÌ ¾øÀ½

 

¾Õ ¿¹Á¦¿¡ Mp3³ª ¿µ»ó¸¸ ÀÖ´Â µ¿¿µ»óÀ» ÁÖ¸é Á×¾î ¹ö¸°´Ù. ¿¡·¯ 󸮸¦ ÀüÇô ÇÏÁö ¾Ê°í ´ç¿¬È÷ ÀÖ°Ú°Å´Ï ¶ó°í »ý°¢Çß³¢ ¶§¹®Àε¥ ¾ø´Â ½ºÆ®¸²Àº ¹«½ÃÇØ¾ß ÇÑ´Ù. ½ºÆ®¸²À» ¾×¼¼½ºÇÏ°í ÄÚµ¦À» »ý¼ºÇÏ´Â Äڵ带 Á¶°Ç¹®À¸·Î °¨½ÎÁÖ¸é µÈ´Ù.

 

       if (vidx >= 0) {

                 vStream = fmtCtx->streams[vidx];

                 ....

       }

 

½ºÆ®¸²À» Àд Äڵ嵵 send¿Í receive°¡ Ç×»ó ¼º°øÇÑ´Ù°í °¡Á¤ÇÏ°í ÀÖÁö¸¸ Çö½ÇÀº ±×·¸Áö ¾Ê´Ù. ÆÐŶ°ú ÇÁ·¹ÀÓÀÌ Ç×»ó 1:1·Î ´ëÀÀµÇÁö ¾ÊÀ¸¸ç ÀÎÄÚµù °úÁ¤¿¡¼­³ª ³×Æ®¿öÅ© Àü´Þ °úÁ¤¿¡¼­ ±úÁø ÆÐŶÀ» ¹Þ´Â °æ¿ìµµ Çã´ÙÇÏ´Ù. ¶ÇÇÑ µ¿¿µ»ó ÀÚü°¡ À߸øµÈ Á¤º¸¸¦ °¡Áö´Â °æ¿ìµµ ¿¹»ó¿Ü·Î ¸¹´Ù.

FFmpegÀÇ ÇÔ¼ö´Â ´ëºÎºÐ ¼º°ø½Ã 0À» ¸®ÅÏÇÏ¸ç ¿¡·¯ ¹ß»ý½Ã À½¼ö¸¦ ¸®ÅÏÇÑ´Ù. ƯÈ÷ ÆÐŶÀ» Àаųª ÇÁ·¹ÀÓÀ¸·Î º¯È¯ÇÒ ¶§ ¿©·¯ °¡Áö ¿¡·¯¿Í Ư¼öÇÑ »óÅ°ªÀÌ ¸®ÅϵȴÙ. ÄÚµ¦Àº ÆÐŶÀÇ ¾ÐÃàÀ» Ç®¾î ÇÁ·¹ÀÓÀ» ¸¸µé±â À§ÇØ ²÷ÀÓ¾øÀÌ µ¥ÀÌÅ͸¦ ÀÔÃâ·ÂÇÏ¸ç ³»ºÎ ¹öÆÛ¸¦ °ü¸®ÇÑ´Ù.

³»ºÎ ¹öÆÛ°¡ °¡µæ Â÷ ´õ ³ÖÁö ¸øÇÏ´Â °æ¿ìµµ ÀÖ°í ÅÖÅÖ ºñ¾î ÀÖ¾î »©³¾ °ÍÀÌ ¾ø´Â °æ¿ìµµ ÀÖ´Ù. ÆÐŶ°ú ÇÁ·¹ÀÓÀº 1:1·Î ´ëÀÀµÇ´Â °ÍÀÌ º¸ÆíÀûÀÌ´Ù. ÀÌ °æ¿ì´Â ÆÐŶ Çϳª¸¦ send ÇÏ°í ÇÁ·¹ÀÓ Çϳª¸¦ receive Çϱ⸦ °è¼Ó ¹Ýº¹ÇÏ¸é µÈ´Ù. ¾Õ ¿¹Á¦´Â µü ÀÌ °æ¿ì¸¸ °¡Á¤ÇÏ°í Àִµ¥ ±×·¸Áö ¾ÊÀº °æ¿ìµµ ÀÖ´Ù.

¿µ»óÀÌ ³Ê¹« °íÈ­ÁúÀÌ¸é ¿©·¯ °³ÀÇ ÆÐŶÀ» ¸ð¾Æ¾ß ÇϳªÀÇ À̹ÌÁö¸¦ ¸¸µé ¼ö ÀÖ´Ù. ÆÐŶÀÌ ¹ÝÂʸ¸ µé¾î ¿Í ÀÖ´Â »óÅ¿¡¼­´Â ¾ÆÁ÷ ÇÁ·¹ÀÓÀ» ¸¸µé ¼ö ¾ø´Ù. ÀÌ °æ¿ì receive ÇÔ¼ö´Â EAGINÀ» ¸®ÅÏÇÏ¿© ÆÐŶÀ» Çϳª ´õ ÀÐÀ¸¶ó°í ½ÅÈ£¸¦ ÁØ´Ù. ÀúÀ½Áú »ç¿îµå´Â ÆÐŶ Çϳª°¡ ¿©·¯ °³ÀÇ ÇÁ·¹ÀÓÀ¸·Î ºÐÇҵDZ⵵ ÇÑ´Ù. À̶§ send ÇÔ¼ö´Â ÀÌÀü¿¡ ³ÖÀº ÆÐŶÀ» ¾ÆÁ÷ ´Ù »©°¡Áö ¾Ê¾Æ ´õ ³ÖÀ» ¼ö ¾ø´Ù´Â EAGAINÀ» ¸®ÅÏÇÑ´Ù.

EAGAINÀº ½ÇÆи¦ ÀǹÌÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó Áö±ÝÀº Á¶°ÇÀÌ ¸ÂÁö ¾ÊÀ¸´Ï ´ÙÀ½¿¡ ´Ù½Ã ½ÃµµÇ϶ó´Â ¶æÀÌ´Ù. È£ÃâÇÑ ÇÔ¼ö¿Í ÇöÀç »óȲ¿¡ µû¶ó ÀûÀýÇÑ Á¶Ä¡¸¦ ÃëÇØ¾ß ÇÑ´Ù. ¹öÆÛ°¡ °¡µæ Â÷ ÀÖÀ¸¸é »© ³» °¥¶§±îÁö ±â´Ù·Á¾ß Çϸç ÆÐŶÀÌ ¾ø°Å³ª ¹Ì¿Ï¼ºÀÌ¸é ´ÙÀ½ ÆÐŶÀÌ µé¾î¿Ã ¶§±îÁö ´ë±âÇØ¾ß ÇÑ´Ù.

FFmpegÀÇ ¿¡·¯ ÄÚµå´Â ¸ðµÎ ¾ç¼ö·Î Á¤ÀǵǾî ÀÖ°í ÇÔ¼ö´Â ÀÌ °ªÀ» À½¼ö·Î ºÎÈ£¸¦ ¹Ù²Ù¾î ¸®ÅÏÇÑ´Ù. µû¶ó¼­ ºñ±³ÇÒ ¶§´Â ¿¡·¯ Äڵ忡 À½¼ö ºÎÈ£¸¦ ºÙ¿©¾ß Çϴµ¥ ÀÌ Ã³¸®¸¦ ÇÏ´Â ¸ÅÅ©·Î AVERROR°¡ Á¤ÀǵǾî ÀÖ´Ù. ±×·¡¼­ ½ÇÁ¦ ºñ±³ÇØ¾ß ÇÒ ¿¡·¯ ÄÚµå´Â AVERROR(EAGAIN)ÀÌ´Ù.

send³ª receive Áß¿¡ ¸¶Áö¸· ÇÁ·¹ÀÓ¿¡ µµ´ÞÇßÀ¸¸é AVERROR_EOF°¡ ¸®ÅϵȴÙ. EOF °ËÃâÀº º¸Åë readÇÒ ¶§ ó¸®ÇÏÁö¸¸ Ç÷¯½Ã °úÁ¤¿¡¼­ ÆÐŶ Áß°£¿¡µµ ¿Ã ¼ö ÀÖ´Ù. À̶§´Â ´ÙÀ½ ÇÔ¼ö·Î ¹öÆÛ¸¦ ±ò²ûÇÏ°Ô ºñ¿öÁÖ°í Å»ÃâÇÏ¸é µÈ´Ù. ´Ù¸¥ ½ºÆ®¸²À» ¿­°Å³ª Àç»ý À§Ä¡¸¦ ¹Ù²Ü ¶§µµ ¹öÆÛ¸¦ ºñ¿ö ÁÖ¾î¾ß ÇÑ´Ù.

 

void avcodec_flush_buffers(AVCodecContext *avctx)   

 

¾Õ ¿¹Á¦¿¡ ¿¡·¯ ÄÚµå ó¸® ·çƾÀ» Ãß°¡ÇÏ¸é ´ëÃæ ´ÙÀ½°ú °°´Ù. Á¦¾î ±¸Á¶°¡ Á¡Á¡ º¹ÀâÇØÁø´Ù.

 

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

       if (packet.stream_index == vidx) {

                 ret = avcodec_send_packet(vCtx, &packet);

                 if (ret == 0) {

                            ret = avcodec_receive_frame(vCtx, &vFrame);

                            if (ret == 0) {

                                       // ¾ÐÃà Ǭ ÇÁ·¹ÀÓ »ç¿ë

                            } else {

                                       if (ret == AVERROR(EAGAIN)) {

                                                 // ¹öÆÛ°¡ ä¿öÁú ¶§ Àç½Ãµµ

                                       }

                                       if (ret == AVERROR_EOF) {

                                                 // ÆÄÀÏ ³¡ ó¸®

                                       }

                            }

                 } else {

                            if (ret == AVERROR(EAGAIN)) {

                                       // ¹öÆÛ°¡ ºô ¶§ Àç½Ãµµ

                            }

                 }

 

ÀÌ·¸°Ô µÇ¸é ÁÖ¿ä Äڵ尡 Á¶°Ç¹® ¾ÈÂÊÀ¸·Î µé¿©½áÁ® ÆíÁýÇϱ⠺ÒÆíÇÏ´Ù. ¿¡·¯ÀÎ °æ¿ì¸¦ ¸ÕÀú ó¸®ÇÏ°í ¿¡·¯°¡ ¾øÀ» ¶§ Á¤»óÀûÀΠ󸮸¦ ÇÏ´Â ±¸Á¶°¡ ´õ ½¬¿îµ¥ Ç®¾î½á º¸¸é ´ÙÀ½°ú °°´Ù.

 

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

       if (packet.stream_index == vidx) {

                 ret = avcodec_send_packet(vCtx, &packet);

                 if (ret != 0) {

                           // ¹öÆÛ°¡ °¡µæ áÀ¸¸é ¾Æ¹« °Íµµ ÇÏÁö ¾Ê°í ¾Æ·¡·Î ³»·Á°¡ receive°¡ »© °¡µµ·Ï ÇÑ´Ù.

                            if (ret == AVERROR(EAGAIN)) {

                                       ;

                            // ÆÄÀÏ ³¡ÀÌ¸é ·çÇÁ¸¦ ºüÁ® ³ª°£´Ù.

                            } else if (ret == AVERROR_EOF) {

                                       break;

                            // ±× ¿ÜÀÇ ¿¡·¯ÀÌ¸é ¿¡·¯ ¸®ÅÏÇÑ´Ù.

                            } else {

                                       return -1;

                            }

                 }

 

                 ret = avcodec_receive_frame(vCtx, &vFrame);

                 if (ret != 0) {

                            // ÇÁ·¹ÀÓ ¹Ì¿Ï¼ºÀÌ¸é ¼±µÎ·Î µ¹¾Æ°¡ ÆÐŶ Çϳª ´õ Àд´Ù.

                            if (ret == AVERROR(EAGAIN)) {

                                       continue;

                            }

                            // ÆÄÀÏ ³¡ÀÌ¸é ¹öÆÛ ºñ¿ì°í ·çÇÁ ºüÁ® ³ª°£´Ù.

                            if (ret == AVERROR_EOF) {

                                       avcodec_flush_buffers(vCtx);

                                       break;

                            }

                 }

 

                  Á¤»óÀûÀΠó¸®

 

EOF°¡ Áß°£¿¡ ¿À´Â °æ¿ì´Â °ÅÀÇ µå¹°´Ù. ¶Ç send¿Í receiveÀÇ EAGAINÀ» ´Ù ó¸®ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ³Ö´Â ÀÔÀå¿¡¼­ EAGINÀº ³ÖÀ» µ¥°¡ ¾ø´Ù´Â ¾ê±â°í ¹Þ´Â ÀÔÀå¿¡¼­ EAGAINÀº »© °¥°Ô ¾ø´Ù´Â ¾ê±âÀ̹ǷΠÀÌ µÎ »óÅ´ ¹èŸÀûÀÌ´Ù. send°¡ Àß ³Ö¾î ÁÖ¸é receive°¡ EAGAINÀ» ¹ÞÀ» ÀÏÀÌ ¾ø°í receive°¡ Àç±ï Àç±ï Àß »© °¡¸é send°¡ EAGAINÀ» ¹ÞÀ» ÀÏÀÌ ¾ø´Ù.

¸¸¾à send°¡ EAGAINÀ» ¹Þ¾Ò´Âµ¥ receiveµµ EAGAINÀ» ¹Þ¾Ò´Ù¸é ³í¸®ÀûÀÎ ¸ð¼øÀÌ´Ù. EAGAINÀÌ ¾çÂÊÀ¸·Î ´Ù ¹ß»ýÇÒ ¼ö´Â ¾ø´Ù. ÇÑÂÊ¿¡¼­´Â ÃÖ¼±À» ´ÙÇÏ°í ¹Ý´ëÂÊ¿¡¼­ EAGAINÀ» ó¸®ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¹öÆÛ°¡ Ç×»ó ³Ë³ËÇÏ´Ù°í °¡Á¤ÇÏ°í sendÀÇ EAGAINÀ» ÃÖ´ëÇÑ ¹æÁöÇÏ´Â ÂÊÀ¸·Î Á¦¾î ±¸Á¶¸¦ Àâ¾Æ º¸¸é ´ÙÀ½°ú °°´Ù.

 

ret = avcodec_send_packet(vCtx, &packet);

if (ret != 0) { continue; }

for(;;) {

       ret = avcodec_receive_frame(vCtx, &vFrame);

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

       // ÇÁ·¹ÀÓ »ç¿ë

}

 

send °á°ú°¡ À½¼öÀÌ¸é ´Ü¼øÈ÷ ·çÇÁ ¼±µÎ·Î µ¹¾Æ°¡ Àç½ÃµµÇÑ´Ù. ¿©·¯ °¡Áö ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö Àִµ¥ ÆÐŶÀÌ ±úÁø °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù. ƯÈ÷ ½ºÆ®¸² ȯ°æ¿¡¼­ À߸øµÈ ÆÐŶÀ» ¹ÞÀ» È®·üÀÌ ³ô´Ù. ÀÌ °æ¿ì´Â µüÈ÷ ó¸®ÇÒ ¹æ¹ýÀÌ ¾øÀ¸´Ï ±×³É ¹ÞÀº ÆÐŶÀ» ¹ö¸®´Â ¼ö¹Û¿¡ ¾ø´Ù. ¿¡·¯¸¦ Á÷Á¢ ó¸®ÇÏ·Á¸é retÀÇ ¿¡·¯ Äڵ忡 µû¶ó ºÐ±âÇ쵂 ´ÙÀ½ ÇÔ¼ö·Î ¿¡·¯ÀÇ ¿øÀÎÀ» Á¶»çÇÑ´Ù.

 

int av_strerror(int errnum, char *errbuf, size_t errbuf_size)

 

ret¸¦ Àμö·Î Àü´ÞÇÏ¸é ¹®ÀÚ¿­ ¹öÆÛ¿¡ ¿¡·¯ ¼³¸í¹®À» ¸®ÅÏÇÑ´Ù. ·¹ÆÛ·±½º°¡ ¿ö³« ´ëÃæ µÇ¾î À־ ÀÌ ÇÔ¼ö·Î ¿¡·¯¸¦ Á¶»çÇÑ ÈÄ Á¶Ä¡ÇØ¾ß ÇÑ´Ù. À§ Á¦¾î¹®Àº ¸ðµç ¿¡·¯¸¦ ¹«½ÃÇÑ´Ù. ±×·¡ ºÁ¾ß ÆÐŶ Çϳª ¹ö¸®°í È­¸éÀÌ ¼ø°£ÀûÀ¸·Î ÁöÁöÁ÷°Å¸± »ÓÀÌ´Ù. ÆÐŶÀÌ ±ú ºÀ¸´Ï ÇÇÇÒ ¹æ¹ýÀº ¾ø°í ÃÖ´ëÇÑ ºÎµå·´°Ô ó¸®ÇØ¾ß ÇÏ°ÚÁö¸¸ ¿Ïº®ÇÒ ¼ö´Â ¾ø´Ù.

±×·¸´Ù¸é EAGINÀÇ °æ¿ì´Â ¾î¶»°Ô µÉ±î? °è¼Ó Àç½ÃµµÇϹǷΠ½ÇÁúÀûÀ¸·Î ¹«ÇÑ ·çÇÁ°¡ µÇ¾î ¹ö¸°´Ù.  ±×·¡¼­ ÀÌ·± »óȲÀ» Àý´ë ¸¸µé¾î¼­´Â ¾ÈµÈ´Ù. receive´Â Çѹø ¹ÞÀº ÆÐŶÀ» ¿ÏÀüÈ÷ ´Ù ÀÐ¾î ¹öÆÛ¸¦ ÅÖÅÖ ºñ°Ô ¸¸µé¾î¾ß ÇÑ´Ù. for ¹«ÇÑ ·çÇÁ¸¦ µ¹¸ç receive¸¦ °è¼Ó È£ÃâÇ쵂 EAGAINÀ» ¸®ÅÏÇÒ ¶§±îÁö ¹Ýº¹ÇÑ´Ù. ¹öÆÛ¿¡ ´õ ÀÐÀ»°Ô ¾øÀ» ¶§±îÁö ÂÊÂÊ »¡¾Æ ¸Ô¾î ³ö¾ß ´ÙÀ½ send È£ÃâÀÌ Ç×»ó ¼º°øÇÑ´Ù.

ÀÌ Á¦¾î ±¸Á¶°¡ ÃÖ¼±Àº ¾Æ´Ï¸ç ¿©·¯ °¡Áö º¯ÇüÀ» ¸¸µé ¼ö ÀÖ´Ù. receive¸¦ ¸ÕÀú ÇØ º¸°í EAGAINÀÌ ¸®Å쵃 ¶§ send¸¦ Çѹø¾¿ È£ÃâÇÏ´Â ¹æ¹ýµµ ÀÖ°í ¸ðµç ¿¡·¯¿¡ ´ëÇÑ Ã³¸® Äڵ带 ´Ù ÀÛ¼ºÇØ ³ÖÀ» ¼öµµ ÀÖ´Ù. ±×·¯³ª °úµµÇÏ°Ô º¹ÀâÇϸé Äڵ带 º¸±â ¾î·Á¿ì¹Ç·Î ¿¹Á¦ÀÇ ¼ÒÀÓ¿¡ ¸Â°Ô ÇʼöÀûÀÎ ¿¡·¯ ó¸® Äڵ常 ÀÏ´Ü ³Ö¾î µÎ¾ú´Ù. ¿©±â±îÁö ¼öÁ¤ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

AVFormatContext* fmtCtx;

int vidx = -1, aidx = -1;

AVStream* vStream, * aStream;

AVCodecParameters* vPara, * aPara;

AVCodec* vCodec, * aCodec;

AVCodecContext* vCtx, * aCtx;

 

#include <conio.h>

 

void arDump(void* array, int length)

{

        for (int i = 0; i < length; i++) {

                   printf("%02X ", *((unsigned char*)array + i));

        }

}

 

int main(void) {

        AVPacket packet = { 0, };

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

 

        int ret = avformat_open_input(&fmtCtx, "c:\\mpstudy\\fire.avi", NULL, NULL);

        if (ret != 0) { return -1; }

        avformat_find_stream_info(fmtCtx, NULL);

 

        vidx = av_find_best_stream(fmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);

        aidx = av_find_best_stream(fmtCtx, AVMEDIA_TYPE_AUDIO, -1, vidx, NULL, 0);

 

        if (vidx >= 0) {

                   vStream = fmtCtx->streams[vidx];

                   vPara = vStream->codecpar;

                   vCodec = avcodec_find_decoder(vPara->codec_id);

                   vCtx = avcodec_alloc_context3(vCodec);

                   avcodec_parameters_to_context(vCtx, vPara);

                   avcodec_open2(vCtx, vCodec, NULL);

        }

 

        if (aidx >= 0) {

                   aStream = fmtCtx->streams[aidx];

                   aPara = aStream->codecpar;

                   aCodec = avcodec_find_decoder(aPara->codec_id);

                   aCtx = avcodec_alloc_context3(aCodec);

                   avcodec_parameters_to_context(aCtx, aPara);

                   avcodec_open2(aCtx, aCodec, NULL);

        }

 

        int vcount = 0, acount = 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;

 

                                        if (vcount == 0) {

                                                   printf("Video format : %d(%d x %d).\n",

                                                             vFrame.format, vFrame.width, vFrame.height);

                                        }

                                        printf("V%-3d(pts=%3I64d,size=%5d) : ", vcount++, vFrame.pts, vFrame.pkt_size);

                                        for (int i = 0; i < 3; i++) {

                                                   printf("%d ", vFrame.linesize[i]);

                                        }

                                        arDump(vFrame.data[0], 4);

                                        arDump(vFrame.data[1], 2);

                                        arDump(vFrame.data[2], 2);

                              }

                   }

 

                   if (packet.stream_index == aidx) {

                              ret = avcodec_send_packet(aCtx, &packet);

                              if (ret != 0) { continue; }

                              for(;;) {

                                        ret = avcodec_receive_frame(aCtx, &aFrame);

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

 

                                        if (acount == 0) {

                                                   printf("Audio format : %d, %dch %d\n",

                                                             aFrame.format, aFrame.channels, aFrame.sample_rate);

                                        }

                                        printf("A%-3d(pts=%3I64d,size=%5d) : ", acount++, aFrame.pts, aFrame.pkt_size);

                                        arDump(aFrame.extended_data, 16);

                              }

                   }

 

                   av_packet_unref(&packet);

                   printf("\n");

                   if (_getch() == 27) break;

        }

 

        // ¸Þ¸ð¸® ÇØÁ¦

        av_frame_unref(&vFrame);

        av_frame_unref(&aFrame);

        avcodec_free_context(&vCtx);

        avcodec_free_context(&aCtx);

        avformat_close_input(&fmtCtx);

}

 

½ÇÇà °á°ú´Â ¾Õ ¿¹Á¦¿Í °°Áö¸¸ ¾ÈÁ¤¼º°ú Àç»ç¿ë¼ºÀ» Çâ»ó½ÃÄ×´Ù. ½ºÆ®¸² Á¸Àç ¿©ºÎ¿¡ µû¶ó Á¶°Ç¹®À¸·Î ÄÚµ¦ ÃʱâÈ­¸¦ ÁøÇàÇÑ´Ù. ¾ø´Â ½ºÆ®¸²ÀÌ ÀÐÇôÁú¸® ¸¸¹«ÇÏ´Ï ½ºÆ®¸²À» Àд ºÎºÐÀº Á¶°Ç ó¸®ÇÒ ÇÊ¿ä ¾ø´Ù.

½ºÆ®¸²À» Àд Á¦¾î ·çÇÁ´Â ¾Õ¿¡¼­ ¼³¸íÇÑ´ë·Î ¼öÁ¤Çß´Ù. ´ë°³ÀÇ °æ¿ì ÆÐŶ°ú ÇÁ·¹ÀÓÀÌ 1:1 ´ëÀÀµÇÁö¸¸ ¿Àµð¿ÀÀÇ °æ¿ì´Â ±×·¸Áö ¾ÊÀº °æ¿ì°¡ ¸¹´Ù. ÀÌ ±¸Á¶¸é ¸ðµç ÆÐŶÀ» ´Ù Àо´Ù. ¿¡·¯ 󸮰¡ ¿Ïº®ÇÏÁö´Â ¾ÊÁö¸¸ 99%ÀÇ µ¿¿µ»ó¿¡ ¹«³­ÇÑ ÄÚµåÀÌ´Ù.

¶Ç ÇÑ°¡Áö Â÷ÀÌÁ¡Àº  packet, vFrame, aFrame ÀÌ Àü¿ª º¯¼ö°¡ ¾Æ´Ñ Áö¿ª º¯¼ö°¡ µÇ¾ú´Ù´Â Á¡ÀÌ´Ù. ´Ù¸¥ Á¤º¸¿Í´Â ´Þ¸® ÀÌ º¯¼ö´Â ·çÇÁ ³»¿¡¼­ ÆÐŶ, ÇÁ·¹ÀÓÀ» ¹Þ´Â ¿ëµµ·Î »ç¿ëµÇ¹Ç·Î Áö¿ª º¯¼ö¿©µµ »ó°ü¾ø°í ½º·¹µå ºÐ¸®½Ã ½º·¹µå¿¡ ¼Ò¼ÓµÇ¾î¾ß Çϱ⠶§¹®¿¡ ¹Ì¸® ºÐ¸®ÇØ µÎ¾ú´Ù.

´Ü, Àü¿ª º¯¼öÀÏ ¶§´Â Ç×»ó 0À¸·Î ÃʱâÈ­µÇÁö¸¸ Áö¿ª º¯¼öÀÏ °æ¿ì´Â ±×·¸Áö ¾ÊÀ¸¹Ç·Î ¸í½ÃÀûÀ¸·Î ¸ðµç ¸â¹ö¸¦ 0À¸·Î ÃʱâÈ­ÇØ¾ß ÇÑ´Ù. ƯÈ÷ ÇÁ·¹ÀÓÀÇ °æ¿ì ¹Ýº¹ÀûÀ¸·Î ÀÐÀ» ¶§ ¾îµð±îÁö Àоú´ÂÁö ¸â¹ö¿¡ ±â¾ï½ÃÄÑ ³õ±â ¶§¹®¿¡ ¾²·¹±â°¡ µé¾î ÀÖÀ¸¸é Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.