package org.bo;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Vector;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.DataSink;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.Processor;
import javax.media.ProcessorModel;
import javax.media.control.FormatControl;
import javax.media.format.VideoFormat;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;
import javax.media.protocol.SourceCloneable;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class MainFrame extends JFrame {
CaptureDeviceInfo captureDevice;
Component visualComponent;
Component controlPanelComponent;
Processor processor;
Player player;
DataSink fileWriter;
FormatControl formatControl;
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("视频采集软件");
contentPane = (JPanel) this.getContentPane();
//
this.captureDevice = getCaptureDeviceInfo();
//
try {
DataSource source = Manager.createDataSource(captureDevice.getLocator());
DataSource cloneableSource = Manager.createCloneableDataSource(source);
player = Manager.createRealizedPlayer(((SourceCloneable)cloneableSource).createClone());
//获取默认格式
formatControl = (FormatControl) player.getControl("javax.media.control.FormatControl");
Format defaultFormat = formatControl.getFormat();
//
FileTypeDescriptor outputType = new FileTypeDescriptor(FileTypeDescriptor.MSVIDEO);
ProcessorModel processorModel = new ProcessorModel(cloneableSource, new Format[]{ defaultFormat }, outputType);
processor = Manager.createRealizedProcessor(processorModel);
} catch (Exception e) {
processException(e);
}
//
// controlPanelComponent = player.getControlPanelComponent();
// if (controlPanelComponent != null) {
// contentPane.add("North", controlPanelComponent);
// }
visualComponent = player.getVisualComponent();
if (visualComponent!=null) {
pnlVideo.add(visualComponent);
contentPane.add(pnlVideo);
}
//
btnStop.setEnabled(false);
pnlControl.add(btnStart);
pnlControl.add(btnStop);
// pnlControl.add(formatControl.getControlComponent());
// pnlControl.setPreferredSize(new Dimension(120, 0));
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);
}
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;
}
private CaptureDeviceInfo getCaptureDeviceInfo()
{
Format videoFormat = new VideoFormat(VideoFormat.RGB);
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;
}
}
JMF摄像头视频采集示例
需积分: 0 102 浏览量
更新于2008-10-15
1
收藏 1.84MB RAR 举报
Java Media Framework (JMF) 是一个开源的Java平台框架,用于处理多媒体数据,包括音频、视频和流媒体。在这个“JMF摄像头视频采集示例”中,开发者为学员提供了一个基础的教程,演示如何利用JMF捕获并显示来自本地摄像头的视频流。
JMF的核心功能在于提供了一个接口,使得开发者可以方便地访问和控制多媒体设备,如摄像头和麦克风。在描述中提到的示例,其目标是捕获摄像头的视频流,并将其显示在一个窗口中。虽然最初计划实现网络传输功能,但最终被修改为将视频流保存到磁盘文件。这表明该示例涵盖了视频采集、处理和存储的基本流程。
1. **视频采集**:JMF通过`CaptureDevice`接口来获取视频源,通常是摄像头。开发者首先需要注册并初始化设备,然后创建一个`Player`实例来播放捕获的视频。在这个过程中,可能需要设置各种参数,如帧率、分辨率和编码格式。
2. **视频显示**:JMF的`Player`类可以与Java Swing或AWT组件结合,将视频流渲染到窗口上。这通常涉及到创建一个`Component`(如`JFrame`),然后将`Player`的视图组件添加到这个窗口中,实现视频的实时预览。
3. **视频处理**:虽然这个例子没有明确提到视频处理,但在实际应用中,开发者可能需要对视频进行裁剪、调整亮度、对比度等操作。JMF提供了`TransformStream`接口,允许对视频流进行这些操作。
4. **视频存储**:由于网络传输功能被替换为保存到磁盘,这意味着开发者使用了JMF的`FileSink`接口或者类似的方法,将视频流转化为文件。这通常涉及设置输出格式(如AVI或MP4)和编码参数,然后启动一个`Controller`来控制录制过程。
5. **文件命名**:压缩包中的“JMF_Capturing”可能是源代码文件夹,包含相关的Java类、配置文件以及可能的测试用例。这些文件将详细展示如何配置和使用JMF进行视频采集和存储。
学习和理解这个示例,对于熟悉Java多媒体编程和JMF的使用至关重要。它可以帮助开发者了解如何在Java环境中集成摄像头功能,为后续的多媒体应用开发打下基础。同时,也可以借此机会研究如何扩展此示例,实现网络传输或其他高级功能。
accp206
- 粉丝: 57
- 资源: 2
最新资源
- 美国旧金山28R粗糙跑道数据
- Java编程语言详解与实战指南:从基础到进阶
- 车辆,汽车检测1-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 六轴,scara机器人运动学分析,建模和运动控制 matlab,simulink,simscape.机器人工具箱,DH建模 Pd控制,滑模控制,模糊控制等等
- 课程设计-花卉识别源代码
- “如何帮助缺乏学习动力的小孩子”主题讲座.pptx
- “青少年心理健康”讲座.pptx
- “遵守交通规则,安全出行”知识讲座.pptx
- “师德师风教育”培训讲座教案.pptx
- 如何阅读分享一本书讲座课件.pptx
- 开学第一课“收心主题班会”教案.pptx
- 初中语文开学第一课“走近语文 魅力无穷”.pptx
- LLC全桥仿真方案 用的是数字控制方式 psim软件,可以很直观的学习认识各个位置波形 通过调整PI参数来调试电源 尤其对初学者帮助很大 同时包含mathcad计算
- Python从入门到精通:基础知识与高级应用全面解析
- 储能选址定容,33节点,matpower潮流计算,计算目标函数 考虑储能SOC、储能额定容量、功率约束 NSGA2多目标:储能投资费用和电压偏差最小 熵权TOPSIS确定最优解
- Swift编程语言全面教程:从入门到精通