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

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          現在的畢業設計越做越出花來了  用java進行視頻捕捉這樣的需求也會出現 其實也不是不可以 只是這樣做有意思嗎

          簡單上網查了下 用java捕捉不外乎用采集卡原生的api做個jni的wrapper和用directshow或vfw等windows通用的api做jni兩種做法 當然有同學硬要做video4linux的api我也不會反對的

          因為我沒有那位同學的采集卡 所以用廠商的sdk的方案短期內不現實  所以我用了sun的jmf庫來采集

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

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

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

          設備的選擇連接和打開
          CaptureDialog是一個捕捉設備選擇對話框
          JMFUtils.createCaptureDataSource函數根據設備創建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("視頻信號");
                  //        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) 評論(6)  編輯  收藏

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

          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();

          }
          }  回復  更多評論
            
          # re: java的視頻捕捉 [未登錄] 2008-05-28 09:14 zarra
          @zz
          方便的話給各聯系方式

          保存圖片的方法 看看 這個能不能給你點幫助

          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");

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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 水富县| 开远市| 苍南县| 山阳县| 工布江达县| 大悟县| 西乌珠穆沁旗| 乌恰县| 柘荣县| 固始县| 嘉禾县| 大竹县| 洛扎县| 元谋县| 甘孜| 都安| 介休市| 基隆市| 科尔| 镇康县| 饶平县| 义乌市| 通化市| 隆尧县| 湟源县| 平武县| 崇仁县| 土默特右旗| 晋城| 德格县| 榆社县| 衡阳县| 屏东市| 阳春市| 搜索| 洪洞县| 铁力市| 汉川市| 会东县| 大宁县| 土默特右旗|