import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.media.ConfigureCompleteEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.DataSink;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoDataSourceException;
import javax.media.NoProcessorException;
import javax.media.Player;
import javax.media.PrefetchCompleteEvent;
import javax.media.Processor;
import javax.media.RealizeCompleteEvent;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;
public class VideoCapturer extends Frame implements ControllerListener {
Button videoCapturer;
boolean isInCapturing = false;
String url = DeviceConfig.VIDEO_DEVICE_URL;
DataSource source;
Player player = null;
DataSink datasink;
Processor processor=null;
public VideoCapturer() {
setBounds(100, 100, 300, 400);
/** 数据源 */
try {
source = Manager.createDataSource(new MediaLocator(url));
/** 处理器 */
player = Manager.createPlayer(source);
player.addControllerListener(this);
player.realize();
} catch (NoDataSourceException e2) {
e2.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
/** 录像按钮 */
videoCapturer = new Button("video capture");
videoCapturer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
DataSource outsource = Manager.createCloneableDataSource(source);
processor = Manager.createProcessor(outsource);
processor.addControllerListener(new ControllerListener() {
@Override
public void controllerUpdate(ControllerEvent event) {
System.out.println(event.getClass());
if (event instanceof ConfigureCompleteEvent){
// 设置视频输出格式
processor.setContentDescriptor(new FileTypeDescriptor(
FileTypeDescriptor.QUICKTIME));
processor.realize();
} else if (event instanceof RealizeCompleteEvent) {
processor.prefetch();
} else if (event instanceof PrefetchCompleteEvent) {
processor.start();
String luxiangsavepath = "C:/capture/";
String luxiangsavename = "flv.quickname";
MediaLocator dest = new MediaLocator(new java.lang.String(
"file:///" + luxiangsavepath + luxiangsavename));
try {
datasink = Manager.createDataSink(processor.getDataOutput(), dest);
datasink.open();
datasink.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
processor.configure();
} catch (SecurityException e1) {
} catch (IOException e1) {
} catch (NoProcessorException e1) {
}
}
});
/** 停止录像按钮 **/
Button stopButton = new Button("stop capture");
add(stopButton, BorderLayout.NORTH);
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
System.out.println("close");
processor.close();
processor.deallocate();
datasink.stop();
datasink.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
Panel northPanel = new Panel();
add(northPanel, BorderLayout.NORTH);
northPanel.add(videoCapturer, BorderLayout.EAST);
northPanel.add(stopButton, BorderLayout.WEST);
}
public static void main(String[] args) {
VideoCapturer capturer = new VideoCapturer();
}
@Override
public void controllerUpdate(ControllerEvent event) {
System.out.println(event.getClass());
if (event instanceof RealizeCompleteEvent) {
player.prefetch();
} else if (event instanceof PrefetchCompleteEvent) {
player.start();
/** 显示player */
Component visualComponent = player.getVisualComponent();
add(visualComponent, BorderLayout.CENTER);
setVisible(true);
} else {
}
}
}
JMF 录像程序
最新推荐文章于 2021-02-23 21:55:51 发布