望有这方面经验的人交流一下心得
一、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)