下面是一段利用JMF从摄像头捕获视频的代码,也是从其它地方当下来的,我修改了一些地方,测试时效果还可以,可以显示捕获的视频(与JMF Studio的部分功能类似,但是很简单),但是还没有实现导出数据的功能。
正常运行程序,需要保证摄像头的驱动正常安装,并在JMF中注册过,具体的方法参见前面的一篇转贴。要注意一点:String类的url是摄像头的url,具体的名称可以在JMF Registry中看到。代码贴出如下:
import javax.media.*;
import java.io.*;
import java.awt.*;
class CaptureVideo extends Frame implements ControllerListener {
private CaptureDeviceInfo infor ;
private MediaLocator mediaLocator ;
private String url = "vfw:Microsoft WDM Image Capture (Win32):0";
private Component com;
private Panel panel ;
Player player;
public CaptureVideo() {
infor = CaptureDeviceManager.getDevice(url);
mediaLocator = infor.getLocator();
}
public void play() {
try {
player = Manager.createPlayer(mediaLocator);//利用mediaLocator创建Player
player.addControllerListener(this);
player.realize();
// System.out.println("infor:"+infor);
// System.out.println("mediaLocator:"+mediaLocator);
} catch (NoPlayerException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void createComponent() {
setTitle("视频信号");
// addWindowListener(new WinClose());
setBounds(100,100,200,200);
panel = new Panel();
if((com = player.getVisualComponent()) != null) {
panel.add(com);
}
add(panel);
setVisible(true);
}
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");
}
}
public static void main(String[] arg0) {
CaptureVideo video = new CaptureVideo();
video.play();
}
}