· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
sleepbysleep

life, space and everything


Email: sleepbysleep at hanmail.net

Debian Firewalls -- The Firewall

from http://www.cyberdogtech.com/firewalls/tutorial.php?page=fw
Copyright © 2006 Matt LaPlante. All rights reserved.
¸®´ª½º Ä¿³Î 2.6Àº iptablesÀ» ¹æÈ­º®±â´ÉÀ¸·Î Á¦°øÇÏ°í ÀÖ´Ù. iptables¿¡ °üÇÑ ´õ ¸¹Àº Á¤º¸´Â http://www.netfilter.orgÀ» º¸¶ó. iptablesÀº ³î¶ö¸¸ÇÒ Á¤µµ·Î °ß°íÇÏ°í ½Ç¿ëÀûÀÎ ¹æÈ­º® ÆÐÅ°ÁöÀÌ´Ù. ±×¸®°í ¿ì¸® ±â°èÀÇ ¹æÈ­º®°ú ¶ó¿ìÆà ±â´É ¸ðµÎ릐 ÇÙ½ÉÀ» ÀÌ·ê°ÍÀÌ´Ù. iptablesÀº ÃÖ¼Ò»ç¾ç µ¥ºñ¾È ¼³Ä¡½Ã¿¡ ±âº»À¸·Î ¼³Ä¡µÈ´Ù. ±×·¡¼­ ´õÀÌ»óÀÇ ¼³Ä¡´Â ÇÊ¿ä ¾ø´Ù.

