隨筆 - 67  文章 - 79  trackbacks - 0
          <2008年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          相冊(cè)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          現(xiàn)在的畢業(yè)設(shè)計(jì)越做越出花來了  用java進(jìn)行視頻捕捉這樣的需求也會(huì)出現(xiàn) 其實(shí)也不是不可以 只是這樣做有意思嗎

          簡單上網(wǎng)查了下 用java捕捉不外乎用采集卡原生的api做個(gè)jni的wrapper和用directshow或vfw等windows通用的api做jni兩種做法 當(dāng)然有同學(xué)硬要做video4linux的api我也不會(huì)反對(duì)的

          因?yàn)槲覜]有那位同學(xué)的采集卡 所以用廠商的sdk的方案短期內(nèi)不現(xiàn)實(shí)  所以我用了sun的jmf庫來采集

          jmf在windows平臺(tái)下用的是vfw api 效率比較低 另外有一個(gè)商業(yè)的directshow的java wrapper名字叫dsj 這個(gè)性能基本和c++打平了 不過這個(gè)需要授權(quán)費(fèi) 所以算了吧
          jmf的安裝很簡單 去 http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/download.html 下載下來 安裝好以后在桌面會(huì)看到一個(gè)JMStudio圖標(biāo) 運(yùn)行JMStudio如果視頻采集正常的話 說明jmf能識(shí)別采集卡(其實(shí)就是采集卡提供了vfw接口)至此視頻采集成功了大半 簡單吧

          =============================================================================================================================
          下面是代碼片斷和簡單說明
          PlayerFrame是一個(gè)視頻播放控制類 我們就創(chuàng)建一個(gè)繼承自他的新類Demo
          public class Demo extends PlayerFrame {

              public Demo() {
                  super(null, "Capture");
              }
          ...

          設(shè)備的選擇連接和打開
          CaptureDialog是一個(gè)捕捉設(shè)備選擇對(duì)話框
          JMFUtils.createCaptureDataSource函數(shù)根據(jù)設(shè)備創(chuàng)建datasource
          private void init() throws NoPlayerException, IOException {
                  // setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                  String nameCaptureDeviceAudio = null;
                  String nameCaptureDeviceVideo = null;

                  CaptureDialog dialogCapture = new CaptureDialog(this, null);
                  dialogCapture.show();
                  if (dialogCapture.getAction() == CaptureDialog.ACTION_CANCEL)
                      return;

                  CaptureDeviceInfo cdi = dialogCapture.getAudioDevice();
                  if (cdi != null && dialogCapture.isAudioDeviceUsed())
                      nameCaptureDeviceAudio = cdi.getName();
                  cdi = dialogCapture.getVideoDevice();
                  if (cdi != null && dialogCapture.isVideoDeviceUsed())
                      nameCaptureDeviceVideo = cdi.getName();
                  dataSource = JMFUtils.createCaptureDataSource(nameCaptureDeviceAudio,
                          dialogCapture.getAudioFormat(), nameCaptureDeviceVideo,
                          dialogCapture.getVideoFormat());
                  DataSource cdswrapper = new CDSWrapper(
                          (PushBufferDataSource) dataSource);
                  dataSource=cdswrapper;
                  dataSource.connect();
                  open(dataSource);
          ...

          preview畫面顯示控件的放置
              public void createComponent() throws NoPlayerException, IOException {
                  setTitle("視頻信號(hào)");
                  //        addWindowListener(new WinClose());

                  panel = new JPanel();

                  if ((com = mediaPlayerCurrent.getVisualComponent()) != null) {
                      panel.add(com);
                  }
                  add(BorderLayout.CENTER, panel);

              }

          單幀捕捉
          JButton capture = new JButton("Capture Image");
                  capture.addActionListener(new ActionListener() {

                      @Override
                      public void actionPerformed(ActionEvent arg0) {
                          mediaPlayerCurrent.stop();
                          Buffer bufferFrame;
                          BufferToImage bufferToImage;
                          Image image;
                          BufferedImage bi;
                          controlGrabber = (FrameGrabbingControl) mediaPlayerCurrent
                                  .getControl("javax.media.control.FrameGrabbingControl");
                          bufferFrame = controlGrabber.grabFrame();
                          bufferToImage = new BufferToImage((VideoFormat) bufferFrame
                                  .getFormat());

                          image = bufferToImage.createImage(bufferFrame);

                          File out = new File("capture" + (++captureCount) + ".png");
                          try {
                              bi = toBufferedImage(image);
                              ImageIO.write(bi, "png", out);
                          } catch (IOException e1) {
                              e1.printStackTrace();
                          }

                          mediaPlayerCurrent.start();

                      }
                  });

          寫好的文件在 http://www.aygfsteel.com/Files/zarra/Demo001.zip
          posted on 2008-05-10 12:33 zarra 閱讀(1473) 評(píng)論(6)  編輯  收藏

          FeedBack:
          # re: java的視頻捕捉 [未登錄] 2008-05-11 14:08 apple
          老師,您辛苦了!!真的不知道該怎么謝您了!!  回復(fù)  更多評(píng)論
            
          # re: java的視頻捕捉 [未登錄] 2008-05-19 16:51 zz
          老師您好,怎樣將一幅圖片的色彩值,即就是R、G、B值提取出來  回復(fù)  更多評(píng)論
            
          # re: java的視頻捕捉  2008-05-22 16:02 zarra
          @zz
          這個(gè)問題太大了 。。。
          你的是什么圖片 已編碼的圖像文件 raw像素值 從圖形設(shè)備上捕捉到的位圖?   回復(fù)  更多評(píng)論
            
          # re: java的視頻捕捉 [未登錄] 2008-05-26 21:38 zz
          我的畢業(yè)設(shè)計(jì)題目是:視頻摘要系統(tǒng)。本來是打算通過一副參照?qǐng)D片,將其圖像信息提取,然后依據(jù)所提取數(shù)據(jù),自動(dòng)捕捉視頻中與其相似的圖片出來。以我現(xiàn)在的水平,時(shí)間刻不容緩,馬上答辯了,只能做到在視頻播放過程中,捕捉圖像(已經(jīng)實(shí)現(xiàn)),然后將捕捉到的圖片存儲(chǔ)下來,并對(duì)其色彩值提取出來。現(xiàn)附上源碼,希望老師幫幫我,一是捕捉圖片后能存儲(chǔ),二是提取所捕獲圖片信息。

          import java.awt.*;
          import java.awt.image.*;
          import javax.swing.*;
          import com.sun.image.codec.jpeg.*;

          class ImageCanvas extends Canvas{
          private Image image;
          private Dimension prefSize;

          public ImageCanvas(Image image){
          this.image = image;
          calculatePreferredSize();
          }

          public void setImage(Image image){
          this.image = image;
          calculatePreferredSize();
          repaint();
          }

          private void calculatePreferredSize(){
          prefSize = new Dimension(image.getWidth(this),image.getHeight(this));
          System.out.println(image.getWidth(this));
          setSize(prefSize);
          }

          public Dimension getPreferredSize() {
          return prefSize;
          }

          public Dimension getMinimumSize() {
          return prefSize;
          }

          public void update(Graphics g){
          paint(g);
          }
          public void paint(Graphics g){
          g.drawImage(image,0,0,null);
          }
          }

          class ImageUtils{
          public static Image getScreenImage(){
          Robot robot;
          try {
          robot = new Robot();
          }catch(Exception e) {
          throw new RuntimeException("unable to construct Robot");
          }
          Dimension screenDims =Toolkit.getDefaultToolkit().getScreenSize();
          Image screen =robot.createScreenCapture(new Rectangle (140,60,screenDims.width,screenDims.height)).getScaledInstance (400,300,Image.SCALE_SMOOTH);
          MediaTracker tracker =new MediaTracker(new Label());
          tracker.addImage(screen,1);
          try {
          tracker.waitForID(0);
          }catch(InterruptedException e) { /** ... */ }
          return screen;
          }
          }

          public class ScreenCapture extends JFrame{
          private ImageCanvas canvas =new ImageCanvas(ImageUtils.getScreenImage());
          public ScreenCapture(){
          add(canvas);
          setLocation(0,0);
          setSize(400,350);
          setVisible(true);
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          Thread imageThread =new UpdateThread();
          imageThread.setDaemon(true);
          imageThread.start();
          }

          class UpdateThread extends Thread{
          public void run(){
          while(true){
          try {
          Thread.currentThread().sleep(1000);
          }
          catch (Exception ex) {

          }
          canvas.setImage(ImageUtils.getScreenImage());
          validate();
          }
          }
          }

          public static void main(String[] args){
          new ScreenCapture();

          }
          }  回復(fù)  更多評(píng)論
            
          # re: java的視頻捕捉 [未登錄] 2008-05-28 09:14 zarra
          @zz
          方便的話給各聯(lián)系方式

          保存圖片的方法 看看 這個(gè)能不能給你點(diǎn)幫助

          Buffer bufferFrame;
          BufferToImage bufferToImage;
          Image image;
          BufferedImage bi;
          controlGrabber = (FrameGrabbingControl) mediaPlayerCurrent
          .getControl("javax.media.control.FrameGrabbingControl");
          bufferFrame = controlGrabber.grabFrame();
          bufferToImage = new BufferToImage((VideoFormat) bufferFrame
          .getFormat());

          image = bufferToImage.createImage(bufferFrame);

          File out = new File("capture" + (++captureCount) + ".png");

          其實(shí)就是java的Buffer BufferToImage 和 BufferedImage 三個(gè)類  回復(fù)  更多評(píng)論
            
          # re: java的視頻捕捉 [未登錄] 2008-05-28 16:44 zz
          @zarra
          謝謝老師!
          QQ:171189195
          e-mail:lovelife619@163.com
          方便的話也留個(gè)您的聯(lián)系方式  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 栾川县| 辽宁省| 习水县| 临海市| 胶南市| 富川| 天峻县| 河池市| 陇南市| 那坡县| 镇远县| 霍城县| 通州市| 南城县| 新田县| 库尔勒市| 巨鹿县| 启东市| 资溪县| 姜堰市| 浙江省| 烟台市| 康平县| 阜平县| 三原县| 登封市| 吉安县| 青浦区| 稷山县| 定西市| 临夏县| 柳江县| 石楼县| 道孚县| 繁峙县| 鹤峰县| 本溪市| 临朐县| 霸州市| 阿城市| 蓬安县|