jmf能用在android jni视频处理里处理视频吗

1277人阅读
最近由于项目要求要获取视频.
在网上找了些代码又对其修改.
这个是视频类.
package com.cayden.
import java.awt.F
import java.awt.P
import java.io.IOE
import javax.media.CaptureDeviceI
import javax.media.CaptureDeviceM
import javax.media.ControllerE
import javax.media.ControllerL
import javax.media.M
import javax.media.MediaL
import javax.media.NoPlayerE
import javax.media.P
import javax.media.PrefetchCompleteE
import javax.media.RealizeCompleteE
import javax.media.bean.playerbean.MediaP
import javax.swing.JF
class CaptureVideo extends JFrame implements ControllerListener {
private CaptureDeviceI
private MediaLocator mediaL
private String url = "vfw:Microsoft WDM Image Capture (Win32):0";
public CaptureVideo() {
infor = CaptureDeviceManager.getDevice(url);
mediaLocator = infor.getLocator();
public void player() {
player =Manager.createPlayer(mediaLocator);//利用mediaLocator创建Player
player.addControllerListener(this);
player.realize();
} catch (NoPlayerException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
public void createComponent() {
setTitle("视频信号");
setBounds(100,100,640,480);
panel = new Panel();
if((com = player.getVisualComponent()) != null) {
panel.add(com);
add(panel);
setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
public synchronized void controllerUpdate(ControllerEvent arg0) {
// TODO 自动生成方法存根
if(arg0 instanceof RealizeCompleteEvent) {
System.out.println("realized");
createComponent(); //将播放器添加到Panel上
player.prefetch();
if(arg0 instanceof PrefetchCompleteEvent) {
player.start();
System.out.println("prefetched");
下面的是测试类
package com.cayden.
public class Test {
public static void main(String[] args) {
CaptureVideo video = new CaptureVideo();
video.player();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1325578次
积分:14033
积分:14033
排名:第627名
原创:236篇
转载:18篇
评论:596条
(1)(1)(3)(2)(2)(1)(1)(2)(3)(2)(1)(2)(2)(5)(4)(4)(1)(1)(2)(1)(3)(2)(1)(3)(4)(1)(3)(1)(1)(1)(4)(5)(5)(5)(11)(8)(5)(11)(6)(6)(6)(7)(1)(5)(5)(9)(4)(2)(3)(8)(1)(2)(2)(1)(33)(1)(2)(2)(2)(4)(9)(2)(1)(8)(5)(2)(1)Java(17)
JMF(Java Media Framework)是Java媒体框架,包含了许多用于处理多媒体的API可以让基于JAVA的应用实现音频、视频的捕捉、处理、播放、传输等功能。利用它,可以实现音、视频播放,网络视频聊天、视频会议等功能。
本次主要是初步学习如何使用JMF调用摄像头,简单步骤记录如下:
1、下载JMF
用到的JMF版本为 jmf-2_1_1e-windows-i586,已上传资源至CSDN下载,点击链接即可。
2、运行 jmf-2_1_1e-windows-i586
运行 jmf-2_1_1e-windows-i586.exe 文件,主要会在选定目录下生成bin、dos、lib等三个文件夹。
(运行结束,会提示重启生效。其实不重启也没有关系~)
3、在 myeclipse 中导入相应 JAR 文件
build path -& configure build path -& libraries -& add external JARs
找到 jmf-2_1_1e-windows-i586.exe 安装目录,导入 lib 中相关 jar 文件(用到的主要是jmf.jar、mediaplayer.jar、sound.jar)
import java.awt.BorderL
import java.util.V
import javax.media.CaptureDeviceI
import javax.media.M
import javax.media.MediaL
import javax.media.P
import javax.swing.JF
public class CameraCapture extends JFrame {
public CameraCapture() throws Exception {
//先启动摄像头,再做后续的初始化窗体,可保证正确显示摄像头
initCapture();
//设置窗体的一些属性
this.setTitle(&CameraCapture&);
this.setBounds(500, 100, 800, 500);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
* 初始化摄像头
private void initCapture() throws Exception {
//获取所有音频、视频设备
Vector&javax.media.CaptureDeviceInfo& deviceList = javax.media.CaptureDeviceManager.getDeviceList(null);
//获取视频设备,视频设备以vfw打头
CaptureDeviceInfo cameraDevice =
for(CaptureDeviceInfo cameraDeviceTmp :deviceList){
if (cameraDeviceTmp.getName().startsWith(&vfw&)) {
cameraDevice = cameraDeviceT
if(cameraDevice == null){
throw new Exception(&找不到摄像头设备&);
//创建视频播放器
MediaLocator ml = cameraDevice.getLocator();
Player player = Manager.createRealizedPlayer(ml);
if (player == null){
throw new Exception(&创建摄像头播放器失败&);
//播放视频
player.start();
//将播放器加入窗体
Component comp =
if ((comp = player.getVisualComponent()) != null)
add(comp, BorderLayout.CENTER);
public static void main(String[] args) {
CameraCapture mc = new CameraCapture();
} catch (Exception e) {
e.printStackTrace();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:65523次
积分:2354
积分:2354
排名:第12206名
原创:171篇
转载:36篇
(3)(15)(5)(2)(1)(4)(1)(1)(8)(10)(10)(6)(7)(14)(12)(18)(31)(55)(4)&&&&解决jmf 在win7下,开机后只能使用一次视频功能
&解决jmf 在win7下,开机后只能使用一次视频功能
jmf插件安装完成后,在win7 64位环境下,部分电脑开机只能使用一次视频功能,再次调用时弹出捕货源,提示无法连接到CaptureDivice.
修改 com.sun.media.protocol.vfw.VFWSourceStream.doConnect() 用while获取相关信息即可解决,即使弹出捕货源依然可以使用视频功能
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
解决jmf 在win7下,开机后只能使用一次视频功能
所需积分:1
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
解决jmf 在win7下,开机后只能使用一次视频功能
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员&&&&Java媒体框架JMF 音视频处理最新类包(共4个jar包)
Java媒体框架JMF 音视频处理最新类包(共4个jar包)
JMF,意为Java媒体框架(JMF)。该核心框架支持不同媒体(如:音频输出和视频输出)间的时钟同步。它是一个标准的扩展框架,允许用户制作纯音频流和视频流。
  JMF实际上是Java的一个类包。JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能。这些功能包括:媒体捕获、压缩、流转、回放,以及对各种主要媒体形式和编码的支 持,如M-JPEG、H.263、MP3、RTP/RTSP (实时传送协议和实时流转协议)、Macromedias Flash、IBM的HotMedia和Beatniks的Rich Media Format (RMF)等。JMF 2.1.1还支持广受欢迎的媒体类型,如Quicktime、Microsofts AVI和MPEG-1等。此外,JMF 2.1.1软件中包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。
  Sun以四种不同的专用版本提供JMF 2.1.1技术,满足专业开发人员的各类需求,第一个是一个轻便型版本,它完全采用Java语言编写,适用于任何Java兼容系统。此外,开发人员还可选 择分别适用于Solaris、Windows或Linux等操作系统的性能最优化软件包,以提高性能和能力。
  JMF 2.1.1软件也是Java Media系列软件的一部分。Java Media系列软件包括Java 3D、Java 2D、Java Sound和Java Advanced Imaging等API。采用各种Java Media API,软件开发商人员就能容易、快速地为他们已有的各种应用程序和客户端Java小程序增添丰富的媒体功能,如流式视频、3D图像和影像处理等。就是 说,各种Java Media API发挥了Java平台的固有优势,将&编写一次,到处运行&的能力扩展到了图像、影像和数字媒体等各种应用领域,从而大大缩减了开发时间和降低了开发 成本。
  JMF系统介绍
  [ Adigan 发表于
17:25:15 ]
  一.简介
  1.1JMF 体系结构简介
  在开发JMF 应用程序之前要完全理解JMF 的体系架构、接口和类。就拿我们的家用摄像机系统作个例子。首先用摄像机拍摄内容,拍摄下来的内容录制在DV带中。DV带可以放在放像机里播放、放像机提供视频信号给电视机,提供音频信号给音箱,这样我们就可以在电视机上看到画面,从音箱里听到声音。JMF API 提供的也是同样的模型。
  JMF 提供的模型可大致分为七类
  * 数据源(Data source)
  * 截取设备(Capture Device,包括视频和音频截取设备)
  * 播放器(Player)
  * 处理器(Processor)
  * 数据池(DataSink)
  * 数据格式(Format)
  * 管理器(Manager)
  1.2 如何应用JMF捕获媒体数据
  可以应用JMF从摄像头和麦克风中采集数据,采集后的数据可以被处理、保存、渲染为以后应用。
  捕获媒体数据需要做以下工作。1.定位所需要用的捕获设备,可以通过查询CaptureDeviceManager来定位。2.获取这个捕获设备的信息CaptureDeviceInfo对象。3.从CaptureDeviceInfo对象中获取捕获设备的位置Medialocator。4.利用MediaLocator创建DataSource。5.使用DataSource创建Player或是Processor。6.然后启动Player就开始了媒体的捕获。
  如果只是想观看捕获的内容,只需要使用捕获数据源创建播放器Player即可。如果想把捕获的数据发送到网络或者保存起来,就需要创建处理器Processor。
  可以从CaptureDeviceManager中获取捕获设备的信息。CaptureDeviceManager是可在JMF中使用的全部捕获设备的注册中心。可以通过调用CaptureDeviceManager的getDeviceList方法获取可用的捕获设备列表。
  每个捕获设备都由CaptureDeviceInfo对象代表,要获取一个特定的设备只需要调用CaptureDeviceManager的getDevice方法。
  从特定的设备捕获媒体数据,需要从它的CaptureDeviceInfo对象中获取这个设备的位置信息MediaLocator。可以用MediaLocator直接构建一个Player或者Processor。还可以用MediaLocator构建一个DataSource作为Player的输入。当Play开始的播放的时候,就开始捕获过程。
  一个捕获设备通常有一系列属性可以进行配置。通常控制分为2种,一种是端口控制PortControl,另一种是监视MonitorControl。可以通过调用捕获DataSource的getControl方法,来获取这两种控制对象。
  和其他的控制对象一样,对于PortControl或者MonitorControl都可以通过调用getControlCompent方法来得到它们的可视化组件。这些组件可以添加到Applet中或者应用程序中,这样用户可以和这些控制对象交互。
  处理显示控制组件,还可以显示标准的Player控制组件。
  1.3如何使用RTP接收和发送流媒体数据
  JMF Player 和 Processor 可以提供显示、获取、转换RTP 数据流的机制。
  可以按照标准的方式通过Manager为RTP数据流创建Player。使用包含RTP Session的MediaLocator作为参数,调用Manager的createPlayer(MediaLocator)来创建Player。也可以用某个接收数据流的DataSource作为参数来创建Player。
  如果用MediaLocator作为参数来创建Player, Player 只会显示Session中检测到的第一个RTP 数据流。如果想播放Session中的所有视频流,则需要调用SessionManager为每个接收数据流创建一个Player。
  当使用MediaLocator为RTP Session 创建Player,Manager为Session中的第一个数据流创建Player。当检测到数据时,Player发出RealizeCompleteEvent。
  通过监听RealizeCompleteEvent,可以确定数据是否到了以及Player是否可以播放任何数据。一旦Player发出这个事件,就可以获取Player的可视组件和控制组件。
  要注意的是,如果在没有检测到Session中数据时,Player 是不会结束Realizing状态的。对于Rtp 媒体流Player 不能试图调用Manager的CreateRealizedPlayer。如果调用,会引起死锁。
  1.4如何在网络发送流媒体数据
  在发送RTP数据流之前,需要应用Processor产生RTP编码的数据源。通过构建一个SessionManager或者是DataSink来控制传输过程。
  Processor处理器的输入可以是现有的媒体文件,也可以是实时捕获的数据。对于现有的媒体数据,可以使用MediaLocaotr来代表媒体文件。并根据MediaLocator来创建Processor。对于捕获的媒体数据,一个捕获数据源Capture DataSource 会用作Processor的输入。
  有两种方式来发送RTP数据流,一种是用MediaLocator作为RTP session的参数,调用Manager的createDataSink方法来创建一个RTP DataSink。另一种方式是利用session manager 来创建发送数据流,并控制传输过程。
  当利用MediaLocator来构建RTP DataSink的时候,你只能发送DataSource中的第一个数据流。如果需要在一个进程中发送多个RTP数据流或者需要监控进程的统计状态,就需要直接使用SessionManager。
  无论采用哪种方式传输RTP数据流,都需要做如下工作:
  1、使用DataSource创建Processor,这个DataSource代表你要传输的数据
  2、设置Processor的输出为RTP 编码的数据
  3、取得Processor的输出作为DataSource
  二.具体的试验-应用JMF开发视频应用
  2.1配置开发环境
  需要J2SDK,JRE1.42, JMF Windows Performance Pack,JMF 的 下载地址:/products/java-media/jmf/2.1.1/setup.html 针对WINDOWS 用户,可下载Windows Performance Pack。只有安装Windows Performance Pack才支持视频、音频捕获。下载后会自动安装,自动配置路径。安装后需去测试一下是否安装成功。测试地址:/products/java-media/jmf/2.1.1/jmfdiagnostics.html
  2.2用APPLET在浏览器中播放视频短片
  在浏览器中实现APPLET 视频播放中用到了两个基本概念 manager ,和player。JMF APPLET 是播放视频文件的过程是这样的。首先,提供媒体文件的位置作为创建PLAYER的参数。Player创建后会根据媒体文件的格式寻找解码器,并且进行初始化。然后为PLAYER 添加一个ControllerListener,用来监听PLAYER的状态。通过监听player 的状态采取不同的措施。在Player 发出RealizeCompleteEvent的时候,可以获取player 的VisualComponent 宽度,高度,VisualControllpane的宽度,高度。最后一步调用player的start方法,就可以显示媒体文件的内容了。如果不使用PLUGIN,JMF 只支持标准的AVI,MOV,WAV 文件。对于流行的MPEG4视频文件,MP3并不支持。通过安装解码器,可以播放这些文件。
  2.3采集摄像头数据
  采集摄像头数据,需要两步工作。连接视频设备,然后获取视频设备的数据。视频,音频设备在Jmf Performance Pack 安装时会在JMF Registry中注册自己的设备名。需要连接摄像头时,可以通过查找摄像头的设备名来连接摄像头。具体的实现步骤,首先要得到Device的名字,有两种方法可以办到,
  方法一
  通过菜单,把系统支持的Device都列出来,根据客户的选择来确定。
  方法二
  用程序来判断。在第二种方法中,通过传递一个Format 对象到CaptureDeviceManager的getDeviceList 方法中,获得Device的名字。得到Device 的名字以后,可以获得CaptureDeviceInfo,从而得到MediaLocator。第一部分连接摄像头的工作就完成了。下一步工作是捕获摄像头视频,并显示出来。有视频设备构成的数据源可分为2种,例如照相机这种设备,属于Pull DataSource,用的时候才使用。类似于摄像头这种设备构成的数据源属于Push Datasource,源源不断的发送视频数据。以获取的MediaLocator 作为参数构建Player,就可以播放摄像头内容了。
  2.4获取摄像头视频数据和麦克风音频数据
  基本步骤是首先获取视频、音频捕获设备的信息,然后再根据取得的设备信息确定设备的位置。找到设备的位置以后,调用Manager的CreatePlayer方法创建Player,当Player开始播放的时候,就开始了捕获的过程。
  有多种方法获得捕获设备信息,可以通过查询指定的格式,也可以查询特定的设备名字。具体步骤如下:
  1. 先把所有的捕获设备调出来
  2. 所有的视频捕获设备的名字都是以vfw开头的,所以取得捕获设备列表中以vfw 开头的设备名字就是视频捕获设备
  3. 获取设备的medialocator地址
  4. 创建Player,当Play开始的时候,就开始了视频捕获的过程
  2.5保存摄像头数据为视频文件
  首先是找到捕获设备,然后取的捕获设备的位置信息。如果要保存所采集的数据,就要创建一个处理器。然后将处理器的输出作为数据池的输入。当启动数据池的时候,就可以把捕获的数据保存成文件了。具体步骤如下:
  1. 获取视频捕获设备的medialocator地址
  2. 以获取的medialocator为参数,创建Processor
  3. 设置Processor,输出类型为AVI格式
  4. 以Processor的输出为参数,创建数据源
  5. 建立一个保存文件位置的MediaLocator
  6. 以输入数据源和输出数据源为参数,建立一个DATASINK
  7. 调用Processor的StreamWriterControl,设置Processor控制生成文件的大小
  8. 设置完毕,可以启动Processor和DataSink来保存捕获数据了
  2.6 捕获音频、视频数据为QuickTime格式的文件
  使用处理器模型来捕获实时的视频、音频数据并且将数据轨道进行编码、混合,最后保存为QuickTime 格式的文件。
  首先构建一个处理器模型,设定好特定的数据轨道和输出内容格式。然后使用这个处理器模型来创建一个处理器。处理器会自动连接到符合文件格式要求的捕获设备。具体步骤如下:
  1. 设定要输出的音频格式和视频格式
  2. 设定要输出的文件类型为QuickTime格式
  3. 以数据轨道输出格式和文件输出类型为参数,创建ProcessorModel
  4. 由ProcessorModel对象创建Processor对象
  5. 以Processor的输出为参数创建数据源
  6. 建立一个记录保存文件的MediaLocator
  7. 创建DataSink
  8. 开始保存数据文件,启动处理器
  9. 当结束捕获视频时,停止处理器,并关掉它
  10. 当数据池接到EndOfStream事件时,停止保存文件。
  2.7 发送实时媒体数据
  如果需要将媒体数据发送到网络,首先需要用Processor生成RTP编码的数据源,然后创建SessionManager或者DataSink来控制传输过程。具体步骤如下:
  1. 获取视频采集设备
  2. 创建Processor,连接到视频采集设备
  3. 等待,直到processor的状态变成configured,设置输出格式为RAW_RTP
  4. 列出所有的和数据轨道相关的控制器
  5. 遍历这些控制器,找到可以控制输出格式的控制器
  6. 找到了数据轨道的格式控制器之后,设置输出格式,输出格式输出为VideoFormat.JPEG_RTP
  7. 准备工作已经做好,可以调用Processor的realize方法
  8. 当Processor进出realized状态以后,可以取得Processor的输出作为数据源
  9. 可以把这个数据源作为参数传递给manager,通过manager创建一个RTP的数据池。
  10. 先设置一个发送数据流的多播目的网址
  11. 确定了数据源和发送地址,可以建立数据池DataSink了,建立成功后调用open()和start()方法,就可以在网上以多播方式发送捕获的内容了
  2.8 接收实时视频数据
  接收网上传输的数据流时,首先要构建一个MediaLocator来描述RTP 进程,Manager为进程中的第一个数据流创建播放器,当从进程中检测到数据时,Player会发出RealizeComplete事件。
  通过监听RealizeComplete事件,你可以确定是否有数据到了,还可以确定Player是否准备好播放数据了。当Player发出这个事件时,就可以获取播放器的可视面板和控制面板了。具体实现步骤如下:
  1. 确定RTP 数据源的地址,例如:String url= &rtp://224.144.251.104:49150/audio/1&
  2. 以RTP数据源地址为参数,创建MediaLocator
  3. 以MediaLocator为参数,创建Player
  4. 为PLAYER添加监听器,以便监听RealizeComplete事件
  三. 实验效果总结
  JMF2.0 支持媒体捕获,并且考虑到了程序开发者需求。允许程序开发者在媒体处理、媒体控制上添加自己的控制器。JMF 提供的插件的架构使得直接访问媒体数据成为可能。这样JMF可以更方便的被扩展。JMF的设计目的是使开发简便、支持媒体捕获、支持使用JAVA技术开发媒体传输以及视频会议等应用、支持高级开发者开发插件扩展JMF应用,新的特性还可以和原有的系统很好的融合。允许开发者开发定制的,可下载的编码器、处理器、分离器和组合器。
  JMF的类库还可以提供对RTP(实时传输协议)的支持。RTP支持在网上实时的发送、接收媒体流。RTP可以用在开发视频点播、音频点播或者网上的交互内容服务等应用。
  四. 进一步的研究工作
  本文研究了JAVA视频应用基本内容,为进一步扩展JMF的应用开发打下了基础。在这一段的研究中积累的很多经验。由于时间的关系,只是初步了解了如何通过插件技术扩展JMF的应用能力。今后需要做的主要研究工作和研究方向主要有
  1、编写解码器插件,扩展JMF的应用能力。使得JMF可以支持更多的媒体类型;
  2、编写处理器插件,增强JMF的视频处理能力,使得JMF的视频编辑能力更强。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行}

我要回帖

更多关于 jmf视频教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信