`
123629996
  • 浏览: 295831 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

JMF捕获摄像头数据存入本地磁盘(java 多媒体)

阅读更多

首先需要说明的是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安装包附上。

3
0
分享到:
评论
4 楼 心之野海 2014-05-10  
我的一个都检测不出来
3 楼 心之野海 2014-05-09  
怎么下载不了呀,楼主
2 楼 chikk 2013-02-06  
请教楼主请教楼主请教楼主
1 楼 chikk 2013-02-06  
我的摄像头有两个,但为什么设备数只能检测到一个?

相关推荐

    Jmf捕获摄像头的示例

    总的来说,JMF捕获摄像头的示例是一个了解Java中多媒体处理的好起点,特别是对于那些需要在老版本Java环境中工作的开发者。然而,随着技术的进步,考虑使用更新的库和框架可能会带来更好的性能和兼容性。

    Java中利用JMF编写摄像头拍照程序.rar_JMF 摄像头_java 摄像头_jmf_拍照_摄像头

    尽管JMF有一定的学习曲线,但它仍然是理解Java多媒体编程的一个重要切入点。开发者需要熟悉JMF的API,理解如何查找、控制和处理来自摄像头的数据,才能成功实现这样的程序。同时,也要注意随着技术的发展,选择更...

    JAVA 使用JMF调用摄像头

    JMF是Java平台上的多媒体处理框架,它允许开发者处理音频、视频等多媒体数据,包括捕获、播放、编码和解码等操作。 首先,要理解JMF的基本概念。JMF是一种服务提供者接口(SPI),它定义了处理多媒体数据的一系列...

    Java中利用JMF编写摄像头拍照程序实例

    ### Java中利用JMF编写摄像头拍照程序实例 #### 背景与介绍 在现代软件开发中,多媒体处理是一项非常重要的技术。Java Media Framework (JMF) 是Sun ...希望本文能帮助你在Java多媒体编程领域迈出坚实的一步。

    JAVA读取摄像头(JMF)

    ### JAVA读取摄像头...通过上述分析,我们可以看到通过 JMF 在 Java 中实现摄像头捕获和图像处理等功能的具体实现方法和技术细节。这不仅适用于开发桌面应用,还可以扩展应用于服务器端或其他复杂的多媒体处理场景。

    java多媒体框架JMF2.1.java多媒体框架JMF2.1

    Java多媒体框架JMF(Java Media Framework)是Sun Microsystems公司开发的一个开源框架,主要用于处理音频、视频和流媒体数据。JMF2.1是这个框架的一个版本,它为Java开发者提供了在应用程序中集成多媒体功能的能力...

    jmf调用摄像头成功例子

    Java Media Framework (JMF) 是一个开源的Java平台框架,用于处理多媒体数据,包括音频、视频和流媒体。在这个“jmf调用摄像头成功例子”中,我们将深入探讨如何使用JMF来访问和捕获来自计算机摄像头的视频流。这个...

    java 视频 摄像 调用电脑摄像头

    Java Media Framework (JMF) 是Java平台上的多媒体处理框架,它提供了对音频、视频捕获和播放的支持。在调用摄像头方面,JMF提供了一个名为`CaptureDevice`的接口,通过这个接口可以获取摄像头设备并进行视频流的...

    JMF摄像头麦克风视频音频的捕获及播放

    1. 示例代码:演示如何使用JMF API捕获摄像头视频和麦克风音频。 2. 讲解文档:解释代码的工作原理和关键步骤。 3. 测试用例:用于验证代码功能的实例。 4. 运行脚本:可能包含启动和停止捕获及播放的命令。 学习和...

    JMF捕获音频和视频

    JMF捕获音频和视频.wps

    Java利用JMF编写摄像头拍照程序.doc

    总的来说,Java利用JMF编写摄像头拍照程序涉及到的主要知识点有:JMF框架的使用,摄像头设备的管理和访问,视频帧的捕获,图像数据的转换以及文件的保存操作。虽然JMF已经过时,但理解这些基本概念对于学习其他...

    java jmf摄像头控件的运用

    总的来说,"java jmf摄像头控件的运用"涉及到Java编程、多媒体处理、摄像头操作等多个技术领域,是学习和实践Java多媒体应用的好起点。通过学习和实践,开发者能够构建自己的摄像头控制应用程序,满足各种多媒体需求...

    java 捕获摄像头视频图像系统

    1. **Java Media Framework (JMF)**: JMF是Java平台的标准组件,用于处理多媒体数据,包括音频和视频。在Java中捕获摄像头图像时,JMF是一个常用的框架,它提供了一个接口来注册和管理不同的媒体源,如摄像头。 2. ...

    java调用摄像头拍照

    JMF 是一个开源平台,允许开发者创建、播放和捕获多种媒体数据,而JavaFX则包含更现代和丰富的UI组件,其中包括对多媒体的支持。 1. **使用Java Media Framework (JMF)** JMF 提供了API来访问和控制多媒体设备,如...

    JMF摄像头视频采集示例

    学习和理解这个示例,对于熟悉Java多媒体编程和JMF的使用至关重要。它可以帮助开发者了解如何在Java环境中集成摄像头功能,为后续的多媒体应用开发打下基础。同时,也可以借此机会研究如何扩展此示例,实现网络传输...

    JMF识别摄像头

    1. **JMF介绍**:JMF是一个开源的API,由Sun Microsystems开发,用于在Java应用程序中实现多媒体播放、捕获和处理。它支持多种媒体格式,包括音频、视频和流媒体。 2. **摄像头识别**:JMF提供了接口和类,可以用来...

Global site tag (gtag.js) - Google Analytics