iptablesÀÇ Àü½ÅÀÎ ipchainsµµ ±âº»ÀûÀ¸·Î ¼³Ä¡µÇÁö¸¸ ¿ì¸® ½Ã½ºÅÛ¿¡´Â ÇÊ¿äÇÏÁö ¾Ê´Ù. ³­ °£°áÇÏ°í Á¤µ·µÈ »óŸ¦ À¯ÁöÇϱâ À§Çؼ­ Áö¿ï°ÍÀ» ÃßõÇÑ´Ù.
Firewall:~# apt-get remove ipchains 
iptables´Â ³î¶öÁ¤µµ·Î ¸·°­ÇÏÁö¸¸ ºÒÇàÈ÷µµ ±× ÆÄ¿ö´Â ´ë°¡¸¦ ÁöºÒÇØ¾ß »ý±ä´Ù. ...À̸§ÇÏ¿© ¼³Á¤. ±â´ÉÀûÀ¸·Î ÀÏÀÏÀÌ ¼³Á¤ÇÒ ¼ö ÀÖÁö¸¸, iptablesÀÇ ¼³Á¤Àº »ç¶÷ÀÌ ÀÐÁö ¸øÇÑ´Ù. °£´ÜÈ÷ ¸»Çؼ­ ¸Å¿ì º¹ÀâÇÏ°í »¡¸® ÁöÄ¡°Ô ¸¸µé ¼ö ÀÖ´Ù. ´ÙÇàÈ÷µµ ¿ì¸®´Â shorewallÀ̶ó´Â ÇÁ·Î±×·¥ Çü½Ä¿¡¼­ ÇØ´äÀ» ãÀ» ¼ö ÀÖ´Ù. shorewall Àº Tom Eastep¿¡ ÀÇÇؼ­ ¾²¿©Á³°í http://shorewall.sourceforge.net¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¿ì¸®µµ shorewallÀ» À§ÇÑ µ¥ºñ¾È ÆÐÅ°Áö¸¦ ¹Þ´Â´Ù. ±×·¡¼­ ÀÏÀÏÀÌ ´Ù¿î·ÎµåÇÏ°í ¼³Ä¡ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ½ÃÀÛÇϱâ À§Çؼ­ shorewall package¸¦ ¼³Ä¡Çϱâ À§Çؼ­ apt-getÀ» ÀÌ¿ëÇÏÀÚ.
Firewall:~# apt-get install shorewall
ÁÖÀÇ¿ä¸Á: ¼Ò°³¿¡¼­ ¾ð±ÞÇѵ¥·Î, ÀÌ µàÅ丮¾óÀº µ¥ºñ¾È 3.1"Sarge"½Ã½ºÅÛ¿¡ ±â¹ÝÇÑ´Ù. ¸ðµç ¸®´ª½º ¿ÀÆÛ·¹ÀÌÆà ½Ã½ºÅÛÀº ´Ù¸¥ ÆÐÅ°Áö ¼Â°ú ¸±¸®Áî Áֱ⸦ »ç¿ëÇÑ´Ù. (ÆÐÅ°Áö À̸§ÀÌ ºñ·Ï °°À»Áö¶óµµ) ÀÌ°ÍÀº µ¥ºñ¾È ±â¹ÝÀÇ ¿ìºÐÅõµµ¿¡µµ ÇØ´çÇÑ´Ù. ÀÌ°Ç ´Ù¸¥ ¿ÀÆÛ·¹ÀÌÆà ½Ã½ºÅÛÀ» »ç¿ëÇÑ´Ù¸é ´Ù¸¥ ¼ÒÇÁÆ®¿þ¾î ¹öÀüÀ» »ç¿ëÇÒÁöµµ ¸ð¸¥´Ù´Â°É ÀǹÌÇÑ´Ù. À̰Ͷ§¹®¿¡ Æ©Å丮¾ó ¿¹Á¦´Â ¸»ÇÑ´ë·Î ÀÛµ¿ÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ¿©±â¿¡ ÀÖ´Â ¿¹Á¦µéÀº ÇöÀç µ¥ºñ¾È stable ¹öÀü¿¡¼­ shorewall 2.2ÀÇ ÀÛµ¿À» °¡Á¤ÇÑ´Ù. ¸¸¾à ´ç½ÅÀÇ ¹èÆ÷ÆÇÀÌ ´Ù¸¥ ¹öÀüÀ̶ó¸é, ´ç½ÅÀº Á¦Ç° ¹®¼­¸¦ Àо ¿¹Á¦µéÀ» ¹Ù²Ü ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
À̽ÃÁ¡¿¡¼­ apt´Â shorewall¿¡ ±¸¼ÓµÇ´Â 2°³ÀÇ Ãß°¡ÀûÀÎ ÆÐÅ°Áö¸¦ ¼³Ä¡ÇØ¾ß ÇÑ´Ù°í ¸»¸»ÇÒÁö ¸ð¸¥´Ù. ÀÌ°Ç Á¤»óÀÌ°í ´ç½ÅÀº ¸ðµç°ÍÀ» ¼³Ä¡Çϵµ·Ï ÆÐÅ°Áö ¼³Á¤À» ½Â¶ôÇؾßÇÑ´Ù. "Á¦¾ÈµÈ"ÆÐÅ°Áöµé¿¡ ´ëÇؼ­ °ÆÁ¤ÇÏÁö ¸»¾Æ¶ó. ¿ì¸®´Â ±×°ÍÀÌ ÇÊ¿äÇÏÁö ¾Ê´Ù.
Ãß°¡ÀûÀÎ ÁÖÀÇ! - shorewall
iptables ¼³Á¤ÀÇ ¹®Á¦´Â »õ·Î¿î°ÍÀÌ ¾ø°í ¸ðµç ÀÛ¾÷À» ¼öÇàÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î ¹®Á¦¸¦ ÇØ°áÇϴµ¥ ÇÑ°¡Áö ÀÌ»óÀÇ ¹æ¹ýÀÌ ÀÖ´Ù. ÀÌ Æ©Å丮¾óÀº ±× µûºÐÇÑ ÀÛ¾÷À» Çϴµ¥ shorewallÀ» »ç¿ëÇÏÁö¸¸ °°Àº ÀÛ¾÷À» ÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥µî ¿©±âÀú±â¿¡ ÀÖ´Ù. ´ë½Å ¸¹ÀÌ »ç¿ëÇÏ´Â °ÍÀÌ FireHOLÀÌ´Ù (http://firehol.sourceforge.net). ¸¸¾à shorewallÀÌ ´ç½ÅÀÇ º¸Æ®¸¦ ¶°¿À¸£Áö ¸øÇϵµ·Ï ÇÑ´Ù¸é ´ëü¹°µéÀº Ç×»ó ÀÖ´Ù.
ÁøÇàÇϱâÀü¿¡ µÎ°¡ÁöÀÇ °øÅëµÈ À߸øµÈ °³³äµéÀ» È®½ÇÈ÷ÇÏÀÚ: shorewallÀº ¹æÈ­º®ÀÌ ¾Æ´Ï´Ù. ±×¸®°í »ç½Ç ÀÌ°Ç ¾îÇø®ÄÉÀ̼ÇÁ¶Â÷µµ ¾Æ´Ï´Ù. ÇÁ·Î±×·¥À̳ª µ¥¸óÀÇ °øÅëµÈ °³³äÀº °è¼Ó ¼öÇàÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÁß Çϳª´Ù. ÀÌ°ÍÀº ShorewallÀÇ °æ¿ì¿¡ ¸ÂÁö ¾Ê´Ù. ´ë½Å ShorewallÀº ½ÇÁ¦ Çѹø ¼öÇàÇÏ°í ³¡¸¶Ä¡´Â ±×Á® ¸Å¿ì Å« ±Ô¸ðÀÇ script¸ðÀ½ÀÌ´Ù. Shorewall ±× ÀÚü´Â ¾î¶² ¹æÈ­º® ÀÛ¾÷µµ ÇÏÁö ¸øÇÑ´Ù; ´Ü¼øÈ÷ ´ç½ÅÀÇ ¿ä±¸¿¡ ¸Â°Ô iptablesÀ» ¼³Á¤ÇÏ°í ³¡¸¶Ä£´Ù. ÀÌÁ¦ºÎÅÍ ¼³Á¤¿¡ µé¾î°¡ÀÚ. ´ç½ÅÀº ¾Æ¸¶µµ Shorewall ¼³Ä¡ ¸¶Áö¸·¿¡ ´ç½Å¿¡°Ô ¾Ë·ÁÁØ ÀÌ ÇÁ·Î±×·¥Àº /etc/default/shorewall ÆÄÀÏÀ» º¯°æÇÏÁö ¾ÊÀ¸¸é ½ÃÀÛµÇÁö ¾ÊÀ» °ÍÀÌ´Ù¶ó´Â °æ°í ¸Þ½ÃÁö¿¡ ÁÖÀÇ ÇÑ´Ù. ±×·³ °¡º¸ÀÚ:
Firewall:~# nano -w /etc/default/shorewall
Áö±ÝÀº ±×Àú startup = 0À» startup = 1¹Ù²Ù°í ÀúÀåÇÏ°í ³ª¿ÀÀÚ Shorewall ¼³Á¤ ÆÄÀϵéÀº µÎ±ºµ¥ Àå¼Ò¿¡ ÀúÀåµÈ´Ù: /etc/shorewall Àº ¸ðµç ÇÁ·Î±×·¥ ¼³Á¤ÆÄÀϵéÀ» ÀúÀåÇÏ°í /usr/share/shorewallÀ» Áö¿ø ÆÄÀÏ°ú µ¿ÀÛÆÄÀϵéÀ» ÀúÀåÇÑ´Ù. ShorewallÀÇ µ¥ºñ¾È ÆÐÅ°Áö ¹öÀü¿¡¼­´Â /etc/shorewallÀº ºñ¿öÀÖ°ïÇÑ´Ù. ´ÙÇàÈ÷ ¿ì¸®´Â /usr/share/doc/shorewall/default-config¿¡ ±âº»ÀûÀÎ ¼³Á¤ÆÄÀÏÀ» ÇÔ²² Á¦°øÇÏ¿´´Ù. ½ÇÁ¦ÀûÀ¸·Î shorewallÀÌ µ¿ÀÛÇϱâÀ§ÇÑ À̼³Á¤ÆÄÀϵéÀ» »ç¿ëÇϱ⸸ÇÏ¸é µÇ±â ¶§¹®¿¡ ÇؾßÇÒ Ã¹¹ø° ÀÏÀº À̰͵éÀ» /etc/shorewall¿¡ º¹»çÇÏ´Â °Í »ÓÀÌ´Ù.
Firewall:~# cp /usr/share/doc/shorewall/default-config/* /etc/shorewall/
±×·³ ¿ì¸®ÀÇ /etc/sharewallµð·ºÅ丮´Â ¸ðµç ¼³Á¤ÆÄÀϵéÀÇ ±âº»ÀûÀÎ º¹»çº»µé·Î ä¿öÁú °ÍÀÌ´Ù. ´ÙÀ½ ¿ì¸®´Â ¹æÈ­º®À» ±âº»ÀûÀÎ µ¿ÀÛ ¸í·É¿¡ µû¸£°Ô Çϱâ À§Çؼ­ ¸î°³ ¹Ù²Ù¾î ÁÙ°ÍÀÌ ÀÖ´Ù. ³ª´Â ´ÜÁö ¹æÈ­º®ÀÌ µ¿ÀÛÇϱâ À§Çؼ­ ÇÊ¿äÇÑ ±âº»ÀûÀÎ ¼³Á¤µé¸¸ ´Ù·ê °ÍÀÌ´Ù. °¢ ´Ü°è¿¡¼­ ÁøÂ¥·Î ¹«¾ùÀ» ÇÏ´ÂÁö ¿Ïº®È÷ ÀÌÇØÇϱâ À§Çؼ­ °¢ ¼³Á¤ ÆÄÀÏÀÇ ¹®¼­µéÀ» Àб⠹ٶõ´Ù. ¸ÕÀú ¿ì¸®ÀÇ ³×Æ®¿öÅ© "zones"À» Ãß°¡ÇÑ´Ù. ShorewallÀº ¿ì¸®ÀÇ ¶ó¿ìÆ®µÈ ³×Å©¿öÅ©ÀÇ ´Ù¸¥ ºÎºÐµéÀ» Á¤ÀÇÇϱâ À§Çؼ­ zonesÀ̶ó´Â °ÍÀ» »ç¿ëÇÑ´Ù. ¿ì¸®ÀÇ °£´ÜÇÑ ¼³Á¤Àº µÎ°³ÀÌ zones¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.


Using libavformat and libavcode: An Update


from http://www.inb.uni-luebeck.de/~boehme/libavcodec_update.html

Martin Bohme (boehme@inb.uni-luebeckREMOVETHIS.de)

2004³â 7¿ù 21ÀÏ

°»½Å (2005³â 4¿ù 26ÀÏ): ÇÑ µ¶ÀÚ°¡ Kanotix(Debian ÆÄ»ý¹°ÁßÀÇ ÇϳªÀÎ)¿Í Debian¿¡¼­ ¿¹Á¦ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ´Â Çϱâ À§Çؼ­ avcodec.h¿Í avformat.h¸¦ À§ÇÑ include µð·ºÅ丮´Â ´ÙÀ½°ú °°ÀÌ "ffmpeg"À» ¾Õ¿¡ Ãß°¡ÇØÁÖ¾î¾ß¸¸ÇÑ´Ù.

#include <ffmpeg/avcodec.h>
#include <ffmpeg/avformat.h>

¶ÇÇÑ, libdts ¶óÀ̺귯¸®´Â ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÒ¶§ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

g++ -o avcodec_sample.0.4.9 avcodec_sample.0.4.9.cpp -lavformat -lavcodec -ldts -lz
¸î ´ÞÀü¿¡ ³ª´Â ffmpeg¿Í ¹­¿©Á® ÀÖ´Â libavcodec°ú libavformat ¶óÀ̺귯¸®ÀÇ »ç¿ë¿¡ ´ëÇÑ ±ÛÀ» ¼¹´Ù. ±× ÀÌÈÄ·Î ³ª´Â ¼ö¸¹Àº Á¶¾ðµéÀ» ¹Þ¾Ò´Ù. ±×¸®°í ffmpeg(0.4.9-pre1)ÀÇ »õ·Î¿î prelease ¹öÀüÀÌ ÃÖ±Ù¿¡ »ç¿ë°¡´ÉÇØ Á³´Ù. (ºñµð¿À ÆÄÀÏ Å½»ö, »õ·Î¿î ÆÄÀÏ Æ÷¸ä, ±×¸®°í ºñµð¿À ÇÁ·¹ÀÓ Àб⿡ ´Ü¼øÈ­µÈ ÀÎÅÍÆäÀ̽º¸¦ Æ÷ÇÔÇÏ´Â) ÀÌ·¯ÇÑ º¯È­µéÀº Çѵ¿¾È CVS¿¡¼­ ÀÌ·ç¾î Á³´Ù. ±×·¯³ª Áö±ÝÀº release¿¡¼­ ±×µéÀ» ã¾Æ º¼¼ö Àִ ù¹ø° ¼ø°£ÀÌ´Ù. (ffmpegÀÇ CVS¹öÀüÀ» ½ÀµæÇϱâÀ§ÇÑ ¿À·£ ½Ã°£ÀÇ °á°ú¹°À» °øÀ¯ÇÑ °Í¿¡ ´ëÇؼ­ Silviu Minut¿¡ °¨»çµå¸°´Ù. - ffmpeg Á¤º¸¿Í µ¥¸ð ÇÁ·Î±×·¥À¸·Î ä¿öÁø ±×ÀÇ ÆäÀÌÁö´Â ¿©±â¿¡(http://www.cse.msu.edu/~minutsil/linux.html))ÀÌ ±Û¿¡¼­, ³ª´Â ´ÜÁö Àü¹öÀüÀÇ release(0.4.8)°ú »õ·Î¿î ¹öÀü»çÀÌÀÇ ´Ù¸¥ºÎºÐ¿¡ ´ëÇؼ­ ¾ð±ÞÇÒ°ÍÀÌ´Ù. ±×·¡¼­ ¸¸¾à ¿©·¯ºÐµéÀÌ libavformat / libavcodecÀÌ »õ·Ó´Ù¸é original articleÀ» ¸ÕÀú ÀÐ¾î º¸±â¸¦ ±ÇÇÑ´Ù.¸ÕÀú, »õ·Î¿î releaseÀÇ ÄÄÆÄÀÏ¿¡ ´ëÇÑ °ÍÀÌ´Ù. ³ªÀÇ ÄÄÇ»ÅÍ(gcc 3.3.1 on SuSE)¿¡¼­ ¼Ò½ºÆÄÀÏ ffv1.c¸¦ ÄÄÆÄÀÏ ÇÏ´Â µ¿¾È ³»ºÎ ÄÄÆÄÀÏ·¯ ¿¡·¯°¡ ¹ß»ýÇß´Ù. ³ª´Â ÀÌ Æ¯º°ÇÑ ¹öÀüÀÇ gcc°¡ ¾à°£ À¯º°³ª´Ù°í ÀǽÉÇÑ´Ù. - OpenCVÄÄÆÄÀÏ ÇÒ¶§µµ ³ª¿¡°Ô ¶È°°Àº »óȲÀÌ ÀϾ´Ù. - ±×·¯³ª ¾Æ¹«Æ° °¡Àå ºü¸¥ ¹æ¹ýÀº optimization¾øÀÌ ÀÌ ÆÄÀÏÀ» ÄÄÆÄÀÏ ÇÏ´Â °ÍÀÌ´Ù. ¸Ç óÀ½ ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÑ ¹æ¹ýÀº make¸¦ ½ÇÇàÇÏ°í, ºôµå°úÁ¤ÀÌ ÄÄÆÄÀÏ ¿¡·¯¸¦ ¹ß»ýÇÒ¶§ libavcodec ÇϺΠµð·ºÅ丮·Î °æ·Î¸¦ º¯°æÇÏ°í, (ffv1.cÀÌ ÀÌ°÷¿¡ Àֱ⶧¹®¿¡) ¿©·¯ºÐÀÇ Å͹̳¯ À©µµ¿ì·ÎºÎÅÍ ffv1.c¸¦ ÄÄÆÄÀÏ Çϱâ À§ÇÑ gcc Ä¿¸àµå¸¦ º¹»çÇØ ºÙ¿© ³Ö°í, "-O3" ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡¸¦ Á¦°ÅÇÑ´Ù. ±×¸®°í ³ª¼­ ±× ³ª¸ÓÁö Ä¿¸Çµå¸¦ ÀÌ¿ëÇؼ­ gcc¸¦ ½ÇÇàÇÑ´Ù. ±× ÀÌÈÄ¿¡ ¿©·¯ºÐµéÀº ffmpeg µð·ºÅ丮·Î µÇµ¹¾Æ °¡¼­ make¸¦ ´Ù½Ã ¼öÇàÇÒ ¼ö ÀÖ°í ¾Æ¸¶µµ ¿Ïº®ÇÑ ºôµå¸¦ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

What's New? ±×·³ ¹«¾ùÀÌ »õ·Î¿ö Áø°Ç°¡? ÇÁ·Î±×·¡¸ÓÀÇ ÀÔÀå¿¡¼­ º¸¸é, °¡Àå Å« º¯È­´Â ¾Æ¸¶µµ ºñµð¿À ÆÄÀÏ¿¡¼­ °³°³ÀÇ ºñµð¿À ÇÁ·¡ÀÓÀ» Àд ÀÎÅÍÆäÀ̽º°¡ ´Ü¼øÈ­ µÈ°ÍÀÌ´Ù. ffmpeg 0.4.8°ú ±× ÀÌÀü¿¡¼­´Â µ¥ÀÌŸ´Â av_read_packet()·çƾÀ» ÅëÇؼ­ ºñµð¿À ÆÄÀÏ·Î ºÎÅÍ ÆÐŶÀ¸·Î ÀÐÇôÁø´Ù. º¸Åë, ÇϳªÀÇ ºñµð¿À ÇÁ·¹ÀÓÀ» À§ÇÑ Á¤º¸´Â ¿©·¯°³ÀÇ ÆÐŶ¿¡ °áÃÄ ¿µÇâÀ» ¹ÌÄ£´Ù. ±×¸®°í ÀÌ »óȲÀº µÎ ºñµð¿À ÇÁ·¡ÀÓ»çÀÌÀÇ °æ°è°¡ µÎ ÆÐŶ »çÀÌÀÇ Áß°£¿¡ ¿Ã ¼ö ÀÖ´Ù´Â »ç½Ç·Î ÀÎÇØ Á¡Á¡´õ º¹ÀâÇÏ°Ô µÇ¾îÁ® ¹ö¸°´Ù. °¨»çÇÏ°Ôµµ, ffmpeg 0.4.9´Â av_read_frame() À̶ó°í ÇÏ´Â »õ·Î¿î ·çƾÀ» Á¦°øÇÑ´Ù. ±×¸®°í ±×°Ç ÇÑ ÆÐŶ¿¡ ÀÖ´Â ºñµð¿À ÇÁ·¹ÀÓ¿¡ ´ëÇÑ ¸ðµç µ¥ÀÌŸ¸¦ µÇµ¹·Á ÁØ´Ù. av_read_packet()À» ÅëÇÑ ºñµð¿À µ¥ÀÌŸ¸¦ Àд ÀÌÀüÀÇ ¹æ¹ýÀº ¿©ÀüÈ÷ Áö¿øµÇÁö¸¸ ±×¸® ÁÁÁö ¸øÇÏ´Ù. - ³ª´Â ÁÁÀº º¯È­¶ó°í »ý°¢ÇÑ´Ù. ±×·¡¼­ »õ·Î¿î API¸¦ ÀÌ¿ëÇؼ­ ºñµð¿À µ¥ÀÌŸ¸¦ ¾ï¼¼½ºÇÏ´Â ¹æ¹ýÀ» »ìÆ캸ÀÚ. ³ªÀÇ original article¿¡¼­ (ÀÌÀüÀÇ 0.4.8 API¸¦ ÀÌ¿ëÇÏ´Â) ¸ÞÀÎ µðÄÚµå ·çÇÁ´Â ´ÙÀ½°ú °°´Ù.

while(GetNextFrame(pFormatCtx, pCodecCtx, videoStream, pFrame))
{
    img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, (AVPicture*)pFrame, 
        pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);

    // Process the video frame (save to disk etc.)
    DoSomethingWithTheImage(pFrameRGB);
}

GetNextFrame()Àº ÇϳªÀÇ ºñµð¿À ÇÁ·¡ÀÓÀ» ±¸¼ºÇÏ´Â ¸ðµç ÆÐŶµéÀ» Á¶ÇÕÇÏ´Â °úÁ¤À» ´Ù·ç´Â º¸Á¶ÀûÀÎ ·çƾÀÌ´Ù. »õ·Î¿î API´Â À̰͵éÀ» ¿ì¸®°¡ ¸ÞÀÎ ·çÇÁ¿¡¼­ Á÷Á¢ µ¥ÀÌŸ¸¦ ½ÇÁ¦·Î ÀÐ°í µðÄÚµå ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â Á¡À¸·Î ´Ü¼øÈ­ ÇÑ´Ù.

while(av_read_frame(pFormatCtx, &packet)>=0)
{
    // Is this a packet from the video stream?
    if(packet.stream_index==videoStream)
    {
        // Decode video frame
        avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
            packet.data, packet.size);

        // Did we get a video frame?
        if(frameFinished)
        {
            // Convert the image from its native format to RGB
            img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, 
                (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, 
                pCodecCtx->height);

            // Process the video frame (save to disk etc.)
            DoSomethingWithTheImage(pFrameRGB);
        }
    }

    // Free the packet that was allocated by av_read_frame
    av_free_packet(&packet);
}

óÀ½ º¼¶§´Â ½ÇÁ¦·Î ´õ º¹ÀâÇÏ°Ô µÇ¾îÁø °Íó·³ º¸ÀδÙ. - ±×·¯³ª ÀÌ °¢°¢ÀÇ ÄÚµå´Â GetNextFrame() ·çƾ¿¡ ¼û°ÜÁø °ÍÀ» »ç¿ëÇÏ´Â ºÎºÐÀ» ¼öÇàÇϱ⠶§¹®¿¡ ±×·¸´Ù. (ÆÐŶÀÌ ºñµð¿À ½ºÆ®¸²¿¡ Æ÷ÇԵȴٸé, ÇÁ·¹ÀÓÀ» µðÄÚµùÇÏ°í ÆÐŶÀ» µÇµ¹·ÁÁØ´Ù.) °á±¹, ¿ì¸®´Â GetNextFrame()À» ¿Ïº®ÇÏ°Ô Á¦°ÅÇÒ ¼ö Àֱ⶧¹®¿¡ Á»´õ ½±°Ô µÇ¾îÁ® ¹ö·È´Ù.

³ª´Â ÀÌ »õ·Î¿î API¸¦ ÀÌ¿ëÇؼ­ µ¥¸ð ÇÁ·Î±×·¥À» ¾÷µ¥ÀÌÆ® Çß´Ù. ´Ü¼øÈ÷ ¶óÀÎ ¼ö¸¦ ºñ±³ÇØ º¸¸é(222¶óÀÎÀÇ ÀÌÀü¹öÀü VS. 169¶óÀÎÀÇ »õ·Î¿î ¹öÀü) »õ·Î¿î API °í·ÁÇÒ ¸¸ÇÑ ´Ü¼øÈ­µÇ¾ú´Ù´Â °ÍÀ» º¸¿©ÁØ´Ù.

0.4.9 release¿¡¼­ ¶Ç ÇϳªÀÇ Áß¿äÇÑ Ãß°¡»çÇ×Àº ºñµð¿À ÆÄÀÏ¿¡¼­ ¾î¶² timestamp¸¦ Ž»öÇÏ´Â ´É·ÂÀÌ´Ù. ÀÌ°ÍÀº av_seek_frame()À» ÅëÇؼ­ ¼öÇàµÈ´Ù. ±×¸®°í ±×°Ç »õ°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÑ´Ù. AVFormatContextÀÇ Æ÷ÀÎÅÍ¿Í ½ºÆ®¸² À妽º ±×¸®°í Ž»öÇÒ time stamp. ÀÌ ÇÔ¼ö´Â ±×·³ ÁÖ¾îÁø time stampÀÌÀüÀÇ Ã³À½ key ÇÁ·¹ÀÓÀ¸·Î Ž»öÇÒ °ÍÀÌ´Ù. ÀÌ ¸ðµç°ÍµéÀº ¹®¼­È­ µÇ¾î ÀÖ´Ù. - ³ª´Â av_seek_frame()¸¦ ½ÇÁ¦ÀûÀ¸·Î Å×½ºÆ®ÇÒ ±âȸ¸¦ ¾ÆÁ÷ °®Áö ¸øÇß´Ù. ±×·¡¼­ ¶ÇÇÑ ¾î¶² »ùÇà Äڵ嵵 Á¦°ø ÇÒ ¼ö ¾ø´Ù. ¸¸¾à ¿©·¯ºÐÀÌ av_seek_frame()À» ¼º°øÀûÀ¸·Î »ç¿ëÇß´Ù¸é, ±×¿¡ °üÇؼ­ µé¾úÀ¸¸é ÇÏ´Â ¹Ù¶÷ÀÌ´Ù.

Frame Grabbing (Video4Linux and IEEE1394) Turo Tamaki¾¾´Â libavformat / libavcodecÀ» ÀÌ¿ëÇؼ­ Video4Linux³ª IEEE1394·Î ºÎÅÍ ÇÁ·¡ÀÓ ±×·¡ºùÇÏ´Â ¹æ¹ýÀ» ±¸ÇöÇÏ´Â ¾à°£ÀÇ »ùÇà ÄÚµåµéÀ» º¸³» ¿Ô´Ù. Video4Linux¿¡ ´ëÇؼ± av_open_input_file()À¸·ÎÀÇ ºÐ±â´Â ´ÙÀ½°ú °°ÀÌ modifyµÇ¾î¾ß ÇÑ´Ù.

AVFormatParameters formatParams;
AVInputFormat *iformat;

formatParams.device = "/dev/video0";
formatParams.channel = 0;
formatParams.standard = "ntsc";
formatParams.width = 640;
formatParams.height = 480;
formatParams.frame_rate = 29;
formatParams.frame_rate_base = 1;
filename = "";
iformat = av_find_input_format("video4linux");

av_open_input_file(&ffmpegFormatContext,
                 filename, iformat, 0, &formatParams);

IEEE1394¸¦ À§ÇÑ av_open_input_file()·ÎÀÇ ºÐ±â´Â ´ÙÀ½°ú °°´Ù.

AVFormatParameters formatParams;
AVInputFormat *iformat;

formatParams.device = "/dev/dv1394";
filename = "";
iformat = av_find_input_format("dv1394");

av_open_input_file(&ffmpegFormatContext,
                 filename, iformat, 0, &formatParams);

To be continued... ¸¸¾à ³»°¡ libavformat / libavcodec¿¡ °üÇÑ Èï¹Ì·Î¿î Á¤º¸¸¦ Ãß°¡ÀûÀ¸·Î ¸¸³ª°Ô µÈ´Ù¸é, ¿©±â¿¡ °øÇ¥ÇÒ °èȹÀÌ´Ù. ±×·¡¼­ ¿©·¯ºÐµéÀÌ ¾î¶² ÄÚ¸àÆ®µéÀ» ÀÖ´Ù¸é, ÀÌ ±ÛÀÇ ¸ÇÀ§¿¡ ÀÖ´Â ÁÖ¼Ò·Î ³ª¿¡°Ô Á¢ÃËÇØ Áֱ⠹ٶõ´Ù.

Standard disclaimer: I assume no liability for the correct functioning of the

code and techniques presented in this article.


Using libavformat and libavcodec

From http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html

Martin Bohme (boehme@inb.uni-luebeckREMOVETHIS.de)

2004³â 2¿ù 18ÀÏ

Update (2004/7/22) : ³»°¡ ÃÖÃÊ·Î Á¦°øÇÑ Äڵ尡 ¸Þ¸ð¸® ´©¼öÇö»óÀ»(av_free_packet()À» ½ÇÇàÇÏÁö ¾Ê´Â) °¡Áö°í ÀÖÀ½À» ¹ß°ßÇß´Ù. ³ª´Â ´ä·Ê·Î ´©¼öÇö»óÀ» Á¦°ÅÇÑ ÄÚµå¿Í µ¥¸ð ÇÁ·Î±×·¥À¸·Î °»½ÅÇß´Ù.

Update (2004/7/21) : ffmpeg(0.4.9-pre1)¸¦ »õ·Î°Ô preleaseÇß´Ù. ³ª´Â libavformat/libavcodec APIÀÇ º¯°æ»çÇ×À» ±â¼úÇÑ´Ù.

libavformat°ú libavcodec ¶óÀ̺귯¸®´Â (ffmpeg¿¡ ºÎ¼öÀûÀ¸·Î µû¸£´Â) ¾ÆÁÖ ´Ù¾çÇÑ ºñµð¿À ÆÄÀÏ Æ÷¸äÀ» ´Ù·ç´Â °¡Àå ÁÁÀº ¹æ¹ýÀÌ´Ù. ºÒÇàÀ̵µ, ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥¿¡¼­ ÀÌ ¶óÀ̺귯¸®µéÀ» »ç¿ëÇÒ¶§(Àû¾îµµ ³ª´Â ãÀ» ¼ö°¡ ¾ø¾ú´Ù.) ½ÇÁúÀûÀÎ ¹®¼­°¡ Á¸ÀçÇÑÁö ¾Ê´Â´Ù. ±×¸®°í ¿¹Á¦ ÇÁ·Î±×·¥µéµµ Á¤¸»·Î µµ¿òÀÌ µÇÁö ¾Ê´Â´Ù.

ÀÌ·¯ÇÑ »óȲÀ¸·Î ³»°¡ ÃÖ±Ù ÇÁ·ÎÁ§Æ®¿¡¼­ libavformat/libavcodecÀ» ÀÌ¿ëÇßÀ»¶§ »ç¿ë¹æ¹ýÀ» ã¾Æ³»±â À§Çؼ­ ¾ÆÁÖ ¸¹Àº ½ÃÇà Âø¿À¸¦ °ÅÃÆ´Ù. ¿©±âÀÇ ³»¿ëÀº ³»°¡ ¹è¿î °ÍµéÀÌ´Ù. - ºÎµð ´Ù¸¥ À̵éÀÌ ¶È°°Àº trial-and-errorÀÇ °úÁ¤À» °ÅÄ¡´Â °ÍÀ¸·Î ºÎÅÍ µµ¿òÀÌ µÇ±æ ¹Ù¶õ´Ù. ¶ÇÇÑ ¿©·¯ºÐµéÀÌ ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ´Â ÀÛÀº µ¥¸ðÇÁ·Î±×·¥µéµµ ÀÖ´Ù. ÀÌ ÄÚµå´Â ffmpeg ÀÇ 0.4.8 (³»°¡ À̱ÛÀ» ÀÛ¼ºÇÒ ´ç½ÃÀÇ °¡Àå ÃÖ±Ù¹öÀüÀÎ)¹öÀü¿¡ Æ÷ÇÔµÈ libavformat/libavcodecÀ¸·Î ÇÑ ÀÛ¾÷À» Á¦°øÇÑ´Ù. ¸¸¾à ¿©·¯ºÐµéÀÌ ÀÌ Äڵ带 breakÇÏ´Â ÀÌÈÄÀÇ ¹öÀüÀ» ã´Â ´Ù¸é, ³ª¿¡°Ô ¾Ë·ÁÁÖ±æ ¹Ù¶õ´Ù.

ÀÌ ¹®¼­¿¡¼­ ³ª´Â ´ÜÁö ÆÄÀÏ¿¡¼­ ºñµð¿À ½ºÆ®¸²À» Àд ¹æ¹ýÀ» ´Ù·ê°ÍÀÌ´Ù.: ¿Àµð¿À ½ºÆ®¸²Àº ¾ÆÁÖ ¸¹ÀÌ µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î µ¿ÀÛÇÑ´Ù. ±×·¯³ª ³ª´Â ½ÇÁúÀûÀ¸·Î ±×°ÍµéÀ» »ç¿ëÇÏÁöÀº ¾Ê¾Ò´Ù. ±×·¡¼­ ¾î¶² ¿¹Á¦ ÄÚµåµéµµ Á¦°øÇÒ ¼ö ¾ø´Ù.

¿©·¯ºÐµéÀº µÎ°³ÀÇ ¶óÀ̺귯¸®, libformat°ú libavcodecÀÌ Á¸ÀçÇÏ´Â ÇÏ´ÂÁö ÀǾÆÇØ ÇÑ´Ù. ¸¹Àº ºñµð¿À ÆÄÀÏ Æ÷¸äµéÀº (AVI°¡ º»ÁúÀûÀÎ ¿¹·Î) ¾î¶² ÄÚµ¦ÀÌ ¿Àµð¿À, ºñµð¿À µ¥ÀÌŸ¸¦ ¿£ÄÚµùÇÏ´Â µ¥ »ç¿ëµÇ¾î¾ß ÇÏ´ÂÁö ÀÏÀÏÀÌ ¿­°ÅÇÏÁö ¾Ê´Â´Ù. ±×Á® ¾î¶»°Ô ¿Àµð¿À ºñµð¿À ½ºÆ®¸²ÀÌ (ȤÀº °£È¤ ¸î¸î ¿Àµð¿À ºñµð¿À ½ºÆ®¸²) ÇϳªÀÇ ÆÄÀÏ·Î ÇÕ¼ºµÇ¾î¾ß ÇÏ´ÂÁö¸¦ Á¤ÀÇÇÑ´Ù. ÀÌ°ÍÀº °¡²û ¿©·¯ºÐµéÀÌ AVIÆÄÀÏÀ» ¿­¶§, ¿Ö ±×¸²Àº ¾ø°í ¼Ò¸®¸¸ ³ª¿À°Ô µÇ´Â ÀÌÀ¯´Ù. - ±×°Ç ¿Ã¹Ù¸¥ ºñµð¿À ÄÚµ¦ÀÌ ¿©·¯ºÐÀÇ ½Ã½ºÅÛ¿¡ ÀνºÅç µÇÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. ÀÌ¿Í °°ÀÌ, libavformatÀº ºñµð¿À ÆÄÀÏÀ» ºÐ¼®ÇÏ°í Æ÷ÇÔµÈ ½ºÆ®¸²µéÀ» ±¸ºÐÇÏ´Â °ÍÀ» ´Ù·é´Ù. ±×¸®°í libavcodecÀº °¡°øÇÏÁö ¾ÊÀº ¿Àµð¿À ºñµð¿À ½ºÆ®¸²µéÀ» µðÄÚµùÇϴ°ÍÀ» ´Ù·é´Ù.

Opening a Video File

óÀ½ ÇÒ °ÍµéÀº ¸ÕÀú - ¾î¶»°Ô ºñµð¿À ÆÄÀÏÀ» ¿©´ÂÁö »ìÆ캸°í Æ÷ÇÔµÈ ½ºÆ®¸²µéÀ» ¾ò¾î º¸ÀÚ. ¿ì¸®°¡ óÀ½ ÇØ¾ß ÇÒ°ÍÀº libavformat°ú libavcodecÀ» ÃʱâÈ­ ÇÏ´Â °ÍÀÌ´Ù.

av_register_all();

ÀÌ°ÍÀº Æ÷¸ä°ú ÄÚµ¦À» Æ÷ÇÔÇÏ´Â ÆÄÀÏÀÌ ¿­·ÈÀ» ¶§ ÀÚµ¿ÀûÀ¸·Î »ç¿ëµÇ¾îÁö°Ô Çϱâ À§ÇØ, ¶óÀ̺귯¸®¿¡ ¿¬°üµÈ ¸ðµç À¯¿ëÇÑ ÆÄÀÏ Æ÷¸ä°ú ÄÚµ¦µéÀ» µî·ÏÇÑ´Ù. ¿©·¯ºÐµéÀº ´ÜÁö av_register_all()À» Çѹø ÄÝÇϱ⸸ ÇϸéµÈ´Ù. ¿©·¯ºÐÀÇ startup Äڵ忡 À̰͸¸À¸·Îµµ ÃæºÐÈ÷ ÈÇ·æÇÏ´Ù. ¸¸¾à ¿©·¯ºÐµéÀÌ ¿øÇÑ´Ù¸é, ´ÜÁö ¾î¶² ƯÁ¤ ÆÄÀÏ Æ÷¸ä°ú ÄÚµ¦µé¸¸ µî·ÏÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ÇÏÁö¸¸ º¸Åë ¿©·¯ºÐÀÌ ±×·¸°Ô ÇؾßÇÒ ÀÌÀ¯´Â ¾ø´Ù.

´ÙÀ½Àº, ÆÄÀÏ ¿­±â

AVFormatContext *pFormatCtx;
const char      *filename="myvideo.mpg";

// Open video file
if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0)
    handle_error(); // Couldn't open file

