À§ ¿¹Á¦´Â ¾ÐÃàÀ» Ç®°í »ç¿ëÇÏ´Â ÁÖ¿ä È帧¸¸ »ìÆì º¸±â À§ÇØ ÆÄÀÏÀ» ¿ ¶§ ¿Ü¿¡´Â ¿¡·¯ 󸮸¦ »ý·«Çß´Ù. ¿¡·¯ ó¸® Äڵ尡 µé¾î°¡¸é º¹ÀâÇØÁö´Ï »ùÇà µ¿¿µ»óÀÎ 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À¸·Î ÃʱâÈÇØ¾ß ÇÑ´Ù. ƯÈ÷ ÇÁ·¹ÀÓÀÇ °æ¿ì ¹Ýº¹ÀûÀ¸·Î ÀÐÀ» ¶§ ¾îµð±îÁö Àоú´ÂÁö ¸â¹ö¿¡ ±â¾ï½ÃÄÑ ³õ±â ¶§¹®¿¡ ¾²·¹±â°¡ µé¾î ÀÖÀ¸¸é
Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.