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

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

JMF实现对USB视频数据捕捉和应用相关推荐

  1. maven mybatis mysql_Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问...

    标签: 本篇内容还是建立在上一篇Java Web学习系列--Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Ja ...

  2. 使用underscore模块的template功能实现对HTML的数据注入+template实现数据注入(后面更新)

    使用underscore模块的template功能实现对HTML的数据注入 安装underscore 代码是:npm i underscore 查看是否安装成功 server.js文件 var htt ...

  3. Python利用xlsxwriter实现对Excel写入数据的样式调整(字体,居中等)

    声明:参考大佬文章 参考网上资料发现很少有用xlsxwriter实现用Python对Excel写入数据的同时进行字体样式调整操作的,因为我用的也是xlsxwriter,所以查找总结了一个用xlsxwr ...

  4. HomeAssistant实现对UPS的数据监控

    一.前言 之前写在<米家接入HomeKit系列>系列文章的时候,我们讲解了如何使用通过HomeAssistant和HomeBridge来将米家设备接入HomeKit中.细心的同学应该发现我 ...

  5. python修改excel数据-python之实现对excel表格数据的修改

    题目: 有一个名为produceSales.xlsx的表格文件,每一行代表一次单独的销售纪录,第一列(A)是产品名字,第二行(B)是产品价格,第三行(C)是销售的数量,第四行(D)是本次销售总收入(根 ...

  6. python编程处理excel数据_python实现对excel进行数据剔除操作实例

    前言 学习Python的过程中,我们会遇到Excel的各种问题.下面这篇文章主要给大家介绍了关于python对excel进行数据剔除操作的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详 ...

  7. SpringBoot中集成Redis实现对redis中数据的解析和存储

    场景 SpringBoot中操作spring redis的工具类: SpringBoot中操作spring redis的工具类_霸道流氓气质的博客-CSDN博客 上面讲的操作redis的工具类,但是对 ...

  8. JAVA 通讯录 —— 实现对XML文件数据的增删改查

    心血来潮,带着好奇写了人生中第一篇博客,哈哈哈哈 ~ 嗝 ~ ~   这篇文章主要就是分享自己做的一次项目作业,一是为了分享,二是用另外一种方式保存自己的代码 嘻嘻嘻 ~.还是个编程萌新,所以有啥写的 ...

  9. 实现对easyui-datagrid的数据行批量修改(包括修改内容和删除)

    先上一个easyui-datagrid的数据. 而我们要实现的功能是1.对三条记录进行批量的删除和批量的修改状态. 1.批量的删除 我们选择传入三条记录的id值,并利用service层的deleteB ...

  10. Qt实现对json文件的解析

    json是一种轻量级的数据结构,其内部的结构是一种键值对(key-value)的组合,最外层是{ }.key是带双引号的字符串常亮,用于获取和存储:value的值可以是bool变量,字符串常量,对象或 ...

最新文章

  1. python requests 动态加载_python requests 高级用法
  2. 讯飞智能语音先锋者:等到人机交互与人类交流一样自然时,真正的智能时代就来了...
  3. 发掘数据中的信息 -- 数据探索之描述性统计
  4. 【翻译】SQL Server索引进阶:第八级,唯一索引
  5. Win 8 app 获取窗口的宽度和高度, 本地化, 及文本读取
  6. C#——事件(Event)DEMO[闻鸡起舞]
  7. VTK:PolyData之MergeSelections
  8. OpenCV学习笔记之Mat
  9. 树莓派开机运行python脚本_【树莓派】开机自启动脚本方法之一(.Desktop文件)...
  10. 祖龙娱乐王远明:如何用UE4做出3A级材质和天气系统?
  11. CoralCache:一个提高微服务可用性的中间件
  12. 百度网页搜索无法通过域名访问_网站换域名或网页内容改版对网站的影响以及网站换域名注意事项...
  13. php is_subclass_of,PHP is_subclass_of函数的一个BUG和解决方法
  14. 电脑主板跳线_电脑主板跳线连接图
  15. 猫工智能:卷积神经网络层的实现
  16. 【MySQL】时间格式转换 DATE_FORMAT函数篇
  17. ISTA与稀疏编码 both python matlab
  18. Oracle数据库锁表查询与解锁处理详解
  19. echarts 南丁格尔玫瑰图属性设置
  20. 关于求职及面试的一些小技巧

热门文章

  1. VPP 助你创新更高效、更灵活的报文处理方案
  2. 并发(二)——linux内核同步机制分析
  3. AndroidOpenCV摄像头预览旋转90度问题
  4. ubuntu怎么将Dash切换位bash
  5. DLL错误之——无法加载DLL***.dll:找不到指定的模块(异常来自HRESULT:0x8007007E)问题的终极感悟
  6. ITU-R BT.656 , 帧 , 场 === 模拟视频信号采集的处理,以及奇偶场
  7. 解决android Studio 安装完运行提示failed to find build tools revision 24.0.2
  8. Linux shell__文件操作
  9. linux c 静态连接,Linux cmake 静态链接boost
  10. pythonweb测试_python的web自动化测试