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

JMF实现对USB视频数据捕捉和应用
一、JMF简介

Java Media Framework (JMF) APISun免费提供的基于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-SourcePush Data-SourcePull Data-Source可以是文件或Web页。为这种类型的数据制定的协议包括超文本传输协议(HTTP)和文件(FILE)。使用Pull Data-Source由客户端启动并控制数据的传输。

Push Data-Source是由服务器启动并控制数据传输。Push Data-Source包括广播媒体 (broadcast media),在线组播媒体(Multicast media)和视频点播 (VoD) 。对broadcast media要用到实时传输协议 (Real-time Transport ProtocolRTP)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可以被用于另外的PlayerProcessor的输入,或作为DataSink的输入。Processor还可解析媒体流,执行特殊功效的编码或解码,并可将多个输入轨道的数据融合到一起。如可将分开的视频和音频轨道中的数据流合并成单一的MPEG-1数据流。可以指定输出流的数据类型。

除了在播放器中提到了6种状态外,Processor 对象还有另外的两种新的状 态,这两种状态是在Unrealized状态之后,但是在Realizing状态之前。

   (1) Configuring:当调用configure()方法后,Processor对象进入该状态。 在该状态下,Processor对象连接到数据源并获取输入数据的格式信息。  (2)Configured:当完成数据源连接,获得输入数据格式的信息后,Processor 对象就处于此状态。

当一个ProcessorConfigured状态时,可对某个单一的轨道调用getTrackControls()方法获得对该轨道对象的控制。

4、捕捉设备(Capture devices)

捕捉设备(Capture devices)是指可以捕获到视频或音频数据的硬件。如麦克风可以捕获音频数据、网络摄像头可捕获视频数据,因此它们两个都是数据源(Push DataSource)。捕获到的数据可以被送入到PlayerProcessor对象进行处理。

5、媒体数据存储和传输(DataSink

DataSink经常被用于从DataSource读取媒体数据并传送媒体数据到一些输出目的地。JMF提供一默认的DataSink,可以被用于写数据到文件。其它类型的DataSink类能写数据到网络或另外的目的地。注意,PlaryersProcessorsDataSinks都属于MediaHandlers,它们都是从DataSource读取数据。如果想保存捕获的媒体数据到文件,必须用Processor替代Player,然后用DataSinkProcessor对象输出的DataSource中读取数据并输出数据到文件。

四、捕捉视频及声音并保存到磁盘实例

1、捕获视频及声音

为了使用视频和音频设备捕获媒体数据,需要以下几个步骤:

(1)通过调用方法CaptureDeviceManage()定位想用的捕获设备。

(2)对定位的设备获得相应的CaptureDeviceInfo对象。

(3)通过CaptureDeviceInfo对象获得MediaLocator并用之创建DataSource

(4)DataSource创建Player Processor

(5)Start这个PlayerProcessor,开始捕获媒体数据。

相应的代码示例如下[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、保存到磁盘

可用 DataSinkProcessor对象的输出数据源中读取数据并将之输出到文件中。具体步骤如下:

(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)对每个轨道调用方法getTrackControlssetFormat。音视频的轨道序号应与捕获代码中的音视频顺序一致。

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接口的摄像头(摄像头能正常使 用),能正常使用的麦克风。

对于图片和视频的格式可以进行修改,此处暂略!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章