2-4.½ºÆ®¸² ã±â

µ¿¿µ»óÀº ÆÄÀÏ Æ÷¸ËÀ̶ó±âº¸´Ù´Â ½ºÆ®¸²ÀÇ ÁýÇÕÀ¸·Î ±¸¼ºµÈ ÄÁÅ×À̳ÊÀÌ´Ù. ½ºÆ®¸²Àº ¿¬¼ÓÀûÀÎ ¹ÙÀÌÆ®¸¦ ½Ã°£¼øÀ¸·Î ÀúÀåÇØ ³õÀº °ÍÀÌ´Ù. º¸ÅëÀº ºñµð¿À, ¿Àµð¿À·Î ±¸¼ºµÈ 2°³ÀÇ ½ºÆ®¸²À» °¡Áø´Ù.

ºñµð¿À ½ºÆ®¸²¿¡´Â ½Ã°£ È帧º°·Î »çÁøÀÌ ¿¬¼ÓÀûÀ¸·Î ÀúÀåµÇ¾î ÀÖ°í ¿Àµð¿À ½ºÆ®¸²¿¡´Â »ç¿îµå »ùÇÃÀÌ µé¾î ÀÖ´Ù. ±×¸²À» ¼ø¼­´ë·Î º¸¿© ÁÖ¸ç »ç¿îµå¸¦ ¿¬ÁÖÇÏ¸é µ¿¿µ»óÀÌ Àç»ýµÈ´Ù.

¿µÈ­´Â °¢±¹ ¾ð¾îº°·Î ¿Àµð·Î ½ºÆ®¸² ¿©·¯ °³¸¦ Æ÷ÇÔÇÏ´Â °æ¿ìµµ ÀÖ°í ÀÚ¸·À̳ª ±× ¿ÜÀÇ ½ºÆ®¸²À» °¡Áö±âµµ ÇÑ´Ù. ½ºÆ®¸²ÀÌ ¸î °³³ª µé¾î ÀÖ´ÂÁö´Â Æ÷¸Ë ÄÁÅؽºÆ®ÀÇ nb_streams ¸â¹ö·Î Á¶»çÇÏ¸ç °¢ ½ºÆ®¸²Àº streams ¸â¹ö¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.

½ºÆ®¸²À» ÀÐÀ¸·Á¸é ¸ÕÀú ¾î¶² ½ºÆ®¸²ÀÌ streams ¹è¿­ÀÇ ¾îµð¿¡ µé¾î ÀÖ´ÂÁö ÷ÀÚ¸¦ ã¾Æ¾ß ÇÑ´Ù. Åë»ó 0¹øÀÌ ºñµð¿ÀÀÌ°í 1¹øÀÌ ¿Àµð¿ÀÀÌÁö¸¸ ²À ±×·± °ÍÀº ¾Æ´Ï´Ù. streams ¹è¿­À» ¼øȸÇϸç codecpar->codec_type ¸â¹ö¸¦ ÀÐ¾î º¸¸é ¿Àµð¿À ½ºÆ®¸²ÀÎÁö, ºñµð¿À ½ºÆ®¸²ÀÎÁö ¾Ë ¼ö ÀÖ´Ù.

½ºÆ®¸²¿¡´Â ¿©·¯ °¡Áö º¹ÀâÇÑ Á¤º¸°¡ µé¾î ÀÖÀ¸¸ç ÀÌ Á¤º¸¸¦ Àоî Àç»ýÇÑ´Ù. ³»ºÎ ±¸Á¶°¡ ±²ÀåÈ÷ º¹ÀâÇÏ´Ï ´ÙÀ½ Ç׿¡¼­ ÀÚ¼¼È÷ ¿¬±¸ÇØ º¸ÀÚ. ´Ü¼øÈ÷ ½ºÆ®¸²ÀÇ Á¤º¸¸¦ Á¶»ç¸¸ ÇØ º¸°í ½Í´Ù¸é ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void av_dump_format(AVFormatContext *ic, int index, const char *url, int   is_output)

 

Æ÷¸Ë ÄÁÅؽºÆ® ÇÚµé°ú ½ºÆ®¸²ÀÇ Ã·ÀÚ, ÆÄÀϸíÀ» Àü´ÞÇÑ´Ù. ¸¶Áö¸· Àμö´Â ÀÔ·Â¿ë ½ºÆ®¸²À̸é 0, Ãâ·Â¿ë ½ºÆ®¸²À̸é 1ÀÌ´Ù. Àç»ýÇÒ ¶§´Â ½ºÆ®¸²¿¡¼­ Á¤º¸¸¦ ÀÐÀ¸¹Ç·Î ÀԷ¿ëÀ̸ç ÀÎÄÚµùÇÒ ¶§´Â Ãâ·Â¿ëÀÌ´Ù. ºñµð¿À, ¿Àµð¿À ½ºÆ®¸²À» ã¾Æ Á¤º¸¸¦ Ãâ·ÂÇØ º¸ÀÚ.

 

AVFormatContext* fmtCtx;

int vidx = -1, aidx = -1;

 