¸¶Áö¸· ¼¼°³ÀÇ ÆĶó¹ÌÅ͵éÀº ÆÄÀÏ Æ÷¸ä, ¹öÆÛ »çÀÌÁî, ±×¸®°í Æ÷¸ä ÆĶó¹ÌÅ͵éÀ» ³ªÅ¸³½´Ù. ±×Àú ´Ü¼øÈ÷ NULLÀ̳ª 0À¸·Î ¸í±âÇÔÀ¸·Î½á libavformatÀÌ Æ÷¸äÀ» ÀÚµ¿À¸·Î ÀνÄÇÏ°í µðÆúÆ® ¹öÆÛ »çÀÌÁ »ç¿ëÇÒ °ÍÀ» ¿äûÇÑ´Ù. ¿©·¯ºÐÀÇ applicationÀ» À§Çؼ± handle_error()¸¦ ÀûÀýÇÑ ¿¡·¯ Çڵ鸵 ÄÚµå·Î ´ëüÇضó.

´ÙÀ½, ÆÄÀÏ¿¡ Æ÷ÇÔµÈ ½ºÆ®¸²¿¡ °üÇÑ Á¤º¸¸¦ ¹Þ±â ¿øÇÑ´Ù.

// Retrieve stream information
if(av_find_stream_info(pFormatCtx)<0)
    handle_error(); // Couldn't find stream information

