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 、导包(可运行)) 


Java代码   收藏代码
  1. package test;  
  2.   
  3.   
  4. import java.awt.BorderLayout;  
  5. import java.awt.Component;  
  6. import java.awt.Graphics;  
  7. import java.awt.GraphicsConfiguration;  
  8. import java.awt.GraphicsDevice;  
  9. import java.awt.GraphicsEnvironment;  
  10. import java.awt.HeadlessException;  
  11. import java.awt.Image;  
  12. import java.awt.Transparency;  
  13. import java.awt.event.ActionEvent;  
  14. import java.awt.event.ActionListener;  
  15. import java.awt.event.WindowAdapter;  
  16. import java.awt.event.WindowEvent;  
  17. import java.awt.image.BufferedImage;  
  18. import java.awt.image.ColorModel;  
  19. import java.awt.image.PixelGrabber;  
  20. import java.io.File;  
  21. import java.io.IOException;  
  22. import java.util.Vector;  
  23.   
  24. import javax.imageio.ImageIO;  
  25. import javax.media.Buffer;  
  26. import javax.media.CaptureDeviceInfo;  
  27. import javax.media.CaptureDeviceManager;  
  28. import javax.media.Format;  
  29. import javax.media.MediaLocator;  
  30. import javax.media.NoPlayerException;  
  31. import javax.media.control.FrameGrabbingControl;  
  32. import javax.media.format.RGBFormat;  
  33. import javax.media.format.VideoFormat;  
  34. import javax.media.protocol.DataSource;  
  35. import javax.media.protocol.PushBufferDataSource;  
  36. import javax.media.util.BufferToImage;  
  37. import javax.swing.ImageIcon;  
  38. import javax.swing.JButton;  
  39. import javax.swing.JPanel;  
  40.   
  41. import jmapps.jmstudio.CaptureDialog;  
  42. import jmapps.ui.PlayerFrame;  
  43. import jmapps.util.CDSWrapper;  
  44. import jmapps.util.JMFUtils;  
  45.   
  46.   
  47.   
  48. public class Demo001 extends PlayerFrame {  
  49.   
  50.     public Demo001() {  
  51.         super(null"视频捕获窗口");  
  52.     }  
  53.   
  54.     DataSource dataSource;  
  55.   
  56.     private CaptureDeviceInfo infor;  
  57.   
  58.     private MediaLocator mediaLocator;  
  59.   
  60.   
  61.     String str1 = "vfw:Logitech USB Video Camera:0";  
  62.     String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";   
  63.       
  64.     private String url = "vfw:Microsoft WDM Image Capture (Win32):0";  
  65.   
  66.     private Component com;  
  67.   
  68.     private JPanel panel;  
  69.   
  70.     private int captureCount = 0;  
  71.   
  72.     FrameGrabbingControl controlGrabber;  
  73.   
  74.     public void play() {  
  75.         if (mediaPlayerCurrent.getState() != mediaPlayerCurrent.Started) {  
  76.             mediaPlayerCurrent.start();  
  77.         }  
  78.     }  
  79.   
  80.     private void init() throws NoPlayerException, IOException {  
  81.         // setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);  
  82.         String nameCaptureDeviceAudio = null;  
  83.         String nameCaptureDeviceVideo = null;  
  84.         CaptureDialog dialogCapture = new CaptureDialog(thisnull);  
  85.         dialogCapture.show();  
  86.         if (dialogCapture.getAction() == CaptureDialog.ACTION_CANCEL)  
  87.             return;  
  88.         CaptureDeviceInfo cdi = dialogCapture.getAudioDevice();  
  89.         if (cdi != null && dialogCapture.isAudioDeviceUsed())  
  90.             nameCaptureDeviceAudio = cdi.getName();  
  91.         cdi = dialogCapture.getVideoDevice();  
  92.         if (cdi != null && dialogCapture.isVideoDeviceUsed())  
  93.             nameCaptureDeviceVideo = cdi.getName();  
  94.         dataSource = JMFUtils.createCaptureDataSource(nameCaptureDeviceAudio,  
  95.                 dialogCapture.getAudioFormat(), nameCaptureDeviceVideo,  
  96.                 dialogCapture.getVideoFormat());  
  97.         DataSource cdswrapper = new CDSWrapper(  
  98.                 (PushBufferDataSource) dataSource);  
  99.         dataSource = cdswrapper;  
  100.         dataSource.connect();  
  101.         open(dataSource);  
  102.         JPanel controlPanel = new JPanel();  
  103.         controlPanel.setName("controlPnael is here");  
  104.         add(BorderLayout.SOUTH, controlPanel);  
  105.         JButton capture = new JButton("Capture Image");  
  106.         capture.addActionListener(new ActionListener() {  
  107.             public void actionPerformed(ActionEvent arg0) {  
  108.                 mediaPlayerCurrent.stop();  
  109.                 Buffer bufferFrame;  
  110.                 BufferToImage bufferToImage;  
  111.                 Image image;  
  112.                 BufferedImage bi;  
  113.                 controlGrabber = (FrameGrabbingControl) mediaPlayerCurrent  
  114.                         .getControl("javax.media.control.FrameGrabbingControl");  
  115.                 bufferFrame = controlGrabber.grabFrame();  
  116.                 bufferToImage = new BufferToImage((VideoFormat) bufferFrame  
  117.                         .getFormat());  
  118.                 image = bufferToImage.createImage(bufferFrame);  
  119.   
  120.                 File out = new File("capture" + (++captureCount) + ".png");  
  121.                 try {  
  122.                     bi = toBufferedImage(image);  
  123.                     ImageIO.write(bi, "png", out);  
  124.                 } catch (IOException e1) {  
  125.                     e1.printStackTrace();  
  126.                 }  
  127.   
  128.                 mediaPlayerCurrent.start();  
  129.   
  130.             }  
  131.         });  
  132.   
  133.         controlPanel.add(BorderLayout.CENTER, capture);  
  134.   
  135.         JButton playStop = new JButton("stop");  
  136.         // add(BorderLayout.SOUTH,playControl);  
  137.         playStop.addActionListener(new ActionListener() {  
  138.   
  139.             // @Override  
  140.             public void actionPerformed(ActionEvent arg0) {  
  141.                 mediaPlayerCurrent.stop();  
  142.   
  143.             }  
  144.         });  
  145.         controlPanel.add(BorderLayout.EAST, playStop);  
  146.   
  147.         JButton playStart = new JButton("start");  
  148.         // add(BorderLayout.SOUTH,playControl);  
  149.         playStart.addActionListener(new ActionListener() {  
  150.   
  151.             // @Override  
  152.             public void actionPerformed(ActionEvent arg0) {  
  153.                 // mediaPlayerCurrent.stop();  
  154.                 if (mediaPlayerCurrent.getState() != mediaPlayerCurrent.Started) {  
  155.                     mediaPlayerCurrent.start();  
  156.                 }  
  157.             }  
  158.         });  
  159.         controlPanel.add(BorderLayout.WEST, playStart);  
  160.         addWindowListener(new WindowAdapter() {  
  161.   
  162.             // @Override  
  163.             public void windowClosing(WindowEvent e) {  
  164.                 mediaPlayerCurrent.close();  
  165.                 dataSource.disconnect();  
  166.                 System.out.println("exit.....");  
  167.                 System.exit(0);  
  168.   
  169.             }  
  170.         });  
  171.     }  
  172.   
  173.     public static boolean hasAlpha(Image image) {  
  174.         // If buffered image, the color model is readily available  
  175.         if (image instanceof BufferedImage) {  
  176.             BufferedImage bimage = (BufferedImage) image;  
  177.             return bimage.getColorModel().hasAlpha();  
  178.         }  
  179.         // Use a pixel grabber to retrieve the image's color model;  
  180.         // grabbing a single pixel is usually sufficient  
  181.         PixelGrabber pg = new PixelGrabber(image, 0011false);  
  182.         try {  
  183.             pg.grabPixels();  
  184.         } catch (InterruptedException e) {  
  185.         }  
  186.   
  187.         // Get the image's color model  
  188.         ColorModel cm = pg.getColorModel();  
  189.         return cm.hasAlpha();  
  190.     }  
  191.   
  192.     public static BufferedImage toBufferedImage(Image image) {  
  193.         if (image instanceof BufferedImage) {  
  194.             return (BufferedImage) image;  
  195.         }  
  196.   
  197.         // This code ensures that all the pixels in the image are loaded  
  198.         image = new ImageIcon(image).getImage();  
  199.   
  200.         // Determine if the image has transparent pixels; for this method's  
  201.         // implementation, see e661 Determining If an Image Has Transparent  
  202.         // Pixels  
  203.         boolean hasAlpha = hasAlpha(image);  
  204.   
  205.         // Create a buffered image with a format that's compatible with the  
  206.         // screen  
  207.         BufferedImage bimage = null;  
  208.         GraphicsEnvironment ge = GraphicsEnvironment  
  209.                 .getLocalGraphicsEnvironment();  
  210.         try {  
  211.             // Determine the type of transparency of the new buffered image  
  212.             int transparency = Transparency.OPAQUE;  
  213.             if (hasAlpha) {  
  214.                 transparency = Transparency.BITMASK;  
  215.             }  
  216.   
  217.             // Create the buffered image  
  218.             GraphicsDevice gs = ge.getDefaultScreenDevice();  
  219.             GraphicsConfiguration gc = gs.getDefaultConfiguration();  
  220.             bimage = gc.createCompatibleImage(image.getWidth(null), image  
  221.                     .getHeight(null), transparency);  
  222.         } catch (HeadlessException e) {  
  223.             // The system does not have a screen  
  224.             System.err.println("The system does not have a screen!");  
  225.             System.exit(-1);  
  226.         }  
  227.   
  228.         if (bimage == null) {  
  229.             // Create a buffered image using the default color model  
  230.             int type = BufferedImage.TYPE_INT_RGB;  
  231.             if (hasAlpha) {  
  232.                 type = BufferedImage.TYPE_INT_ARGB;  
  233.             }  
  234.             bimage = new BufferedImage(image.getWidth(null), image  
  235.                     .getHeight(null), type);  
  236.         }  
  237.   
  238.         // Copy image to buffered image  
  239.         Graphics g = bimage.createGraphics();  
  240.   
  241.         // Paint the image onto the buffered image  
  242.         g.drawImage(image, 00null);  
  243.         g.dispose();  
  244.   
  245.         return bimage;  
  246.     }  
  247.   
  248.     private MediaLocator autoDetect() {// 自动识别功能函数  
  249.         MediaLocator ml = null// 视频采集设备对应的MediaLocator  
  250.         VideoFormat currentFormat = null;// 用户定制获得视频采集设备支持的格式  
  251.         Format setFormat = null;// 用户定制视频采集设备输出的格式  
  252.         Format[] videoFormats = null;// 视频采集设备支持的所有格式  
  253.         System.out.println(" AutoDetect for VFW");// VFW:微软的 Video for Windows  
  254.         // 获得当前所有设备列表  
  255.         Vector deviceList = CaptureDeviceManager.getDeviceList(null);  
  256.         CaptureDeviceInfo device = CaptureDeviceManager.getDevice(url);   
  257.         if (deviceList != null) {  
  258.             // 根据设备列表,找出可用设备名称  
  259.             for (int i = 0; i < deviceList.size(); i++) {  
  260.                 try {  
  261.                     CaptureDeviceInfo di = (CaptureDeviceInfo) deviceList  
  262.                             .elementAt(i);  
  263.                     // 如果设备名称以vfw开头  
  264.                     if (di.getName().startsWith("vfw:")) {  
  265.                         // 获得所有支持RGB格式  
  266.                         videoFormats = di.getFormats();  
  267.                         for (int j = 0; j < videoFormats.length; j++) {  
  268.                             // 我们只需要第一种RGB格式  
  269.                             if (videoFormats[j] instanceof RGBFormat) {  
  270.                                 currentFormat = (RGBFormat) videoFormats[i];  
  271.                                 break;  
  272.                             }  
  273.                         }  
  274.                         if (currentFormat == null) {  
  275.                             System.err.println("Search For RGBFormat Failed");  
  276.                             System.exit(-1);  
  277.                         }  
  278.                         // 通过设备,获得MediaLocator,这个很重要  
  279.                         ml = di.getLocator();  
  280.                     }  
  281.                 } catch (Exception npe) {  
  282.                     System.err.println("Unable to get Processor for device");  
  283.                     System.exit(-1);  
  284.                 }  
  285.             }  
  286.         } else {  
  287.             System.err.println("No Capture Device OK");  
  288.             System.exit(-1);  
  289.         }  
  290.         mediaLocator = ml;  
  291.         return ml;// 返回可用的设备medialocator  
  292.     }  
  293.   
  294.     public static void main(String[] args) throws NoPlayerException,  
  295.             IOException {  
  296.         Demo001 demo = new Demo001();  
  297.         demo.setSize(100100);  
  298.         demo.autoDetect();  
  299.         demo.init();  
  300.         demo.play();  
  301.         demo.setVisible(true);  
  302.     }  
  303. }  
