/***************************************** 示範利用呼叫外部ffmpeg取得webcam影像 *************************************************/ import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ui45 extends JFrame implements ActionListener { Container c; JLabel lab; JButton bot; Image img=null; ImageIcon icon=null; Timer t; java.awt.image.BufferedImage bi=new java.awt.image.BufferedImage(320,240,java.awt.image.BufferedImage.TYPE_INT_RGB); java.io.BufferedInputStream inp; java.io.BufferedOutputStream out; java.io.BufferedInputStream err; byte errtmp[]=new byte[2000]; byte tmp[]=new byte[320*240*3]; int RAW[] = new int[320*240]; int index,more,R,G,B,i,cpt; String ins; Process prc; int flag=0; public ui45() //建構元 { super("呼叫外部ffmpeg連續取得webcam影像"); c=getContentPane(); setSize(640,480); bot=new JButton("開始取影像"); lab=new JLabel(); c.setLayout(new FlowLayout(FlowLayout.CENTER));//設定為流水版面設定 //注意加入元件的順序 c.add(bot); c.add(lab); t=new Timer(100,this); bot.addActionListener(this);//設定自己為bot0按鈕的傾聽者 setVisible(true); } public void paint(Graphics g) //真正的畫圖設定 { super.paint(g);//畫出元件 } public void actionPerformed(ActionEvent e) //按鈕事件的處理方法 { if (e.getSource()==bot) { try { if (flag==0) { prc=Runtime.getRuntime().exec("ffmpeg/bin/ffmpeg.exe -f vfwcap -s 320x240 -r 8 -i 0 -an -pix_fmt rgb24 -f rawvideo - "); /***** String src="ffmpeg/bin/ffmpeg.exe -f vfwcap -s 320x240 -r 8 -i 0 -an -pix_fmt rgb24 -f rawvideo - " ; String[] cmd=new String[4]; cmd[0]="cmd"; cmd[1]="/c"; cmd[2]=src; cmd[3]="2>NUL"; prc=Runtime.getRuntime().exec(cmd); ******/ inp= new java.io.BufferedInputStream(prc.getInputStream()); out=new java.io.BufferedOutputStream(prc.getOutputStream()); err=new java.io.BufferedInputStream(prc.getErrorStream()); flag=1; t.start(); bot.setText("停止攝影"); } else { flag=0; t.stop(); inp.close(); err.close(); bot.setText("開始攝影"); } } catch (Exception ee) { System.out.println(ee.toString()); } } else if (e.getSource()==t) { try { //利用ffmpeg 把影像輸出到標準輸出,由java讀入tmp陣列中 err.read(errtmp, 0, err.available()); index = 0; while (index < tmp.length) { more=inp.read(tmp, index, tmp.length-index); if (more<0) more=0; index = index+more; } err.read(errtmp, 0, err.available()); //一次把所有資料組成圖檔 long rsum=0,gsum=0,bsum=0; for (i = 0; i < RAW.length; i++) { cpt = i * 3; R = (int) tmp[cpt++] & 0xff; G = (int) tmp[cpt++] & 0xff; B = (int) tmp[cpt] & 0xff; RAW[i] = (R << 16) | (G << 8) | (B); rsum=rsum+R; gsum=gsum+G; bsum=bsum+B; } if (rsum > gsum && rsum>bsum) System.out.println("紅色喔!"); else if (gsum > rsum && gsum>bsum) System.out.println("綠色喔!"); else if (bsum > rsum && bsum>gsum) System.out.println("藍色喔!"); bi.setRGB(0, 0, 320, 240, RAW, 0, 320); img=(Image)bi; icon=new ImageIcon(img); lab.setIcon(icon); repaint(); } catch (Exception ee) { System.out.println(ee.toString()); } }//t } /***主程式***/ public static void main(String args[]) //程式起點 { ui45 app=new ui45(); //畫圖 app.addWindowListener(new WindowAdapter(){ //匿名內部類別 public void windowClosing(WindowEvent e) { System.exit(0); } }); //處理視窗關閉要求 } }