您的位置:首页 > 其它

JMF实现对USB视频数据捕捉和应用

2010-05-13 12:10 211 查看
一、JMF简介
Java Media Framework (JMF) API是Sun免费提供的基于Java的多媒体框架,利用这个框架能够编写出功能强大的多媒体程序,却不用关心底层复杂的实现细节。
二、使用必备软件
1、安装Java JDK 1.6 版本,配置好Java开发环境;
2、安装好jmf-2_1_1e-windows-i586.exe,该软件会自动配置好相关的windows开发环境(当然如果你是在Linux或者Uinux的环境下开发,你可以去下载相应环境下的jmf驱动包)。
三、流媒体数据的处理方式

1、数据源(DataSource)
数据源(DataSource)就像录像带一样,其中包含了媒体流。JMF数据源根据数据传输怎样被启动分为两类,即Pull Data-Source和Push Data-Source。Pull Data-Source可以是文件或Web页。为这种类型的数据制定的协议包括超文本传输协议(HTTP)和文件(FILE)。使用Pull Data-Source由客户端启动并控制数据的传输。
Push Data-Source是由服务器启动并控制数据传输。Push Data-Source包括广播媒体 (broadcast media),在线组播媒体(Multicast media)和视频点播 (VoD) 。对broadcast media要用到实时传输协议 (Real-time Transport Protocol,RTP)。Push Data-Source可以是麦克风或网络摄像头(Webcam)。
2、播放器(Player)
播放器(Player)是一个对时基媒体进行Render 和 Control的媒体处理者。播放器处理媒体数据的输入流并及时输出它。DataSource被用于传递输入媒体流给Player,至于Player输出媒体流的目的地要依赖媒体被输出的类型,如:声音被输出到扬声器,视频被输出到计算机屏幕。播放器可有6种状态。在整个事件发展过程中,播放器有2个主要状态:Stopped and Started。而Stopped状态又能被分解成5个待命状态:Unrealized, Realizing, Realized, Prefetching, and Prefetched。在正常情况下,Player需要经历上述的每个状态直到它达到开始状态。
3、 处理器(Processor)
处理器(Processor)只是播放器的一个特殊类型,除了继承Player的所有功能外,还可以控制对于输入的媒体流进行何种处理。Processor能发送输出数据到一个输出设备或到一个DataSource。如果数据被发送到一个DataSource,则这DataSource可以被用于另外的Player或Processor的输入,或作为DataSink的输入。Processor还可解析媒体流,执行特殊功效的编码或解码,并可将多个输入轨道的数据融合到一起。如可将分开的视频和音频轨道中的数据流合并成单一的MPEG-1数据流。可以指定输出流的数据类型。
除了在播放器中提到了6种状态外,Processor 对象还有另外的两种新的状 态,这两种状态是在Unrealized状态之后,但是在Realizing状态之前。
(1) Configuring:当调用configure()方法后,Processor对象进入该状态。 在该状态下,Processor对象连接到数据源并获取输入数据的格式信息。 (2)Configured:当完成数据源连接,获得输入数据格式的信息后,Processor 对象就处于此状态。
当一个Processor在Configured状态时,可对某个单一的轨道调用getTrackControls()方法获得对该轨道对象的控制。
4、捕捉设备(Capture devices)
捕捉设备(Capture devices)是指可以捕获到视频或音频数据的硬件。如麦克风可以捕获音频数据、网络摄像头可捕获视频数据,因此它们两个都是数据源(Push DataSource)。捕获到的数据可以被送入到Player或Processor对象进行处理。
5、媒体数据存储和传输(DataSink)
DataSink经常被用于从DataSource读取媒体数据并传送媒体数据到一些输出目的地。JMF提供一默认的DataSink,可以被用于写数据到文件。其它类型的DataSink类能写数据到网络或另外的目的地。注意,Plaryers、Processors和DataSinks都属于MediaHandlers,它们都是从DataSource读取数据。如果想保存捕获的媒体数据到文件,必须用Processor替代Player,然后用DataSink从Processor对象输出的DataSource中读取数据并输出数据到文件。
四、捕捉视频及声音并保存到磁盘实例
1、捕获视频及声音
为了使用视频和音频设备捕获媒体数据,需要以下几个步骤:
(1)通过调用方法CaptureDeviceManage()定位想用的捕获设备。
(2)对定位的设备获得相应的CaptureDeviceInfo对象。
(3)通过CaptureDeviceInfo对象获得MediaLocator并用之创建DataSource。
(4)用DataSource创建Player 或Processor。
(5)Start这个Player或Processor,开始捕获媒体数据。
相应的代码示例如下[1,2]。注意,若单独考虑捕获音视频数据到屏幕,直接用SUN提供的示例代码即可。但为使录制电影文件与屏幕显示不冲突,这里用到了数据克隆。
//定位捕获设备
MediaLocator[] locatorVA = new MediaLocator[2];
locatorVA[0] = new MediaLocator("javasound://0");
locatorVA[1] = new MediaLocator("vfw://0");
//获得MediaLocator并用之创建DataSource
DataSource[] dsc = new DataSource[2];
dsc[0] = Manager.createDataSource(locatorVA[0]);
dsc[1] = Manager.createDataSource(locatorVA[1]);
//将视频与音频合并
DataSource mainSource=Manager.createMergingDataSource(dsc);
//为了能让几个Processor访问同一数据源,需将之转换成可克//隆的数据源
mainSource=Manager.createCloneableDataSource(mainSource);
//用克隆的数据源创建Processor
DataSource camSource = (SourceCloneable)mainSource.
createClone();
Processor processor = Manager.createProcessor(camSource);
// 用类camStateHelper可帮助控制Processor的媒体事件
camStateHelper playhelper = new camStateHelper(processor);
//Configure, Realize然后开始我们的Processor
playhelper.configure(10000);
// Processor的内容描述符必须设置成空,为防止Processor的数//据源来自输出的原始数据
processor.setContentDescriptor(null);
playhelper.realize(10000);
processor.start();
//用Processor的可视组件将电影显示到屏幕上
processor.getVisualComponent().setBackground(Color.white);
centerPanel.add(processor.getVisualComponent(),
2、保存到磁盘
可用 DataSink从Processor对象的输出数据源中读取数据并将之输出到文件中。具体步骤如下:
(1)创建一个MediaLocator对象用于指定想保存的文件位置。
URL movieUrl = file.toURL();
MediaLocator dest = new MediaLocator(movieUrl);
(2)再克隆一份数据源并用之又创建一个Processor。
DataSource recordCamSource = dataSource.cloneCamSource();
Processor recordProcessor = Manager.createProcessor
(recordCamSource);
camStateHelper playhelper = new camStateHelper
(recordProcessor);
(3)对该Processor调用configure
Playhelper.configure(10000);
(4)对每个轨道调用方法getTrackControls和setFormat。音视频的轨道序号应与捕获代码中的音视频顺序一致。
VideoFormat vfmt = new VideoFormat(VideoFormat.JPEG);
AudioFormat afmt = new AudioFormat(AudioFormat.LINEAR);
(recordProcessor.getTrackControls())[0].setFormat(afmt);
(recordProcessor.getTrackControls())[0].setEnabled(true);
(recordProcessor.getTrackControls())[1].setFormat(vfmt);
(recordProcessor.getTrackControls())[1].setEnabled(true);
(5)用Processor的输出数据源创建DataSink,并将数据写到指定格式的文件中。
recordProcessor.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME));
Control control = recordProcessor.getControl ("javax.media.control.FrameRateControl");
playhelper.realize(10000);
DataSink dataSink = Manager.createDataSink(recordProcessor.
getDataOutput(), dest);
recordProcessor.start();
dataSink.open(); //打开文件
dataSink.start();
(6)调用stop()和close()方法,结束数据的捕获。
recordProcessor.stop();
recordProcessor.close();
dataSink.stop();
dataSink.close();
附:相关的源代码以及相关的安装软件已经附带到文件夹!源代码实现了:1、捕捉任意祯的图像,并以.GIF的格式保存图片至硬盘;
2、录制实时视频(包括实时声音),并以.QUICKTIME的格 式保存至硬盘;
3、对于硬件的要求:带USB接口的摄像头(摄像头能正常使 用),能正常使用的麦克风。
对于图片和视频的格式可以进行修改,此处暂略!
源代码软件我已经打包:http://wp-down.51.com/down.php?nid=515386&special_flag=0&DownApp=down
本文出自 “风轻云淡” 博客,请务必保留此出处/article/4544514.html

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/TreeMonster521/archive/2010/05/13/5586331.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: