java JMF的使用

望有这方面经验的人交流一下心得
一、jmf 开发环境的设置

下载jmf windows performace pack(我已经下载了,可直接下我提供的包)

http://java.sun.com/products/java-media/jmf/2.1.1/setup.html

安装



设置环境变量路径

set JMFHOME=C:\JMF2.1.1
set CLASSPATH=%JMFHOME%\lib\jmf.jar;%JMFHOME%\lib\sound.jar;.;%CLASSPATH%


二、播放器的例子代码(copy 到 Eclipse 、导包(可运行)

packagejmf.test;

importjava.awt.BorderLayout;

importjava.awt.Component;

importjava.awt.Graphics;

importjava.awt.GraphicsConfiguration;

importjava.awt.GraphicsDevice;

importjava.awt.GraphicsEnvironment;

importjava.awt.HeadlessException;

importjava.awt.Image;

importjava.awt.Transparency;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjava.awt.event.WindowAdapter;

importjava.awt.event.WindowEvent;

importjava.awt.image.BufferedImage;

importjava.awt.image.ColorModel;

importjava.awt.image.PixelGrabber;

importjava.io.File;

importjava.io.IOException;

importjava.util.Vector;

importjavax.imageio.ImageIO;

importjavax.media.Buffer;

importjavax.media.CaptureDeviceInfo;

importjavax.media.CaptureDeviceManager;

importjavax.media.Format;

importjavax.media.MediaLocator;

importjavax.media.NoPlayerException;

importjavax.media.control.FrameGrabbingControl;

importjavax.media.format.RGBFormat;

importjavax.media.format.VideoFormat;

importjavax.media.protocol.DataSource;

importjavax.media.protocol.PushBufferDataSource;

importjavax.media.util.BufferToImage;

importjavax.swing.ImageIcon;

importjavax.swing.JButton;

importjavax.swing.JPanel;

importjmapps.jmstudio.CaptureDialog;

importjmapps.ui.PlayerFrame;

importjmapps.util.CDSWrapper;

importjmapps.util.JMFUtils;

publicclassJMFDemoextendsPlayerFrame{

publicJMFDemo(){

super(null,"视频捕获窗口");

}

DataSourcedataSource;

privateCaptureDeviceInfoinfor;

privateMediaLocatormediaLocator;

Stringstr1="vfw:LogitechUSBVideoCamera:0";

Stringstr2="vfw:MicrosoftWDMImageCapture(Win32):0";

privateStringurl="vfw:MicrosoftWDMImageCapture(Win32):0";

privateComponentcom;

privateJPanelpanel;

privateintcaptureCount=0;

FrameGrabbingControlcontrolGrabber;

publicvoidplay(){

if(mediaPlayerCurrent.getState()!=mediaPlayerCurrent.Started){

mediaPlayerCurrent.start();

}

}

privatevoidinit()throwsNoPlayerException,IOException{

//setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

StringnameCaptureDeviceAudio=null;

StringnameCaptureDeviceVideo=null;

CaptureDialogdialogCapture=newCaptureDialog(this,null);

dialogCapture.show();

if(dialogCapture.getAction()==CaptureDialog.ACTION_CANCEL)

return;

CaptureDeviceInfocdi=dialogCapture.getAudioDevice();

if(cdi!=null&&dialogCapture.isAudioDeviceUsed())

nameCaptureDeviceAudio=cdi.getName();

cdi=dialogCapture.getVideoDevice();

if(cdi!=null&&dialogCapture.isVideoDeviceUsed())

nameCaptureDeviceVideo=cdi.getName();

dataSource=JMFUtils.createCaptureDataSource(nameCaptureDeviceAudio,

dialogCapture.getAudioFormat(),nameCaptureDeviceVideo,

dialogCapture.getVideoFormat());

DataSourcecdswrapper=newCDSWrapper(

(PushBufferDataSource)dataSource);

dataSource=cdswrapper;

dataSource.connect();

open(dataSource);

JPanelcontrolPanel=newJPanel();

controlPanel.setName("controlPnaelishere");

add(BorderLayout.SOUTH,controlPanel);

JButtoncapture=newJButton("CaptureImage");

capture.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEventarg0){

mediaPlayerCurrent.stop();

BufferbufferFrame;

BufferToImagebufferToImage;

Imageimage;

BufferedImagebi;

controlGrabber=(FrameGrabbingControl)mediaPlayerCurrent

.getControl("javax.media.control.FrameGrabbingControl");

bufferFrame=controlGrabber.grabFrame();

bufferToImage=newBufferToImage((VideoFormat)bufferFrame

.getFormat());

image=bufferToImage.createImage(bufferFrame);

Fileout=newFile("capture"+(++captureCount)+".png");

try{

bi=toBufferedImage(image);

ImageIO.write(bi,"png",out);

}catch(IOExceptione1){

e1.printStackTrace();

}

mediaPlayerCurrent.start();

}

});

controlPanel.add(BorderLayout.CENTER,capture);

JButtonplayStop=newJButton("stop");

//add(BorderLayout.SOUTH,playControl);

playStop.addActionListener(newActionListener(){

//@Override

publicvoidactionPerformed(ActionEventarg0){

mediaPlayerCurrent.stop();

}

});

controlPanel.add(BorderLayout.EAST,playStop);