ÀÌ°ÍÀº AVFormatContextÀÇ streams ¿µ¿ªÀ» À¯¿ëÇÑ Á¤º¸·Î ü¿î´Ù. µð¹ö±ëÀ» µ½±â À§Çؼ­ ÀÌ Á¤º¸¸¦ Ç¥ÁØ ¿¡·¯·Î »ìÆ캼°ÍÀÌ´Ù. ±×·¯³ª ¹°·Ð ¿©·¯ºÐÀº Á¦Ç° application¿¡¼­´Â ÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù.

dump_format(pFormatCtx, 0, filename, false);

introduction¿¡¼­ ¾ð±ÞÇÑ µ¥·Î, ºñµð¿À ½ºÆ®¸²¸¸ ´Ù·ç°í, ¿Àµð¿À ½ºÆ®¸²Àº ´Ù·çÁö ¾ÊÀ» °ÍÀÌ´Ù. ¸í·áÇÏ°í ½±°Ô Çϱâ À§Çؼ­ ´ÜÁö ¸Ç óÀ½ ã°Ô µÇ´Â ºñµð¿À ½ºÆ®¸²À» »ç¿ëÇÑ´Ù.

int            i, videoStream;
AVCodecContext *pCodecCtx;

// Find the first video stream
videoStream=-1;
for(i=0; i<pFormatCtx->nb_streams; i++)
    if(pFormatCtx->streams[i]->codec.codec_type==CODEC_TYPE_VIDEO)
    {
        videoStream=i;
        break;
    }
if(videoStream==-1)
    handle_error(); // Didn't find a video stream

// Get a pointer to the codec context for the video stream
pCodecCtx=&pFormatCtx->streams[videoStream]->codec;

±×·³, ¿©±â¼­ ¿ì¸®´Â ºñµð¿À ½ºÆ®¸²À» À§ÇÑ ÄÚµ¦ context¶ó ºÒ¸®´Â °ÍÀÇ Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù. ±×·¯³ª ¾ÆÁ÷ ½ÇÇàÇÒ ÄÚµ¦À» ã°í ¿­¾î¾ß ÇÑ´Ù.

AVCodec *pCodec;

// Find the decoder for the video stream
pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
if(pCodec==NULL)
    handle_error(); // Codec not found

// Inform the codec that we can handle truncated bitstreams -- i.e.,
// bitstreams where frame boundaries can fall in the middle of packets
if(pCodec->capabilities & CODEC_CAP_TRUNCATED)
    pCodecCtx->flags|=CODEC_FLAG_TRUNCATED;

// Open codec
if(avcodec_open(pCodecCtx, pCodec)<0)
    handle_error(); // Could not open codec

("truncated bitstreams"¿¡ ´ëÇؼ­ ¾Ë°Ú´Â°¡? ±×·³ ¿ì¸®°¡ ÁÖÁöÇÏ´Ù½ÃÇÇ, ºñµð¿À ½ºÆ®¸²¿¡ ÀÖ´Â µ¥ÀÌŸ´Â ÆÐŶµé·Î ³ª´©¾î Áø´Ù. ºñµð¿À ÇÁ·¹ÀÓ´ç µ¥ÀÌŸÀÇ ¾çÀº º¯ÇÒ ¼ö Àֱ⶧¹®¿¡, µÎ ºñµð¿À ÇÁ·¹ÀÓµé »çÀÌÀÇ °æ°è´Â ÆÐŶ°æ°è¿Í ÀÏÄ¡ÇÒ ÇÊ¿ä ¾ø´Ù. ¿©±â¼­, ¿ì¸®´Â ÀÌ »óȲÀ» ´Ù·ê¼ö ÀÖ´Â ÄÚµ¦À» À̾߱âÇÏ°í ÀÖ´Ù.)

