JMF开启摄像头

来源:互联网 发布:天猫双11晚会网络直播 编辑:程序博客网 时间:2024/05/01 16:06

使用JMF可以同时提取视频流和音频流,然后通过数据源的混合,可以达到视频音频同时收集和播放的功能。其中主

要是通过数据源的混合,也就是视频流和音频流的数据源的混合。下面我们来写一个例子。通过开启摄像头的麦克风实

现同时收集视频和音频。

[java] view plain copy
 print?
  1. package com.bird.test;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.Component;  
  5. import java.awt.Dimension;  
  6. import java.awt.Frame;  
  7. import java.awt.event.WindowAdapter;  
  8. import java.awt.event.WindowEvent;  
  9. import javax.media.ControllerEvent;  
  10. import javax.media.ControllerListener;  
  11. import javax.media.EndOfMediaEvent;  
  12. import javax.media.Manager;  
  13. import javax.media.MediaLocator;  
  14. import javax.media.Player;  
  15. import javax.media.PrefetchCompleteEvent;  
  16. import javax.media.RealizeCompleteEvent;  
  17. import javax.media.Time;  
  18. import javax.media.protocol.DataSource;  
  19.   
  20. public class MyVideoPlayer implements ControllerListener{  
  21.     public static void main(String[] args) {  
  22.         MyVideoPlayer sp = new MyVideoPlayer();  
  23.         sp.play();  
  24.     }  
  25.   
  26.     private Frame f;  
  27.     // private Player videoplayer;  
  28.     // private Player audioplayer;  
  29.     private Player dualPlayer;  
  30.     private Component visual;  
  31.     private Component control = null;  
  32.     private MediaLocator mediaLocator;  
  33.     private MediaLocator audioLocator;  
  34.   
  35.     public void play() {  
  36.         f = new Frame("MyPlayer");  
  37.         f.addWindowListener(new WindowAdapter() {  
  38.             public void windowClosing(WindowEvent we) {  
  39.                 if (dualPlayer != null) {  
  40.                     dualPlayer.close();  
  41.                 }  
  42.                 System.exit(0);  
  43.             }  
  44.         });  
  45.         f.setSize(500400);  
  46.   
  47.         f.setVisible(true);  
  48.       
  49.         try {  
  50.   
  51.             mediaLocator = new MediaLocator("vfw://0");// 此类描述媒体目录的地址????  
  52.             audioLocator = new MediaLocator("javasound://44100");  
  53.         } catch (Exception e) {  
  54.             System.out.println(e.toString());  
  55.         }  
  56.   
  57.         try {  
  58.               
  59.             DataSource[] dataSources = new DataSource[2];  
  60.             dataSources[0] = Manager.createDataSource(mediaLocator);  
  61.             dataSources[1] = Manager.createDataSource(audioLocator);  
  62.             DataSource ds = Manager.createMergingDataSource(dataSources);  
  63.             dualPlayer = Manager.createPlayer(ds);  
  64.   
  65.         } catch (Exception e1) {  
  66.             e1.printStackTrace();  
  67.         }  
  68.         dualPlayer.realize();  
  69.         dualPlayer.addControllerListener(this);  
  70.   
  71.     }  
  72.   
  73.       
  74.     private int videoWidth = 0;  
  75.     private int videoHeight = 0;  
  76.     private int controlHeight = 30;  
  77.     private int insetWidth = 10;  
  78.     private int insetHeight = 30;  
  79.   
  80.     // 监听player的相关事件  
  81.     public void controllerUpdate(ControllerEvent ce) {  
  82.         if (ce instanceof RealizeCompleteEvent) {  
  83.             // player实例化完成后进行player播放前预处理  
  84.             dualPlayer.prefetch();  
  85.         } else if (ce instanceof PrefetchCompleteEvent) {  
  86.             if (visual != null)  
  87.                 return;  
  88.   
  89.             // 取得player中的播放视频的组件,并得到视频窗口的大小  
  90.             // 然后把视频窗口的组件添加到Frame窗口中,  
  91.             if ((visual = dualPlayer.getVisualComponent()) != null) {  
  92.                 Dimension size = visual.getPreferredSize();  
  93.                 videoWidth = size.width;  
  94.                 videoHeight = size.height;  
  95.                 f.add(visual);  
  96.             } else {  
  97.                 videoWidth = 320;  
  98.             }  
  99.   
  100.             // 取得player中的视频播放控制条组件,并把该组件添加到Frame窗口中  
  101.             if ((control = dualPlayer.getControlPanelComponent()) != null) {  
  102.                 controlHeight = control.getPreferredSize().height;  
  103.                 f.add(control, BorderLayout.SOUTH);  
  104.             }  
  105.   
  106.             // 设定Frame窗口的大小,使得满足视频文件的默认大小  
  107.             f.setSize(videoWidth + insetWidth, videoHeight + controlHeight  
  108.                     + insetHeight);  
  109.             f.validate();  
  110.   
  111.             // 启动视频播放组件开始播放  
  112.             dualPlayer.start();  
  113.         } else if (ce instanceof EndOfMediaEvent) {  
  114.             // 当播放视频完成后,把时间进度条恢复到开始,并再次重新开始播放  
  115.             dualPlayer.setMediaTime(new Time(0));  
  116.             // videoplayer.start();  
  117.             // audioplayer.start();  
  118.             dualPlayer.start();  
  119.         }  
  120.     }  
  121. }  

其实代码中很多的GUI编程和监听器,真正的JMF的东西并不是很多,主要是注意Player的状态问题。由realizing变成

relized;


14
0 0
原创粉丝点击