java录制视频_JMF实现视频捕获与录制

//CamDataSource.java

package ccnu.meng.jxtaApp.localTest;

import java.io.*;

import java.util.*;

import java.awt.Component;

import javax.swing.JOptionPane;

import javax.media.*;

import javax.media.protocol.*;

import javax.media.format.VideoFormat;

public class CamDataSource {

private Component parent;

private DataSource mainCamSource;

private MediaLocator ml;

private Processor processor;

private boolean processing;

public CamDataSource(Component parent) {

this.parent = parent;

setProcessing(false);

}

public void setMainSource(){

setProcessing(false);

VideoFormat vidformat = new VideoFormat(VideoFormat.RGB);

Vector devices = CaptureDeviceManager.getDeviceList(vidformat);

CaptureDeviceInfo di = null;

if (devices.size() > 0)

di = (CaptureDeviceInfo) devices.elementAt(0);

else {

JOptionPane.showMessageDialog(parent,

"Your camera is not connected", "No webcam found", JOptionPane.WARNING_MESSAGE);

return;

}

try {

ml = di.getLocator();

setMainCamSource(Manager.createDataSource(ml));

} catch (Exception e) {

JOptionPane.showMessageDialog(parent,

"Exception locating media: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

return;

}

}

public void makeDataSourceCloneable(){

// turn our data source to a cloneable data source

setMainCamSource(Manager.createCloneableDataSource(getMainCamSource()));

}

public void startProcessing(){

try{

processor = Manager.createProcessor(getMainCamSource());

}catch (IOException e) {

JOptionPane.showMessageDialog(parent,

"IO Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

return;

}catch (NoProcessorException e) {

JOptionPane.showMessageDialog(parent,

"Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

return;

}

CamStateHelper playhelper = new CamStateHelper(processor);

if(!playhelper.configure(10000)){

JOptionPane.showMessageDialog(parent,

"cannot configure processor", "Error", JOptionPane.WARNING_MESSAGE);

return;

}

processor.setContentDescriptor(null);

if(!playhelper.realize(10000)){

JOptionPane.showMessageDialog(parent,

"cannot realize processor", "Error", JOptionPane.WARNING_MESSAGE);

return;

}

// In order for or your clones to start, you must start the original source

processor.start();

setProcessing(true);

}

public DataSource cloneCamSource(){

if(!getProcessing()) setMainSource();

return ((SourceCloneable)getMainCamSource()).createClone();

}

public DataSource getMainCamSource(){

return mainCamSource;

}

public void setMainCamSource(DataSource mainCamSource){

this.mainCamSource = mainCamSource;

}

public void setMl(MediaLocator ml){

this.ml = ml;

}

public MediaLocator getMl(){

return ml;

}

public boolean getProcessing(){

return processing;

}

public void setProcessing(boolean processing){

this.processing = processing;

}

public void setParent(Component parent){

this.parent = parent;

}

public Component getParent(){

return parent;

}

}

/**********************************************************************************************/

//CamStateHelper.java

package ccnu.meng.jxtaApp.localTest;

import javax.media.*;

public class CamStateHelper implements javax.media.ControllerListener {

Player player = null;

boolean configured = false;

boolean realized = false;

boolean prefetched = false;

boolean eom = false;

boolean failed = false;

boolean closed = false;

public CamStateHelper(Player p) {

player = p;

p.addControllerListener(this);

}

public boolean configure(int timeOutMillis) {

long startTime = System.currentTimeMillis();

synchronized (this) {

if (player instanceof Processor)

((Processor)player).configure();

else

return false;

while (!configured && !failed) {

try {

wait(timeOutMillis);

} catch (InterruptedException ie) {

}

if (System.currentTimeMillis() - startTime > timeOutMillis)

break;

}

}

return configured;

}

public boolean realize(int timeOutMillis) {

long startTime = System.currentTimeMillis();

synchronized (this) {

player.realize();

while (!realized && !failed) {

try {

wait(timeOutMillis);

}catch (InterruptedException ie) {

}

if (System.currentTimeMillis() - startTime > timeOutMillis)

break;

}

}

return realized;

}

public boolean prefetch(int timeOutMillis) {

long startTime = System.currentTimeMillis();

synchronized (this) {

player.prefetch();

while (!prefetched && !failed) {

try {

wait(timeOutMillis);

}catch (InterruptedException ie) {

}

if (System.currentTimeMillis() - startTime > timeOutMillis)

break;

}

}

return prefetched && !failed;

}

public boolean playToEndOfMedia(int timeOutMillis) {

long startTime = System.currentTimeMillis();

eom = false;

synchronized (this) {

player.start();

while (!eom && !failed) {

try {

wait(timeOutMillis);

}catch (InterruptedException ie) {

}

if (System.currentTimeMillis() - startTime > timeOutMillis)

break;

}

}

return eom && !failed;

}

public void close() {

synchronized (this) {

player.close();

while (!closed) {

try {

wait(100);

} catch (InterruptedException ie) {

}

}

}

player.removeControllerListener(this);

}

public synchronized void controllerUpdate(ControllerEvent ce) {

if (ce instanceof RealizeCompleteEvent) {

realized = true;

}else if (ce instanceof ConfigureCompleteEvent) {

configured = true;

} else if (ce instanceof PrefetchCompleteEvent) {

prefetched = true;

} else if (ce instanceof EndOfMediaEvent) {

eom = true;

} else if (ce instanceof ControllerErrorEvent) {

failed = true;

} else if (ce instanceof ControllerClosedEvent) {

closed = true;

} else {

return;

}

notifyAll();

}

}

/******************************************************************************************/

//LocalVideoTest.java

package ccnu.meng.jxtaApp.localTest;

public class LocalVideoTest {

public LocalVideoTest() {

CamDataSource dataSource = new CamDataSource(null);

dataSource.setMainSource();

dataSource.makeDataSourceCloneable();

dataSource.startProcessing();

MainFrame frame = new MainFrame(dataSource);

frame.setSize(400, 400);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

public static void main(String[] args) {

LocalVideoTest Lvt = new LocalVideoTest();

}

}

/*********************************************************************************************/

//MainFrame.java

package ccnu.meng.jxtaApp.localTest;

import java.io.*;

import java.net.URL;

import java.net.MalformedURLException;

import java.awt.*;

import javax.swing.JFileChooser;

import javax.media.*;

import javax.media.control.*;

import javax.media.protocol.*;

import javax.media.format.VideoFormat;

import javax.swing.JPanel;

import javax.swing.JLabel;

import javax.swing.JToolBar;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.WindowConstants;

import java.awt.BorderLayout;

import java.awt.event.*;

public class MainFrame extends JFrame {

private JPanel centerPanel;

private JLabel fileLabel;

private JToolBar mainToolBar;

private JLabel messageLabel;

private JPanel northPanel;

private JButton recordButton;

private JPanel southPanel;

private CamDataSource dataSource;

private DataSource camSource;

private DataSource recordCamSource;

private DataSink dataSink;

private Processor processor;

private Processor recordProcessor;

private CamStateHelper playhelper;

private JFileChooser movieChooser;

public MainFrame(CamDataSource dataSource) {

this.dataSource = dataSource;

this.dataSource.setParent(this);

camSource = dataSource.cloneCamSource();

initComponents();

try{

processor = Manager.createProcessor(camSource);

}catch (IOException e) {

JOptionPane.showMessageDialog(this,

"Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

return;

}catch (NoProcessorException e) {

JOptionPane.showMessageDialog(this,

"Exception creating processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

return;

}

playhelper = new CamStateHelper(processor);

if(!playhelper.configure(10000)){

JOptionPane.showMessageDialog(this,

"cannot configure processor", "Error", JOptionPane.WARNING_MESSAGE);

return;

}

checkIncoding(processor.getTrackControls());

processor.setContentDescriptor(null);

if(!playhelper.realize(10000)){

JOptionPane.showMessageDialog(this,

"cannot realize processor", "Error", JOptionPane.WARNING_MESSAGE);

return;

}

setJPEGQuality(processor, 1.0f);

processor.start();

processor.getVisualComponent().setBackground(Color.gray);

centerPanel.add(processor.getVisualComponent(), BorderLayout.CENTER);//视频面板

centerPanel.add(processor.getControlPanelComponent(), BorderLayout.SOUTH);//视频控制面板

}

//界面初始化

private void initComponents() {

northPanel = new JPanel();

messageLabel = new JLabel();

southPanel = new JPanel();

mainToolBar = new JToolBar();

recordButton = new JButton();

fileLabel = new JLabel();

centerPanel = new JPanel();

setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

setTitle("本地视频");

addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(WindowEvent evt) {

formWindowClosing(evt);

}

});

northPanel.setLayout(new BorderLayout());

messageLabel.setText("状态:");

northPanel.add(messageLabel, BorderLayout.SOUTH);

getContentPane().add(northPanel, BorderLayout.NORTH);

southPanel.setLayout(new BorderLayout());

recordButton.setText("录制");

recordButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {

recordButtonActionPerformed(evt);

}

});

mainToolBar.add(recordButton);

fileLabel.setText("文件:");

mainToolBar.add(fileLabel);

southPanel.add(mainToolBar, BorderLayout.CENTER);

getContentPane().add(southPanel, BorderLayout.SOUTH);

centerPanel.setLayout(new BorderLayout());

getContentPane().add(centerPanel, BorderLayout.CENTER);

pack();

}

private void formWindowClosing(java.awt.event.WindowEvent evt) {

processor.close();

}

//录制当前视频

private void recordButtonActionPerformed(java.awt.event.ActionEvent evt) {

if(recordButton.getText().equals("录制")){

fileLabel.setText("文件:");

if (movieChooser == null) movieChooser = new JFileChooser();

movieChooser.setDialogType(JFileChooser.SAVE_DIALOG);

//Add a custom file filter and disable the default

//(Accept All) file filter.

movieChooser.addChoosableFileFilter(new MOVFilter());

movieChooser.setAcceptAllFileFilterUsed(false);

movieChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

int returnVal = movieChooser.showDialog(this, "录制");

if (returnVal == JFileChooser.APPROVE_OPTION) {

File file = movieChooser.getSelectedFile();

if(!file.getName().endsWith(".mov")

&&!file.getName().endsWith(".MOV")) file = new File(file.toString() + ".mov");

recordToFile(file);

fileLabel.setText("文件:" + file.toString());

recordButton.setText("停止");

}

}else{

stopRecording();

recordButton.setText("录制");

}

}

void setJPEGQuality(Player p, float val) {

Control cs[] = p.getControls();

QualityControl qc = null;

VideoFormat jpegFmt = new VideoFormat(VideoFormat.JPEG);

// Loop through the controls to find the Quality control for

// the JPEG encoder.

for (int i = 0; i < cs.length; i++) {

if (cs[i] instanceof QualityControl && cs[i] instanceof Owned) {

Object owner = ((Owned)cs[i]).getOwner();

// Check to see if the owner is a Codec.

// Then check for the output format.

if (owner instanceof Codec) {

Format fmts[] = ((Codec)owner).getSupportedOutputFormats(null);

for (int j = 0; j < fmts.length; j++) {

if (fmts[j].matches(jpegFmt)) {

qc = (QualityControl)cs[i];

qc.setQuality(val);

break;

}

}

}

if (qc != null) break;

}

}

}

public void checkIncoding(TrackControl track[]){

for (int i = 0; i < track.length; i++) {

Format format = track[i].getFormat();

if (track[i].isEnabled() && format instanceof VideoFormat) {

Dimension size = ((VideoFormat)format).getSize();

float frameRate = ((VideoFormat)format).getFrameRate();

int w = (size.width % 8 == 0 ? size.width :(int)(size.width / 8) * 8);

int h = (size.height % 8 == 0 ? size.height :(int)(size.height / 8) * 8);

VideoFormat jpegFormat = new VideoFormat(

VideoFormat.JPEG_RTP, new Dimension(w, h), Format.NOT_SPECIFIED, Format.byteArray, frameRate);

messageLabel.setText("状态: 视频将以" + jpegFormat.toString()+"播放");

}

}

}

public void recordToFile(File file){

URL movieUrl = null;

MediaLocator dest = null;

try{

movieUrl = file.toURL();

dest = new MediaLocator(movieUrl);

}catch(MalformedURLException e){

}

recordCamSource = dataSource.cloneCamSource();

try{

recordProcessor = Manager.createProcessor(recordCamSource);

}catch (IOException e) {

JOptionPane.showMessageDialog(this,

"Exception creating record processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

return;

}catch (NoProcessorException e) {

JOptionPane.showMessageDialog(this,

"Exception creating record processor: " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

return;

}

playhelper = new CamStateHelper(recordProcessor);

if(!playhelper.configure(10000)){

JOptionPane.showMessageDialog(this,

"cannot configure record processor", "Error", JOptionPane.WARNING_MESSAGE);

return;

}

VideoFormat vfmt = new VideoFormat(VideoFormat.CINEPAK);

(recordProcessor.getTrackControls())[0].setFormat(vfmt);

(recordProcessor.getTrackControls())[0].setEnabled(true);

recordProcessor.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME));

Control control = recordProcessor.getControl("javax.media.control.FrameRateControl");

if ( control != null && control instanceof javax.media.control.FrameRateControl )

((javax.media.control.FrameRateControl)control).setFrameRate(15.0f);

if(!playhelper.realize(10000)){

JOptionPane.showMessageDialog(this,

"cannot realize processor", "Error", JOptionPane.WARNING_MESSAGE);

return;

}

try {

if(recordProcessor.getDataOutput()==null){

JOptionPane.showMessageDialog(this,

"No Data Output", "Error", JOptionPane.WARNING_MESSAGE);

return;

}

dataSink = Manager.createDataSink(recordProcessor.getDataOutput(), dest);

recordProcessor.start();

dataSink.open();

dataSink.start();

} catch (NoDataSinkException ex) {

JOptionPane.showMessageDialog(this,

"No DataSink " + ex.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

} catch (IOException ex) {

JOptionPane.showMessageDialog(this,

"IOException " + ex.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

}

}

public void stopRecording(){

try {

recordProcessor.close();

dataSink.stop();

dataSink.close();

} catch (IOException e) {

JOptionPane.showMessageDialog(this,

"cannot stop recording " + e.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);

}

}

}

/***********************************************************************************************/

//MOVFilter.java

package ccnu.meng.jxtaApp.localTest;

import java.io.File;

import javax.swing.*;

import javax.swing.filechooser.*;

/* ImageFilter.java is a 1.4 example used by FileChooserDemo2.java. */

public class MOVFilter extends FileFilter {

public boolean accept(File f) {

if (f.isDirectory()) {

return true;

}

String extension = MOVFilter.getExtension(f);

if (extension != null) {

if (extension.equalsIgnoreCase("MOV")) {

return true;

} else {

return false;

}

}

return false;

}

//The description of this filter

public String getDescription() {

return "QuickTime Movies";

}

public static String getExtension(File f) {

String ext = null;

String s = f.getName();

int i = s.lastIndexOf('.');

if (i > 0 &&  i < s.length() - 1) {

ext = s.substring(i+1).toLowerCase();

}

return ext;

}

}

//本文转载自 http://mengmailu.bokee.com/viewdiary.15643624.html,嘿嘿

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值