JButtonplayStart=newJButton("start");

//add(BorderLayout.SOUTH,playControl);

playStart.addActionListener(newActionListener(){

//@Override

publicvoidactionPerformed(ActionEventarg0){

//mediaPlayerCurrent.stop();

if(mediaPlayerCurrent.getState()!=mediaPlayerCurrent.Started){

mediaPlayerCurrent.start();

}

}

});

controlPanel.add(BorderLayout.WEST,playStart);

addWindowListener(newWindowAdapter(){

//@Override

publicvoidwindowClosing(WindowEvente){

mediaPlayerCurrent.close();

dataSource.disconnect();

System.out.println("exit.....");

System.exit(0);

}

});

}

publicstaticbooleanhasAlpha(Imageimage){

//Ifbufferedimage,thecolormodelisreadilyavailable

if(imageinstanceofBufferedImage){

BufferedImagebimage=(BufferedImage)image;

returnbimage.getColorModel().hasAlpha();

}

//Useapixelgrabbertoretrievetheimage'scolormodel;

//grabbingasinglepixelisusuallysufficient

PixelGrabberpg=newPixelGrabber(image,0,0,1,1,false);

try{

pg.grabPixels();

}catch(InterruptedExceptione){

}

//Gettheimage'scolormodel

ColorModelcm=pg.getColorModel();

returncm.hasAlpha();

}

publicstaticBufferedImagetoBufferedImage(Imageimage){

if(imageinstanceofBufferedImage){

return(BufferedImage)image;

}

//Thiscodeensuresthatallthepixelsintheimageareloaded

image=newImageIcon(image).getImage();

//Determineiftheimagehastransparentpixels;forthismethod's

//implementation,seee661DeterminingIfanImageHasTransparent

//Pixels

booleanhasAlpha=hasAlpha(image);

//Createabufferedimagewithaformatthat'scompatiblewiththe

//screen

BufferedImagebimage=null;

GraphicsEnvironmentge=GraphicsEnvironment

.getLocalGraphicsEnvironment();

try{

//Determinethetypeoftransparencyofthenewbufferedimage

inttransparency=Transparency.OPAQUE;

if(hasAlpha){

transparency=Transparency.BITMASK;

}

//Createthebufferedimage

GraphicsDevicegs=ge.getDefaultScreenDevice();

GraphicsConfigurationgc=gs.getDefaultConfiguration();

bimage=gc.createCompatibleImage(image.getWidth(null),image

.getHeight(null),transparency);

}catch(HeadlessExceptione){

//Thesystemdoesnothaveascreen

System.err.println("Thesystemdoesnothaveascreen!");

System.exit(-1);

}

if(bimage==null){

//Createabufferedimageusingthedefaultcolormodel

inttype=BufferedImage.TYPE_INT_RGB;

if(hasAlpha){

type=BufferedImage.TYPE_INT_ARGB;

}

bimage=newBufferedImage(image.getWidth(null),image

.getHeight(null),type);

}

//Copyimagetobufferedimage

Graphicsg=bimage.createGraphics();

//Painttheimageontothebufferedimage

g.drawImage(image,0,0,null);

g.dispose();

returnbimage;

}

privateMediaLocatorautoDetect(){//自动识别功能函数

MediaLocatorml=null;//视频采集设备对应的MediaLocator

VideoFormatcurrentFormat=null;//用户定制获得视频采集设备支持的格式

FormatsetFormat=null;//用户定制视频采集设备输出的格式

Format[]videoFormats=null;//视频采集设备支持的所有格式

System.out.println("AutoDetectforVFW");//VFW:微软的VideoforWindows

//获得当前所有设备列表

VectordeviceList=CaptureDeviceManager.getDeviceList(null);

CaptureDeviceInfodevice=CaptureDeviceManager.getDevice(url);

if(deviceList!=null){

//根据设备列表,找出可用设备名称

for(inti=0;i<deviceList.size();i++){

try{

CaptureDeviceInfodi=(CaptureDeviceInfo)deviceList

.elementAt(i);

//如果设备名称以vfw开头

if(di.getName().startsWith("vfw:")){

//获得所有支持RGB格式

videoFormats=di.getFormats();

for(intj=0;j<videoFormats.length;j++){

//我们只需要第一种RGB格式

if(videoFormats[j]instanceofRGBFormat){

currentFormat=(RGBFormat)videoFormats[i];

break;

}

}

if(currentFormat==null){

System.err.println("SearchForRGBFormatFailed");

System.exit(-1);

}

//通过设备,获得MediaLocator,这个很重要

ml=di.getLocator();

}

}catch(Exceptionnpe){

System.err.println("UnabletogetProcessorfordevice");

System.exit(-1);

}

}

}else{

System.err.println("NoCaptureDeviceOK");

System.exit(-1);

}

mediaLocator=ml;

returnml;//返回可用的设备medialocator

}

publicstaticvoidmain(String[]args)throwsNoPlayerException,

IOException{

JMFDemodemo=newJMFDemo();

demo.setSize(100,100);

demo.autoDetect();

demo.init();

demo.play();

demo.setVisible(true);

}

}

代码下载:JMF_demo.rar (9.1 MB)

原文链接:http://wuzijingaip.iteye.com/blog/537168

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值