/***************************************** 示範利用呼叫外部ffmpeg取得webcam影像 *************************************************/ import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ui47 extends JFrame implements ActionListener { Container c; JLabel lab,lab_back; JButton bot,bot_back; Image img=null; ImageIcon icon=null,icon_back=null; Timer t; java.awt.image.BufferedImage bi=new java.awt.image.BufferedImage(320,240,java.awt.image.BufferedImage.TYPE_INT_RGB); java.awt.image.BufferedImage bi_back=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,back=0; public ui47() //建構元 { super("呼叫外部ffmpeg連續取得webcam影像"); c=getContentPane(); setSize(640,480); bot=new JButton("開始取影像"); bot_back=new JButton("紀錄背景"); lab=new JLabel(); lab_back=new JLabel(); c.setLayout(new FlowLayout(FlowLayout.CENTER));//設定為流水版面設定 //注意加入元件的順序 c.add(bot); c.add(bot_back); c.add(lab); c.add(lab_back); t=new Timer(100,this); bot.addActionListener(this);//設定自己為bot0按鈕的傾聽者 bot_back.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()==bot_back) { if (flag==1) { bi_back.setData(bi.getData()); img=(Image)bi_back; icon_back=new ImageIcon(img); lab_back.setIcon(icon_back); repaint(); } } 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()); //一次把所有資料組成圖檔 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); } bi.setRGB(0, 0, 320, 240, RAW, 0, 320); //開始背景相檢處理 int threshold=2000; int R1,G1,B1,color1,color,x,y; for (y=0;y<240;y=y+1) for (x=0;x<320;x=x+1) { color=bi.getRGB(x,y); R=color>>16&0xff; G=color>>8&0xff; B=color&0xff; color1=bi_back.getRGB(x,y); R1=color1>>16&0xff; G1=color1>>8&0xff; B1=color1&0xff; if ((R-R1)*(R-R1)+ (G-G1)*(G-G1)+ (B-B1)*(B-B1)