int main(void) {

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

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

        avformat_find_stream_info(fmtCtx, NULL);

 

        for (unsigned i = 0; i < fmtCtx->nb_streams; i++) {

                   if (fmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {

                              vidx = i;

                   }

                   if (fmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {

                              aidx = i;

                   }

        }

        printf("video = %d¹ø, audio = %d¹ø\n\n", vidx, aidx);

 

        av_dump_format(fmtCtx, vidx, "c:\\mpstudy\\fire.avi", 0);

 

        avformat_close_input(&fmtCtx);

        return 0;

}

video = 0¹ø, audio = 1¹ø

 

Input #0, avi, from 'c:\mpstudy\fire.avi':

  Metadata:

    album           : NV CS 103

    encoder         : Lavf58.20.100

  Duration: 00:00:10.18, start: 0.000000, bitrate: 1074 kb/s

    Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 1053 kb/s, 29.97 fps, 29.97 tbr, 29.97 tbn, 30k tbc

    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 8000 Hz, mono, fltp, 8 kb/s

 

Æ÷¸Ë ÄÁÅؽºÆ®¸¦ ¿¬ÈÄ nb_streams±îÁö ·çÇÁ¸¦ µ¹¸ç °¢ ½ºÆ®¸²ÀÇ Å¸ÀÔÀ» Á¶»çÇÑ´Ù. ºñµð¿ÀÀ̸é vidx¿¡ ÷ÀÚ¸¦ ´ëÀÔÇÏ°í ¿Àµð¿ÀÀ̸é aidx¿¡ ÷ÀÚ¸¦ ´ëÀÔÇÏ¿© µÎ ½ºÆ®¸²À» ã´Â´Ù. Åë»ó ºñµð¿À 0¹ø, ¿Àµð¿À 1¹øÀÌ´Ù.

°Ë»öÇÑ ½ºÆ®¸²¿¡ ´ëÇØ Á¶»çÇÏ¸é ¾ÆÁÖ º¹ÀâÇÑ Á¤º¸°¡ Ãâ·ÂµÇ´Âµ¥ ºñµð¿À¸¸ Á¶»çÇصµ °ü·Ã ¿Àµð¿À Á¤º¸±îÁö °°ÀÌ ³ª¿Â´Ù. ºñµð¿À ±æÀÌ´Â 10.18ÃÊÀÌ°í mpeg4 ÄÚµ¦À¸·Î ¾ÐÃàµÇ¾î ÀÖÀ¸¸ç »ö»ó Æ÷¸ËÀº yuv420pÀÌ°í Å©±â´Â 640 * 480ÀÌ´Ù. ¿Àµð¿À´Â mp3 Æ÷¸ËÀ̸ç 8K ¸ð³ëÀÌ´Ù.

ÇÑ Å¸ÀÔ¿¡ ´ëÇØ ¿©·¯ °³ÀÇ ½ºÆ®¸²ÀÌ ÀÖ´Â °æ¿ì ¾î¶² ½ºÆ®¸²ÀÌ ÃÖÀûÀÎÁö ã¾Æ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î À½¼ºÀÌ Çѱ¹¾î¿Í ¿µ¾î µÎ °³·Î ³ìÀ½µÇ¾î ÀÖÀ¸¸é ½ÃûÀÚ¿¡ µû¶ó ¸Â´Â À½¼ºÀ» °ñ¶ó Áà¾ß ÇÑ´Ù. ÀÌ ÀÛ¾÷À» Á÷Á¢ Çϱ⠱ÍÂúÀ¸¸é ¼øȸÇÒ ÇÊ¿ä ¾øÀÌ ´ÙÀ½ ÇÔ¼ö·Î ÃÖÀû ½ºÆ®¸²À» ã´Â´Ù.

 

int av_find_best_stream         (AVFormatContext *ic,enum AVMediaType type,int wanted_stream_nb, int related_stream, AVCodec ** decoder_ret, int flags)       

 

ÇÚµé°ú ½ºÆ®¸² Á¾·ù, ¿øÇÏ´Â ½ºÆ®¸² ¹øÈ£, °ü·Ã ½ºÆ®¸², ÄÚµ¦À» µ¹·Á ¹ÞÀ» º¯¼ö µîÀ» ÁöÁ¤ÇÑ´Ù. ´ëºÎºÐ -1À̳ª NULLÀ» ÁöÁ¤ÇÏ¸é µÈ´Ù. À§ ¿¹Á¦ÀÇ ·çÇÁ¸¦ ´ÙÀ½ ÄÚµå·Î ´ëüÇصµ Àß µ¿ÀÛÇÑ´Ù.

 

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

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

 

ºñµð¿À ½ºÆ®¸²À» ¸ÕÀú ã°í ÀÌ ½ºÆ®¸²°ú °ü·ÃµÈ ¿Àµð¿À ½ºÆ®¸²À» ã´Â´Ù. ½ºÆ®¸²ÀÌ ¾ÆÁÖ ¸¹Àº µ¿¿µ»óÀº Á÷Á¢ °Ë»öÇϰųª »ç¿ëÀÚ¿¡°Ô ¼±ÅÃÇ϶ó°í Çؾ߰ÚÁö¸¸ ´ëºÎºÐÀÇ °æ¿ì ¼øȸÇϸ鼭 ãÀ¸³ª ÃÖÀû°ªÀ» ãÀ¸³ª °°Àº °á°ú°¡ ³ª¿Â´Ù.