首先需要说明的是JMF是个什么东西?这个简单问下百度,在百度里输入JMF后看百度百科就很清楚了,我就不啰嗦了,啰嗦也没人家说的好。哈哈
接下来就说它的安装了,我下载的是2.1.1e版本的,在windows安装直接默认就行了。下载去官网(google里输入JMF)。
下来就说正事了,功能就说用电脑本机上的摄像头采集数据然后存放成视频文件就ok了
好了看代码
先是启动类
public class MainClass { /** * 程序运行入口 * @param args */ public static void main(String[] args) { MainFrame frmMain = new MainFrame(); try { //设置主窗体的样式 UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); SwingUtilities.updateComponentTreeUI(frmMain); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } //设置窗口位于屏幕中央 frmMain.setLocationRelativeTo(null); frmMain.setVisible(true); } }
再就是主窗体了,都有注释,就不再多做解释了
public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private CaptureDeviceInfo captureDevice; private Component visualComponent; private Processor processor; private Player player; private DataSink fileWriter; private FormatControl formatControl; private JPanel pnlVideo = new JPanel(new BorderLayout()); JPanel contentPane; JPanel pnlControl = new JPanel(); JButton btnStart = new JButton("开始采集"); JButton btnStop = new JButton("停止采集"); JFileChooser fileChooser = new JFileChooser(); public MainFrame() { super("视频采集软件"); try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); SwingUtilities.updateComponentTreeUI(this); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } catch (InstantiationException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (UnsupportedLookAndFeelException e1) { e1.printStackTrace(); } contentPane = (JPanel) this.getContentPane(); //获得视频设备信息 this.captureDevice = getCaptureDeviceInfo(); // try { //获得数据源 DataSource source = Manager.createDataSource(captureDevice.getLocator()); //克隆数据源 DataSource cloneableSource = Manager.createCloneableDataSource(source); //创建player player = Manager.createRealizedPlayer(((SourceCloneable)cloneableSource).createClone()); //获取默认格式,我这里是RGB formatControl = (FormatControl) player.getControl("javax.media.control.FormatControl"); Format defaultFormat = formatControl.getFormat(); //设置输出文件的格式,这里是avi FileTypeDescriptor outputType = new FileTypeDescriptor(FileTypeDescriptor.MSVIDEO); ProcessorModel processorModel = new ProcessorModel(cloneableSource, new Format[]{ defaultFormat }, outputType); //创建一个处理器 processor = Manager.createRealizedProcessor(processorModel); } catch (Exception e) { processException(e); } //展示图形的swing组件 visualComponent = player.getVisualComponent(); if (visualComponent!=null) { pnlVideo.add(visualComponent); contentPane.add(pnlVideo); } // btnStop.setEnabled(false); pnlControl.add(btnStart); pnlControl.add(btnStop); contentPane.add("South", pnlControl); //点击开始事件 btnStart.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { start(); } }); btnStop.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { stop(); } }); // pack(); setResizable(false); setDefaultCloseOperation(EXIT_ON_CLOSE); } /** * 点击开始采集 */ private void start() { String locatorString = getLocatorString(); if(locatorString==null) { return; } //开始采集不可用 btnStart.setEnabled(false); //从处理器中拿到数据源 DataSource source = processor.getDataOutput(); MediaLocator dest = new MediaLocator( locatorString ); try { //本地文件传输 fileWriter = Manager.createDataSink(source, dest); fileWriter.open(); fileWriter.start(); } catch (Exception e) { processException(e); } processor.start(); player.start(); btnStop.setEnabled(true); } private void stop() { btnStop.setEnabled(false); //停止捕获 player.stop(); processor.stop(); try { fileWriter.stop(); fileWriter.close(); } catch (IOException e) { processException(e); } btnStart.setEnabled(true); } private void processException(Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(this, e.toString(), "错误", JOptionPane.ERROR_MESSAGE); System.exit(0); } /** * 构建输出路径的URL * @return */ private String getLocatorString() { if( JFileChooser.APPROVE_OPTION != fileChooser.showSaveDialog(this)) { return null; } File file = fileChooser.getSelectedFile(); if (file==null) { return null; } String locatorString = file.getAbsolutePath(); if( !locatorString.endsWith(".avi" )) { locatorString += ".avi"; } locatorString = "file://" + locatorString; return locatorString; } /** * 获得截取视频的设备信息 * @return 设备信息 */ private CaptureDeviceInfo getCaptureDeviceInfo() { //定义视频格式 Format videoFormat = new VideoFormat(VideoFormat.YUV); @SuppressWarnings("unchecked") //获得满足条件的视频设备列表 Vector<CaptureDeviceInfo> deviceList = CaptureDeviceManager.getDeviceList(videoFormat); if(deviceList.size()<1) { JOptionPane.showMessageDialog(this, "未检测到视频输入设备。", "错误", JOptionPane.ERROR_MESSAGE); System.exit(0); } String[] deviceNames = new String[deviceList.size()]; for (int i = 0; i < deviceList.size(); i ++ ) { deviceNames[i] = deviceList.get(i).getName(); } String deviceName = (String) JOptionPane.showInputDialog(this, "请选择视频输入设备", "请选择", JOptionPane.QUESTION_MESSAGE, null, deviceNames, deviceNames[0]); if (deviceName==null) { System.exit(0); } // CaptureDeviceInfo captureDevice; for (int i = 0; i < deviceList.size(); i ++ ) { captureDevice = deviceList.get(i); if( deviceName.equals(captureDevice.getName()) ) { return captureDevice; } } return null; } }
ok,经过测试OK,以作记录!最后将程序和JMF安装包附上。