AVCodecContext ½ºÆ®·°ÃÄ¿¡ ÀúÀåµÈ Á¤º¸Áß Áß¿äÇÑ ÇÑ ºÎºÐÀº ºñµð¿ÀÀÇ ÇÁ·¹ÀÓ ·¹ÀÌÆ®ÀÌ´Ù. Á¤¼ö°¡ ¾Æ´Ñ ÇÁ·¹ÀÓ ·¹ÀÌÆ®¸¦ Çã¿ëÇϱâ À§Çؼ­ (NTSCÀÇ 29.97fps¿Í °°ÀÌ), ·¹ÀÌÆ®´Â ºÐ¼öÇüÅ·ΠÀúÀåµÈ´Ù. (pCodecCtx->frame_rateÀÎ ºÐÀÚ¿Í pCodecCtx->frame_rate_baseÀÎ ºÐ¸ð¸¦ °®´Â) ¼­·Î ´Ù¸¥ ºñµð¿À ÆÄÀϵéÀ» °®´Â ¶óÀ̺귯¸®¸¦ Å×½ºÆ®ÇÒ¶§, ³ª´Â ¾î¶² ÄÚµ¦µéÀº (ƯÈ÷ ASF°æ¿ì) ÀÌ ºÎºÐÀÌ À߸ø ä¿öÀÖ´ÂÁö¿¡(fram_rate_base°¡ 1000´ë½Å 1À» Æ÷ÇÔÇÑ´Ù) ÁÖÀÇÇß´Ù. ´ÙÀ½ÀÇ ÇØÅ·ÇÑ ¼öÁ¤»çÇ×µéÀº ÀÌ°Í:

