JMF實現(xiàn)視頻捕獲與錄制

          Posted on 2007-11-29 09:56 lauber 閱讀(2883) 評論(2)  編輯  收藏

          //CamDataSource.java

          package ccnu.meng.jxtaApp.localTest;

           

             import java.io.*;
             import java.util.*;
             import java.awt.Component;
             import javax.swing.JOptionPane;
             import javax.media.*;
             import javax.media.protocol.*;
          import javax.media.format.VideoFormat;


             public class CamDataSource {
                
                 private Component parent;
                
                 private DataSource mainCamSource;
                 private MediaLocator ml;
                 private Processor processor;
                 private boolean processing;
                
                 public CamDataSource(Component parent) {
                     this.parent = parent;
                     setProcessing(false);
                 }
                
                 public void setMainSource(){
                     setProcessing(false);
                     VideoFormat vidformat = new VideoFormat(VideoFormat.RGB);
                     Vector devices = CaptureDeviceManager.getDeviceList(vidformat);
                     CaptureDeviceInfo di = null;
                    
                     if (devices.size() > 0)
                     di = (CaptureDeviceInfo) devices.elementAt(0);
                     else {
                         JOptionPane.showMessageDialog(parent,
                            "Your camera is not connected", "No webcam found", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                   
                     try {
                         ml = di.getLocator();
                         setMainCamSource(Manager.createDataSource(ml));
                     } catch (Exception e) {
                         JOptionPane.showMessageDialog(parent,
                            "Exception locating media: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                 }
                
                 public void makeDataSourceCloneable(){
                     // turn our data source to a cloneable data source
                     setMainCamSource(Manager.createCloneableDataSource(getMainCamSource()));
                    
                 }
                
                 public void startProcessing(){
                    
                     try{
                         processor = Manager.createProcessor(getMainCamSource());
                     }catch (IOException e) {
                         JOptionPane.showMessageDialog(parent,
                            "IO Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }catch (NoProcessorException e) {
                         JOptionPane.showMessageDialog(parent,
                            "Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                    
                     CamStateHelper playhelper = new CamStateHelper(processor);
                     if(!playhelper.configure(10000)){
                         JOptionPane.showMessageDialog(parent,
                            "cannot configure processor", "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                     processor.setContentDescriptor(null);
                     if(!playhelper.realize(10000)){
                         JOptionPane.showMessageDialog(parent,
                            "cannot realize processor", "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                    // In order for or your clones to start, you must start the original source
                     processor.start();
                     setProcessing(true);
                 }
                
             
                 public DataSource cloneCamSource(){
                     if(!getProcessing()) setMainSource();
                     return ((SourceCloneable)getMainCamSource()).createClone();
                 }
                
                 public DataSource getMainCamSource(){
                     return mainCamSource;
                 }

                 public void setMainCamSource(DataSource mainCamSource){
                     this.mainCamSource = mainCamSource;
                 }
                
                 public void setMl(MediaLocator ml){
                     this.ml = ml;
                 }
                 
                 public MediaLocator getMl(){
                     return ml;
                 }
                
                 public boolean getProcessing(){
                     return processing;
                 }
                
                 public void setProcessing(boolean processing){
                     this.processing = processing;
                    
                 }
                
                 public void setParent(Component parent){
                     this.parent = parent;
                 }
                
                 public Component getParent(){
                     return parent;
                 }

          }

          /**********************************************************************************************/

           

          //CamStateHelper.java

          package ccnu.meng.jxtaApp.localTest;

           

          import javax.media.*;

           

          public class CamStateHelper implements javax.media.ControllerListener {
                
                 Player player = null;
                 boolean configured = false;
                 boolean realized = false;
                 boolean prefetched = false;
                 boolean eom = false;
                 boolean failed = false;
                 boolean closed = false;
                
                 public CamStateHelper(Player p) {
                     player = p;
                     p.addControllerListener(this);
                 }
                
                 public boolean configure(int timeOutMillis) {
                    
                     long startTime = System.currentTimeMillis();
                     synchronized (this) {
                         if (player instanceof Processor)
                             ((Processor)player).configure();
                         else
                             return false;
                         while (!configured && !failed) {
                             try {
                                 wait(timeOutMillis);
                             } catch (InterruptedException ie) {
                             }
                             if (System.currentTimeMillis() - startTime > timeOutMillis)
                                 break;
                         }
                     }
                     return configured;
                 }
                
                 public boolean realize(int timeOutMillis) {
                     long startTime = System.currentTimeMillis();
                     synchronized (this) {
                         player.realize();
                         while (!realized && !failed) {
                             try {
                                 wait(timeOutMillis);
                             }catch (InterruptedException ie) {
                             }
                             if (System.currentTimeMillis() - startTime > timeOutMillis)
                                 break;
                         }
                     }
                     return realized;
                 }
                
                 public boolean prefetch(int timeOutMillis) {
                     long startTime = System.currentTimeMillis();
                     synchronized (this) {
                         player.prefetch();
                         while (!prefetched && !failed) {
                             try {
                                 wait(timeOutMillis);
                             }catch (InterruptedException ie) {
                             }
                             if (System.currentTimeMillis() - startTime > timeOutMillis)
                                 break;
                         }
                     }
                     return prefetched && !failed;
                 }
                 public boolean playToEndOfMedia(int timeOutMillis) {
                     long startTime = System.currentTimeMillis();
                     eom = false;
                     synchronized (this) {
                         player.start();
                         while (!eom && !failed) {
                             try {
                                 wait(timeOutMillis);
                             }catch (InterruptedException ie) {
                             }
                             if (System.currentTimeMillis() - startTime > timeOutMillis)
                                 break;
                         }
                     }
                     return eom && !failed;
                 }
                
                 public void close() {
                     synchronized (this) {
                         player.close();
                         while (!closed) {
                             try {
                                 wait(100);
                             } catch (InterruptedException ie) {
                             }
                         }
                     }
                     player.removeControllerListener(this);
                 }
                
                 public synchronized void controllerUpdate(ControllerEvent ce) {
                     if (ce instanceof RealizeCompleteEvent) {
                         realized = true;
                     }else if (ce instanceof ConfigureCompleteEvent) {
                         configured = true;
                     } else if (ce instanceof PrefetchCompleteEvent) {
                         prefetched = true;
                     } else if (ce instanceof EndOfMediaEvent) {
                         eom = true;
                     } else if (ce instanceof ControllerErrorEvent) {
                         failed = true;
                     } else if (ce instanceof ControllerClosedEvent) {
                         closed = true;
                     } else {
                         return;
                     }
                     notifyAll();
                 }
             }

          /******************************************************************************************/

          //LocalVideoTest.java

          package ccnu.meng.jxtaApp.localTest;


          public class LocalVideoTest {
           
            public LocalVideoTest() {
                  
                   CamDataSource dataSource = new CamDataSource(null);
                   dataSource.setMainSource();
                   dataSource.makeDataSourceCloneable();
                   dataSource.startProcessing();
                  
                   MainFrame frame = new MainFrame(dataSource);
                   frame.setSize(400, 400);
                   frame.setLocationRelativeTo(null);
                   frame.setVisible(true);

                   }
           
            public static void main(String[] args) {
                  
             LocalVideoTest Lvt = new LocalVideoTest();
                  
               }
          }

           

          /*********************************************************************************************/

          //MainFrame.java

          package ccnu.meng.jxtaApp.localTest;

             import java.io.*;
             import java.net.URL;
             import java.net.MalformedURLException;
             import java.awt.*;
             import javax.swing.JFileChooser;
             import javax.media.*;
             import javax.media.control.*;
             import javax.media.protocol.*;
             import javax.media.format.VideoFormat;
             import javax.swing.JPanel;
             import javax.swing.JLabel;
             import javax.swing.JToolBar;
             import javax.swing.JButton;
             import javax.swing.JFrame;
             import javax.swing.JOptionPane;
             import javax.swing.WindowConstants;
             import java.awt.BorderLayout;
             import java.awt.event.*;

             public class MainFrame extends JFrame {
              private JPanel centerPanel;
                 private JLabel fileLabel;
                 private JToolBar mainToolBar;
                 private JLabel messageLabel;
                 private JPanel northPanel;
                 private JButton recordButton;
                 private JPanel southPanel;
                
                 private CamDataSource dataSource;
                 private DataSource camSource;
                 private DataSource recordCamSource;
                 private DataSink dataSink;
                 private Processor processor;
                 private Processor recordProcessor;
                 private CamStateHelper playhelper;
                
                 private JFileChooser movieChooser;
                
                 public MainFrame(CamDataSource dataSource) {
                 
                     this.dataSource = dataSource;
                     this.dataSource.setParent(this);
                     camSource = dataSource.cloneCamSource();
                    
                     initComponents();
                     try{
                         processor = Manager.createProcessor(camSource);
                     }catch (IOException e) {
                         JOptionPane.showMessageDialog(this,
                           "Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }catch (NoProcessorException e) {
                         JOptionPane.showMessageDialog(this,
                            "Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                    
                     playhelper = new CamStateHelper(processor);
                     if(!playhelper.configure(10000)){
                         JOptionPane.showMessageDialog(this,
                            "cannot configure processor", "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                     checkIncoding(processor.getTrackControls());
                     processor.setContentDescriptor(null);
                     if(!playhelper.realize(10000)){
                         JOptionPane.showMessageDialog(this,
                            "cannot realize processor", "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                    
                     setJPEGQuality(processor, 1.0f);
                     processor.start();
                    
                     processor.getVisualComponent().setBackground(Color.gray);
                     centerPanel.add(processor.getVisualComponent(), BorderLayout.CENTER);//視頻面板
                     centerPanel.add(processor.getControlPanelComponent(), BorderLayout.SOUTH);//視頻控制面板
                 }
                
                 //界面初始化
                 private void initComponents() {
                     northPanel = new JPanel();
                     messageLabel = new JLabel();
                     southPanel = new JPanel();
                     mainToolBar = new JToolBar();
                     recordButton = new JButton();
                     fileLabel = new JLabel();
                     centerPanel = new JPanel();

                     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                     setTitle("本地視頻");
                     addWindowListener(new java.awt.event.WindowAdapter() {
                         public void windowClosing(WindowEvent evt) {
                             formWindowClosing(evt);
                         }
                     });

                     northPanel.setLayout(new BorderLayout());

                     messageLabel.setText("狀態(tài):");
                     northPanel.add(messageLabel, BorderLayout.SOUTH);
                     getContentPane().add(northPanel, BorderLayout.NORTH);

                     southPanel.setLayout(new BorderLayout());
                     recordButton.setText("錄制");
                     recordButton.addActionListener(new ActionListener() {
                         public void actionPerformed(ActionEvent evt) {
                             recordButtonActionPerformed(evt);
                         }
                     });

                     mainToolBar.add(recordButton);

                     fileLabel.setText("文件:");
                     mainToolBar.add(fileLabel);
                     southPanel.add(mainToolBar, BorderLayout.CENTER);
                     getContentPane().add(southPanel, BorderLayout.SOUTH);
                     centerPanel.setLayout(new BorderLayout());
                     getContentPane().add(centerPanel, BorderLayout.CENTER);

                     pack();
                 }
                
                 private void formWindowClosing(java.awt.event.WindowEvent evt) {
                  processor.close();
                 }
                
                 //錄制當(dāng)前視頻
                 private void recordButtonActionPerformed(java.awt.event.ActionEvent evt) {
                  
                     if(recordButton.getText().equals("錄制")){
                         fileLabel.setText("文件:");
                         if (movieChooser == null) movieChooser = new JFileChooser();
                         movieChooser.setDialogType(JFileChooser.SAVE_DIALOG);
                         //Add a custom file filter and disable the default
                         //(Accept All) file filter.
                         movieChooser.addChoosableFileFilter(new MOVFilter());
                         movieChooser.setAcceptAllFileFilterUsed(false);
                         movieChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                         int returnVal = movieChooser.showDialog(this, "錄制");
                         if (returnVal == JFileChooser.APPROVE_OPTION) {
                             File file = movieChooser.getSelectedFile();
                             if(!file.getName().endsWith(".mov")
                                &&!file.getName().endsWith(".MOV")) file = new File(file.toString() + ".mov");
                             recordToFile(file);
                             fileLabel.setText("文件:" + file.toString());
                             recordButton.setText("停止");
                         }
                     }else{
                         stopRecording();
                         recordButton.setText("錄制");
                     }
                 }
                
                 void setJPEGQuality(Player p, float val) {
                     Control cs[] = p.getControls();
                     QualityControl qc = null;
                     VideoFormat jpegFmt = new VideoFormat(VideoFormat.JPEG);
                    
                     // Loop through the controls to find the Quality control for
                     // the JPEG encoder.
                     for (int i = 0; i < cs.length; i++) {
                         if (cs[i] instanceof QualityControl && cs[i] instanceof Owned) {
                             Object owner = ((Owned)cs[i]).getOwner();
                             // Check to see if the owner is a Codec.
                             // Then check for the output format.
                             if (owner instanceof Codec) {
                                 Format fmts[] = ((Codec)owner).getSupportedOutputFormats(null);
                                 for (int j = 0; j < fmts.length; j++) {
                                     if (fmts[j].matches(jpegFmt)) {
                                         qc = (QualityControl)cs[i];
                                         qc.setQuality(val);
                                         break;
                                     }
                                 }
                             }
                             if (qc != null) break;
                         }
                     }
                 }
                
                 public void checkIncoding(TrackControl track[]){
                     for (int i = 0; i < track.length; i++) {
                         Format format = track[i].getFormat();
                         if (track[i].isEnabled() && format instanceof VideoFormat) {
                             Dimension size = ((VideoFormat)format).getSize();
                             float frameRate = ((VideoFormat)format).getFrameRate();
                             int w = (size.width % 8 == 0 ? size.width :(int)(size.width / 8) * 8);
                             int h = (size.height % 8 == 0 ? size.height :(int)(size.height / 8) * 8);
                             VideoFormat jpegFormat = new VideoFormat(
                                VideoFormat.JPEG_RTP, new Dimension(w, h), Format.NOT_SPECIFIED, Format.byteArray, frameRate);
                             messageLabel.setText("狀態(tài): 視頻將以" + jpegFormat.toString()+"播放");
                         }
                     }
                 }
                
                 public void recordToFile(File file){
                     URL movieUrl = null;
                     MediaLocator dest = null;
                     try{
                         movieUrl = file.toURL();
                         dest = new MediaLocator(movieUrl);
                     }catch(MalformedURLException e){
                        
                     }
                    
                     recordCamSource = dataSource.cloneCamSource();
                     try{
                         recordProcessor = Manager.createProcessor(recordCamSource);
                     }catch (IOException e) {
                         JOptionPane.showMessageDialog(this,
                            "Exception creating record processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }catch (NoProcessorException e) {
                         JOptionPane.showMessageDialog(this,
                            "Exception creating record processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                     playhelper = new CamStateHelper(recordProcessor);
                     if(!playhelper.configure(10000)){
                         JOptionPane.showMessageDialog(this,
                            "cannot configure record processor", "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                    
                     VideoFormat vfmt = new VideoFormat(VideoFormat.CINEPAK);
                     (recordProcessor.getTrackControls())[0].setFormat(vfmt);
                     (recordProcessor.getTrackControls())[0].setEnabled(true);
                     recordProcessor.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME));
                     Control control = recordProcessor.getControl("javax.media.control.FrameRateControl");
                     if ( control != null && control instanceof javax.media.control.FrameRateControl )
                        ((javax.media.control.FrameRateControl)control).setFrameRate(15.0f);
                     if(!playhelper.realize(10000)){
                         JOptionPane.showMessageDialog(this,
                            "cannot realize processor", "Error", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                    
                     try {
                         if(recordProcessor.getDataOutput()==null){
                             JOptionPane.showMessageDialog(this,
                                "No Data Output", "Error", JOptionPane.WARNING_MESSAGE);
                             return;
                         }
                         dataSink = Manager.createDataSink(recordProcessor.getDataOutput(), dest);
                         recordProcessor.start();
                         dataSink.open();
                         dataSink.start();
                     } catch (NoDataSinkException ex) {
                         JOptionPane.showMessageDialog(this,
                            "No DataSink " + ex.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                     } catch (IOException ex) {
                         JOptionPane.showMessageDialog(this,
                            "IOException " + ex.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                     }
                 }
                
                 public void stopRecording(){
                     try {
                         recordProcessor.close();
                         dataSink.stop();
                         dataSink.close();
                     } catch (IOException e) {
                         JOptionPane.showMessageDialog(this,
                            "cannot stop recording " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
                     }
                 }
           
               
           
             }
          /***********************************************************************************************/

          //MOVFilter.java

          package ccnu.meng.jxtaApp.localTest;

          import java.io.File;
          import javax.swing.*;
          import javax.swing.filechooser.*;

          /* ImageFilter.java is a 1.4 example used by FileChooserDemo2.java. */
          public class MOVFilter extends FileFilter {
              public boolean accept(File f) {
                  if (f.isDirectory()) {
                      return true;
                  }

                  String extension = MOVFilter.getExtension(f);
                  if (extension != null) {
                      if (extension.equalsIgnoreCase("MOV")) {
                              return true;
                      } else {
                          return false;
                      }
                  }

                  return false;
              }

              //The description of this filter
              public String getDescription() {
                  return "QuickTime Movies";
              }
             
              public static String getExtension(File f) {
                  String ext = null;
                  String s = f.getName();
                  int i = s.lastIndexOf('.');

                  if (i > 0 &&  i < s.length() - 1) {
                      ext = s.substring(i+1).toLowerCase();
                  }
                  return ext;
              }
          }
          //本文轉(zhuǎn)載自 http://mengmailu.bokee.com/viewdiary.15643624.html,嘿嘿

          Feedback

          # re: JMF實現(xiàn)視頻捕獲與錄制  回復(fù)  更多評論   

          2010-06-11 10:22 by cuiran
          你好,看了你這篇文章,我也試著做了一下,但是視頻畫面沒有出來,可以錄制.想知道為什么?我是剛接觸這,正好要用到視頻錄制功能.

          # re: JMF實現(xiàn)視頻捕獲與錄制  回復(fù)  更多評論   

          2010-06-11 10:23 by cuiran
          我的郵箱是cuiran2001@163.com.期待你的回復(fù).謝謝!

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


          網(wǎng)站導(dǎo)航:
           

          posts - 9, comments - 5, trackbacks - 0, articles - 0

          Copyright © lauber

          主站蜘蛛池模板: 高安市| 高碑店市| 峨眉山市| 黄冈市| 贞丰县| 都昌县| 常宁市| 赤水市| 体育| 鄄城县| 新密市| 革吉县| 通海县| 惠州市| 赫章县| 屏边| 阿拉善左旗| 邵武市| 临江市| 呼玛县| 来凤县| 广州市| 饶河县| 玉屏| 延边| 尉氏县| 高雄县| 于都县| 囊谦县| 汉川市| 南开区| 方城县| 宣化县| 沾益县| 贵南县| 定州市| 长海县| 大余县| 乐平市| 石屏县| 广宗县|