JAVA多媒体开发手册,Java多媒体框架(JMF)中包含了许多用于处理多媒体的API。它是一个相当复杂的系统,完全了解这个系统可能需要花上几周的时间,但是这篇文章将主要介绍JMF的几个核心接口和类,然后通过一个简单的例子向你展示如何利用该接口进行编程。 JMF目前的最新版本是2.1,Sun通过它向Java中引入处理多媒体的能力。下面是JMF所支持的功能的一个概述: ● 可以在Java Applet和应用程序中播放各种媒体文件,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等文件。 ● 可以播放从互联网上下载的媒体流。 ● 可以利用麦克风和摄像机一类的设备截取音频和视频,并保存成多媒体文件。 ● 处理多媒体文件,转换文件格式。 ● 向互联网上传音频和视频数据流。 ● 在互联网上广播音频和视频数据。 JMF的结构 为了更好地说明JMF的结构,让我们用立体声音响做一个简单的比喻。当你CD机播放CD唱片的时候,CD唱片向系统提供音乐信号。这些数据是在录音棚中用麦克风和其他类似的设备记录下来的。CD播放机将音乐信号传送到系统的音箱上。在这个例子中,麦克风就是一个音频截取设备,CD唱片是数据源,而音箱是输出设备JMF的结构和立体声音响系统非常相似,在后面的文章中,你会遇到下面的这些术语: ● 数据源(Data source) ● 截取设备(Capture Device,包括视频和音频截取设备) ● 播放器(Player) ● 处理器(Processor) ● 数据格式(Format) ● 管理器(Manager) 下面让我们来看一看这些术语到底代表什么意思。 1.数据源 就像CD中保存了歌曲一样,数据源中包含了媒体数据流。在JMF中,DataSource对象就是数据源,它可以是一个多媒体文件,也可以是从互联网上下载的数据流。对于DataSource对象,一旦你确定了它的位置和类型,对象中就包含了多媒体的位置信息和能够播放该多媒体的软件信息。当创建了DataSource对象后,可以将它送入Player对象中,而Player对象不需要关心DataSource中的多媒体是如何获得的,以及格式是什么。 在某些情况下,你需要将多个数据源合并成一个数据源。例如当你在制作一段录像时,你需要将音频数据源和视频数据源合并在一起。JMF支持数据源合并,在后面的例子中我们将提到这一点。 2.截取设备 截取设备指的是可以截取到音频或视频数据的硬件,如麦克风、摄像机等。截取到的数据可以被送入Player对象中进行处理。 3.播放器 在JMF中对应播放器的接口是Player。Player对象将音频/视频数据流作为输入,然后将数据流输出到音箱或屏幕上,就像CD播放机读取CD唱片中的歌曲,然后将信号送到音箱上一样。Player对象有多种状态,JMF中定义了JMF的六种状态,在正常情况下Player对象需要经历每个状态,然后才能播放多媒体。下面是对这些状态的说明。 ● Unrealized:在这种状态下,Player对象已经被实例化,但是并不知道它需要播放的多媒体的任何信息。 ● Realizing:当调用realize()方法时,Player对象的状态从Unrealized转变为Realizing。在这种状态下,Player对象正在确定它需要占用哪些资源。 ● Realized:在这种状态下Player对象已经确定了它需要哪些资源,并且也知道需要播放的多媒体的类型。 ● Prefetching:当调用prefectch()方法时,Player对象的状态从Realized变为Prefetching。在该状态下的Player对象正在为播放多媒体做一些准备工作,其中包括加载多媒体数据,获得需要独占的资源等。这个过程被称为预取(Prefetch)。 ● Prefetched:当Player对象完成了预取操作后就到达了该状态。 ● Started:当调用start()方法后,Player对象就进入了该状态并播放多媒体。 4.处理器 处理器对应的接口是Processor,它一种播放器。在JMF API中,Processor接口继承了Player接口。 Processor对象除了支持支持Player对象支持的所有功能,还可以控制对于输入的多媒体数据流进行何种处理以及通过数据源向其他的Player对象或Processor对象输出数据。 除了在播放器中提到了六种状态外,Processor 对象还包括两种新的状态,这两种状态是在Unrealized状态之后,但是在Realizing状态之前。 ● Configuring:当调用configure()方法后,Processor对象进入该状态。在该状态下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值