// Hack to correct wrong frame rates that seem to be generated by some 
// codecs
if(pCodecCtx->frame_rate>1000 && pCodecCtx->frame_rate_base==1)
    pCodecCtx->frame_rate_base=1000;

¹ö±×°¡ ¾î´À³¯ ¼öÁ¤µÉ¾úÀ»¶§ Á¶Â÷ ÇØ´ç À§Ä¡¿¡ ÀÌ ¼öÁ¤»çÇ×µéÀ» ³²°ÜµÎ¾î¼­ ¹®Á¦°¡ µÇÁö ¸»¾Æ¾ß ÇÑ´Ù. - µå¹°°Ô ºñµð¿À°¡ 1000fpsÀÌ»óÀÇ ÇÁ·¹ÀÓ ·¹ÀÌÆ®µé °®°ïÇÑ´Ù. Çϳª´õ ÇؾßÇÒ °ÍÀÌ ³²¾Æ ÀÖ´Ù. µðÄÚµåµÈ ¿µ»óµéÀ» ÀúÀåÇÒ ºñµð¿À ÇÁ·¹ÀÓÀ» È®º¸Çضó.

AVFrame *pFrame;

pFrame=avcodec_alloc_frame();

±×·³ ÀÌÁ¦ ºñµð¿À µðÄÚµù ÀÛ¾÷À» ½ÃÀÛÇÏÀÚ.

Decoding Video Frames

³»°¡ ÀÌ¹Ì ¾ð±ÞÇÑ´ë·Î, ºñµð¿À ÆÄÀÏÀº ¸î°³ÀÇ ¿Àµð¿À ºñµð¿À ½ºÆ®¸²À» Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÀÌ ½ºÆ®¸²Àº °¢°¢ ƯÁ¤ »çÀÌÁîÀÇ ÆÐŶÀ¸·Î ³ª´©¾î Áø´Ù. ¿ì¸®°¡ ÇÒÀÏÀº ÀÌ ÆÐŶµéÀ» Çϳª¾¿ Çϳª¾¿ libavformatÀ» ÀÌ¿ëÇؼ­ Àаí, ¿ì¸®°¡ ¿øÇÏ´ø ºñµð¿À ½ºÆ®¸²ÀÇ ºÎºÐÀÌ ¾Æ´Ñ °ÍµéÀ» °É·¯ ³»°í, µðÄÚµùÀ» Çϱâ À§Çؼ­ ±×°ÍµéÀ» libavcodecÀ¸·Î ³Ñ°Ü ÁÖ´Â °ÍÀÌ´Ù. ÀÌ°ÍÀ» Çϴµ¥ À־ ¿ì¸®´Â µÎ ÇÁ·¡ÀÓ°£ÀÇ °æ°è°¡ ÆÐŶÀÇ Áß°£¿¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù´Â »ç½Ç¿¡ ÁÖÀÇÇØ¾ß ÇÒ °ÍÀÌ´Ù. »ç¿îµå°¡ º¹ÇÕµÈ °ÍÀº? ´ÙÇàÀ̵µ, ¿ì¸®´Â ·çƾ¿¡ ÀÖ´Â ´ÙÀ½ ºñµð¿À ÇÁ·¹ÀÓÀ» ³Ñ°ÜÁÖ´Â ÀÌ ¸ðµç °úÁ¤µé·Î ¿ä¾àÇÒ ¼ö ÀÖ´Ù.

bool GetNextFrame(AVFormatContext *pFormatCtx, AVCodecContext *pCodecCtx, 
    int videoStream, AVFrame *pFrame)
{
    static AVPacket packet;
    static int      bytesRemaining=0;
    static uint8_t  *rawData;
    static bool     fFirstTime=true;
    int             bytesDecoded;
    int             frameFinished;

    // First time we're called, set packet.data to NULL to indicate it
    // doesn't have to be freed
    if(fFirstTime)
    {
        fFirstTime=false;
        packet.data=NULL;
    }

    // Decode packets until we have decoded a complete frame
    while(true)
    {
        // Work on the current packet until we have decoded all of it
        while(bytesRemaining > 0)
        {
            // Decode the next chunk of data
            bytesDecoded=avcodec_decode_video(pCodecCtx, pFrame,
                &frameFinished, rawData, bytesRemaining);

            // Was there an error?
            if(bytesDecoded < 0)
            {
                fprintf(stderr, "Error while decoding frame\n");
                return false;
            }

            bytesRemaining-=bytesDecoded;
            rawData+=bytesDecoded;

            // Did we finish the current frame? Then we can return
            if(frameFinished)
                return true;
        }

        // Read the next packet, skipping all packets that aren't for this
        // stream
        do
        {
            // Free old packet
            if(packet.data!=NULL)
                av_free_packet(&packet);

            // Read new packet
            if(av_read_packet(pFormatCtx, &packet)<0)
                goto loop_exit;
        } while(packet.stream_index!=videoStream);

        bytesRemaining=packet.size;
        rawData=packet.data;
    }

loop_exit:

    // Decode the rest of the last frame
    bytesDecoded=avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
        rawData, bytesRemaining);

    // Free last packet
    if(packet.data!=NULL)
        av_free_packet(&packet);

    return frameFinished!=0;
}

