⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 videorecorder.java

📁 It is Java for SIP phone
💻 JAVA
字号:
/* * VideoRecorder.java *  * Created on Mar 16, 2004 * */package gov.nist.applet.phone.media.messaging;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Vector;import javax.media.CaptureDeviceInfo;import javax.media.CaptureDeviceManager;import javax.media.ConfigureCompleteEvent;import javax.media.Controller;import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.EndOfMediaEvent;import javax.media.Format;import javax.media.IncompatibleSourceException;import javax.media.Manager;import javax.media.MediaLocator;import javax.media.MediaTimeSetEvent;import javax.media.PrefetchCompleteEvent;import javax.media.Processor;import javax.media.RealizeCompleteEvent;import javax.media.ResourceUnavailableEvent;import javax.media.SizeChangeEvent;import javax.media.StopAtTimeEvent;import javax.media.StopByRequestEvent;import javax.media.control.TrackControl;import javax.media.datasink.DataSinkErrorEvent;import javax.media.datasink.DataSinkEvent;import javax.media.datasink.DataSinkListener;import javax.media.datasink.EndOfStreamEvent;import javax.media.format.VideoFormat;import javax.media.protocol.ContentDescriptor;import javax.media.protocol.DataSource;import javax.media.protocol.FileTypeDescriptor;/** * Class allowing one to record some audio in a buffer * Play only MPEG_AUDIO and GSM audio data * With some minor modifications can play RAW data also *  * @author Jean Deruelle <jean.deruelle@nist.gov> * * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a> */public class VideoRecorder implements ControllerListener, DataSinkListener, Runnable{	Processor p;	Object waitSync = new Object();	boolean stateTransitionOK = true;	static boolean monitorOn = false;	private MediaLocator videoLocator=null;		boolean bufferingDone = false;	RawDataSourceHandler handler =null;	Thread recorderThread=null;			DataSource ds = null;	/**	 * get the devices for the audio capture and print their formats	 */	protected void initialize() {				CaptureDeviceInfo videoCDI=null;		Vector captureDevices=null;		captureDevices= CaptureDeviceManager.getDeviceList(null);		System.out.println("- number of capture devices: "+captureDevices.size() );		CaptureDeviceInfo cdi=null;		for (int i = 0; i < captureDevices.size(); i++) {			cdi = (CaptureDeviceInfo) captureDevices.elementAt(i);					Format[] formatArray=cdi.getFormats();			for (int j = 0; j < formatArray.length; j++) {				Format format=formatArray[j];							   if (format instanceof VideoFormat) {					if (videoCDI == null) {						videoCDI=cdi;					}			   }			   			}		}		if(videoCDI!=null)			videoLocator=videoCDI.getLocator();	}	/**	 * Set the format of the tracks	 * either to MPEG_AUDIO or GSM	 */	protected void setTrackFormat(){		//Get the tracks from the processor		TrackControl[] tracks = p.getTrackControls();		// Do we have atleast one track?		if (tracks == null || tracks.length < 1)	 		System.out.println("Couldn't find tracks in processor");	 				// Set the output content descriptor to GSM		// This will limit the supported formats reported from		// Track.getSupportedFormats to only valid AVI formats.		//p.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.MPEG_AUDIO));		p.setContentDescriptor(new ContentDescriptor(ContentDescriptor.RAW));				Format supported[];		Format chosen=null;	 	boolean atLeastOneTrack = false;				// Program the tracks.		for (int i = 0; i < tracks.length; i++) {			Format format = tracks[i].getFormat();			if (tracks[i].isEnabled()) {				supported = tracks[i].getSupportedFormats();				/*System.out.println("track : "+ i);				for(int j=0;j<supported.length;j++)				System.out.println("Supported format : "+supported[j].getEncoding());*/				// We've set the output content to the GSM.            				if (supported.length > 0) {					for(int j=0;j<supported.length;j++){						System.out.println("Supported format : "+supported[j].toString().toLowerCase());				 		if (supported[j] instanceof VideoFormat) {							if(supported[j].toString().toLowerCase().indexOf("rgb")!=-1){								chosen = supported[j];  								break;							}						}					}					if(chosen!=null){						tracks[i].setFormat(chosen);                						System.err.println("Track " + i + " is set to transmit as:");						System.err.println("  " + chosen);						atLeastOneTrack = true;					}					else{						System.err.println("Track " + i + " is set to transmit as nothing");					}				} else					tracks[i].setEnabled(false);			} else				tracks[i].setEnabled(false);		}	}	/**	 * Given a DataSource, create a processor and hook up the output	 * DataSource from the processor to a customed DataSink.	 * @return false if something wrong happened	 */	protected boolean record() {				// Create a DataSource given the media locator.		try {			ds = Manager.createDataSource(videoLocator);		} catch (Exception e) {			System.err.println("Cannot create DataSource from: " + videoLocator);			return false;		}						try {			p = Manager.createProcessor(ds);		} catch (Exception e) {			System.err.println("Failed to create a processor from the given DataSource: " + e);			return false;		}		p.addControllerListener(this);		// Put the Processor into configured state.		p.configure();		if (!waitForState(Processor.Configured)) {			System.err.println("Failed to configure the processor.");			return false;		}		setTrackFormat();		/*ContentDescriptor[] descriptors = p.getSupportedContentDescriptors();		for (int n = 0; n < descriptors.length; n++) {			System.out.println("Desc: " + descriptors[n].toString());		}*/		// Get the raw output from the processor.		//p.setContentDescriptor(new ContentDescriptor(ContentDescriptor.RAW));		//p.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.MPEG_AUDIO));		p.realize();		if (!waitForState(Controller.Realized)) {			System.err.println("Failed to realize the processor.");			return false;		}				// Get the output DataSource from the processor and		// hook it up to the RawDataSourceHandler.		DataSource ods = p.getDataOutput();		handler = new RawDataSourceHandler();		try {			handler.setSource(ods);		} catch (IncompatibleSourceException e) {			System.err.println("Cannot handle the output DataSource from the processor: " + ods);			//return false;		}		System.err.println("Start datasource handler ");		handler.addDataSinkListener(this);		try{			handler.setSource(ds);			handler.start();		}		catch(IncompatibleSourceException ioe){			ioe.printStackTrace();		}		System.err.println("Prefetch the processor ");		// Prefetch the processor.		p.prefetch();		if (!waitForState(Controller.Prefetched)) {			System.err.println("Failed to prefetch the processor.");			return false;		}				// Start the processor.		p.start();					System.err.println("processor started");						return true;	}	/**	 * Block until file writing is done. 	 */	/*private boolean waitForFileDone(double duration) {				synchronized (waitFileSync) {			try {				while (!bufferingDone) {					if(p.getMediaTime().getSeconds() > duration)						p.close();					waitFileSync.wait(500);					System.err.print(".");				}			} catch (Exception e) {}		}		bufferingDone=false;		return true;	}*/				/**	 * Block until the processor has transitioned to the given state.	 * @param state - the state to wait for	 * @return false if the transition failed.	 */	protected boolean waitForState(int state) {		synchronized (waitSync) {			try {			while (p.getState() < state && stateTransitionOK)				waitSync.wait();			} catch (Exception e) {}		}		return stateTransitionOK;	}	/**	 * Stop the voice recording	 */	public void stop(){		p.stop();		bufferingDone=true;			}		/**	 * Start the voice recording	 */	public void start(){		initialize();		if(recorderThread==null){			recorderThread=new Thread(this);			recorderThread.setName("Voice Recorder Thread");		}					recorderThread.start();				}		/**	 * the process of recording the voice	 */	public void run(){		boolean succeeded=record();		if(!succeeded)			return;		while(!bufferingDone){			try{				recorderThread.sleep(1);			}			catch(InterruptedException ie){				ie.printStackTrace();			}		}			try{			Thread.sleep(100);		}		catch(InterruptedException ie){			ie.printStackTrace();		}			//Clean up		System.err.println("closing datasource" );		try{			ds.stop();		}		catch(IOException ioe){			ioe.printStackTrace();		}		ds.disconnect();								System.err.println("closing processor" );		p.close();		p.removeControllerListener(this);		recorderThread=null;		System.err.println("closing handler" );		handler.close();				System.err.println("...done Buffering.");		bufferingDone=false;	}	/**	 * Controller Listener Method.	 * Allow one to know what happen on the recorder and the voice	 * @param evt - event received 	 */	public void controllerUpdate(ControllerEvent evt) {		//System.out.println("new Event received"+evt.getClass().getName());		if (evt instanceof ConfigureCompleteEvent ||			evt instanceof RealizeCompleteEvent ||			evt instanceof PrefetchCompleteEvent) {			synchronized (waitSync) {				stateTransitionOK = true;				waitSync.notifyAll();			}		} else if (evt instanceof ResourceUnavailableEvent) {			synchronized (waitSync) {				stateTransitionOK = false;				waitSync.notifyAll();			}		} else if (evt instanceof EndOfMediaEvent) {			System.err.println("closing datasource" );			try{				ds.stop();			}			catch(IOException ioe){				ioe.printStackTrace();			}			ds.disconnect();									System.err.println("closing controller");			evt.getSourceController().close();			//Clean up			System.err.println("closing processor" );			p.close();			p.removeControllerListener(this);			recorderThread=null;			System.err.println("closing handler" );			handler.close();					System.err.println("...done Buffering.");			bufferingDone=true;		} else if (evt instanceof SizeChangeEvent) {		}		else if (evt instanceof MediaTimeSetEvent) {			System.err.println("- mediaTime set: " + 			((MediaTimeSetEvent)evt).getMediaTime().getSeconds());		} else if (evt instanceof StopAtTimeEvent) {			System.err.println("- stop at time: " +			((StopAtTimeEvent)evt).getMediaTime().getSeconds());			//Clean up			System.err.println("closing datasource" );			try{				ds.stop();			}			catch(IOException ioe){				ioe.printStackTrace();			}			ds.disconnect();									System.err.println("closing controller");			evt.getSourceController().close();			System.err.println("closing processor" );			p.close();			p.removeControllerListener(this);			recorderThread=null;			System.err.println("closing handler" );			handler.close();					System.err.println("...done Buffering.");			bufferingDone=true;		}		else if (evt instanceof StopByRequestEvent) {							//			Clean up		  System.err.println("closing datasource" );		  try{			  ds.stop();		  }		  catch(IOException ioe){			  ioe.printStackTrace();		  }		  ds.disconnect();			System.err.println("closing controller");			evt.getSourceController().close();								  	System.err.println("closing processor" );		  	p.close();		  	p.removeControllerListener(this);		  	recorderThread=null;		  	System.err.println("closing handler" );		  	handler.close();				  	System.err.println("...done Buffering.");		}	}	/**	 * Get the recorded voice buffer 	 * @return the voice recorded in an array of bytes	 */	public byte[] getRecord(){		return handler.getRecordBuffer();	}	/**	 * DataSink Listener	 * @param evt - event received  	 */	public void dataSinkUpdate(DataSinkEvent evt) {		if (evt instanceof EndOfStreamEvent) {			bufferingDone = true;				//waitFileSync.notifyAll();			System.err.println("All done!");			evt.getSourceDataSink().close();			//System.exit(0);		}		else if (evt instanceof DataSinkErrorEvent) {			//synchronized (waitFileSync) {			bufferingDone = true;				evt.getSourceDataSink().close();							//waitFileSync.notifyAll();			//}		}	}	/**	 * Utility method to write a recorded voice buffer to a file	 * @param data -  the recorded voice	 */	private static void writeBufferToFile(byte[] data){		File f=new File("F://test.mov");		FileOutputStream fos=null;		try{			fos=new FileOutputStream(f);		}		catch(FileNotFoundException fnfe){			fnfe.printStackTrace();		}		try{			fos.write(data);		}		catch(IOException ioe){			ioe.printStackTrace();		}	}	/**	 * Main program	 * @param args - 	 */	public static void main(String [] args) {		VideoRecorder videoRecorder = new VideoRecorder();		VideoPlayer videoPlayer=new VideoPlayer();			//for(int i=0;i<2;i++){			videoRecorder.start();					try{				Thread.sleep(5000);			}			catch(InterruptedException ie){				ie.printStackTrace();			}			videoRecorder.stop();							videoPlayer.initialize(videoRecorder.getRecord());			videoPlayer.play();				try{				Thread.sleep(5000);			}			catch(InterruptedException ie){				ie.printStackTrace();			}						//}		writeBufferToFile(videoRecorder.getRecord());	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -