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



一、 JMF简介 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />



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状态之前。



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



对于图片和视频的格式可以进行修改,此处暂略!



转载于:https://blog.51cto.com/beyond99/299498