Áö±Ý, ¿ì¸®°¡ ÇؾßÇÒ ¸ðµç °ÍµéÀº ·çÇÁ¹®¿¡ ÀÖ´Ù. (false¸¦ µÇµ¹·Á ÁÙ¶§±îÁö GetNextFrame()À» ÅëÇؼ­) ±×Àú Çϳª´õ ÁÖÀÇÇØ¾ß ÇÒ °ÍÀº: ´ëºÎºÐÀÇ ÄÚµ¦µéÀÌ YUV 420 Æ÷¸äÀÇ ¿µ»óµéÀ» µÇµ¹·Á ÁØ´Ù. (ÇÑ°³ÀÇ luminance, ÇϳªÀÇ luminance ä³Î¿¡ ¹Ý°³ÀÇ »ùÇÃÀ» °®´Â µÎ°³ÀÇ chrominace ä³Î) ¿©·¯ºÐÀº ºñµð¿À µ¥ÀÌŸ¸¦ ¿øÇÏ´Â ¸ñÀû¿¡ µû¶ó, RGB·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. (ÁÖÀÇ, ºñ·Ï ´ç½ÅÀÌ ¿øÇÏ´ø°ÍµéÀÌ ºñµð¿À µ¥ÀÌŸ¸¦ µð½ºÇ÷¹ÀÌ ÇÏ´Â °ÍÀ̶ó¸é ÇÒ ÇÊ¿ä ¾øÁö¸¸, YUV-to-RGB¿Í Çϵå¿þ¾î¿¡¼­ ½ºÄÉÀϸµÀÛ¾÷À» ÇÏ´Â X11 Xvideo È®ÀåÀ» »ìÆ캸¶ó) ´ÙÇàÀ̵µ, libavcodecÀº img_convertÀÎ º¯È¯ ·çƾÀ» Á¦°øÇÑ´Ù. ÀÌ°ÍÀº ´Ù¾çÇÑ ¿µ»ó Æ÷¸ä»Ó¸¸ ¾Æ´Ï¶ó YUV¿Í RGB»çÀÌÀÇ º¯È¯À» ÇÑ´Ù. ºñµð¿À¸¦ µðÄÚµåÇÏ´Â ·çÇÁ¹®Àº ´ÙÀ½°ú °°´Ù.

while(GetNextFrame(pFormatCtx, pCodecCtx, videoStream, pFrame))
{
    img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, (AVPicture*)pFrame, 
        pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);

    // Process the video frame (save to disk etc.)
    DoSomethingWithTheImage(pFrameRGB);
}

RGB¿µ»óÀÎ (AVFrame *)ÇüÅÂÀÇ pFrameRGBÀº ´ÙÀ½°ú °°ÀÌ È®º¸µÈ´Ù.

AVFrame *pFrameRGB;
int     numBytes;
uint8_t *buffer;

// Allocate an AVFrame structure
pFrameRGB=avcodec_alloc_frame();
if(pFrameRGB==NULL)
    handle_error();

// Determine required buffer size and allocate buffer
numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,
    pCodecCtx->height);
buffer=new uint8_t[numBytes];

// Assign appropriate parts of buffer to image planes in pFrameRGB
avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,
    pCodecCtx->width, pCodecCtx->height);

Cleaning up

ÁÁ½À´Ï´Ù. ¿ì¸®´Â ºñµð¿À¸¦ Àаí ó¸®Çؼ­ Áö±Ý ÇؾßÇÒ °ÍÀº ½º½º·Î clean upÇÏ´Â °ÍÀÌ´Ù.
// Free the RGB image
delete [] buffer;
av_free(pFrameRGB);

// Free the YUV frame
av_free(pFrame);

// Close the codec
avcodec_close(pCodecCtx);

// Close the video file
av_close_input_file(pFormatCtx);

³¡.

Sample Code

ÀÌ ÀÏ·ÃÀÇ Æ÷ÇÔÇÏ´Â »ùÇà ¾îºí¸®ÄÉÀ̼ÇÀº ¿©±â¿¡(http://www.inb.uni-luebeck.de/~boehme/avcodec_sample.cpp) ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ ¾î¶² Ãß°¡ÀûÀÎ ÄÚ¸àÆ®°¡ ÀÖ´Ù¸é, boehme@inb.uni-luebeckREMOVETHIS.de·Î ³ª¿¡°Ô Á¢ÃËÇØ ´Þ¶ó. Standard disclaimer: I assume no liability for the correct functioning of the code and techniques presented in this article.


ASCII Expression under printf-format

\a	"BELL" - i.e. a beep
\b	Backspace 
\f	Form Feed (new page) 
\n	New Line (line feed)
\r	Real carriage return
\t	Tab
\v	Vertical Tab
\\ 	Backslash
\'	Single Quote
\"	Double Quote
\?	Question Mark

Redhat Fedora Core 4 install without CDROM and Floppy

My system is windows XP on toshiba R100. Unfortunately PCMCIA-CDROM booting is not supported. In addition that Floppy installer is not metioned in Redhat. So, using GRUB boot manager, I construct HDD installer like below.
In menu.lst

# This is a sample menu.lst file. You should make some changes to it.
# Added items for installing GRUB [ which is on your DOS drive C: ] to MBR

color black/cyan yellow/cyan
timeout 60
default 0

title DOS/Win9x/Me/NT/2K/XP on (hd0,0)
chainloader (hd0,0)+1
rootnoverify (hd0)

title Redhat Fedora Core 4 install from CDROM (hd0,0)
kernel (hd0,0)/

Distance between point and line

Let point (x, y) and line from (x1, y1) to (x2, y2) then the distance is
D = 

Mysql "Error : Client does not support authentication protocol "

MySQL 5.0 uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older (pre-4.1) clients. If you upgrade the server from 4.1, attempts to connect to it with an older client may fail with the following message:
shell> mysql
Client does not support authentication protocol requested by server; consider upgrading MySQL client

To solve this problem, you should use one of the following approaches:

Upgrade all client programs to use a 4.1.1 or newer client library.

When connecting to the server with a pre-4.1 client program, use an account that still has a pre-4.1-style password.

Reset the password to pre-4.1 style for each user that needs to use a pre-4.1 client program. This can be done using the SET PASSWORD statement and the OLD_PASSWORD() function:
mysql> SET PASSWORD FOR
    -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
Alternatively, use UPDATE and FLUSH PRIVILEGES:
mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')
    -> WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;
Substitute the password you want to use for ¡°newpwd¡± in the preceding examples. MySQL cannot tell you what the original password was, so you'll need to pick a new one.

Gaussian Smoothing Filter

2 dimensional gaussian filter specified by standard deviation, window size and scale. such as
g(x, y) = exp(-(sqr(x/scale) + sqr(y/scale)) / sqr(sigma)) / (2 * PI * sqr(sigma));
Propose two way routines that smooth with gaussian function created by lower bound and scale factor , or lower bound and window size.

libiconv-1.9.1 (cross compile)

1. Extract the iconv library to your working directory.
% tar zxvf libiconv-1.9.1.tar.gz
% cd libiconv-1.9.1

2. Configure the library for your environment.
% ./configure CC=arm-elf-gcc CFLAGS='-DHAVE_SYS_ERRLIST' --prefix=/install_dir --host=arm-elf
only for me
% ./configure CC=arm-elf-gcc CFLAGS='-DHAVE_SYS_ERRLIST' --prefix=/opt/tools-install/arm-elf --host=arm-elf

3. Bulid package
% make
% make install

freetype-2.1.10 (cross compile)

1. Extract the freetype library to your working directory.
% tar zxvf freetype-2.1.10.tar.gz
% cd freetype-2.1.10

2. Configure the library for your environment.
% ./configure --prefix=/install_dir --host=arm-elf
Only for me
% ./configure --prefix=/opt/tools-install/arm-elf --host=arm-elf

3. Bulid package
% make
% make install

Dear sleepbysleep


ID
Password
Join
Man's horizons are bounded by his vision.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2007-08-22 21:56:03
Processing time 0.0123 sec