JMF求教
package com.jake.camera.test;
import java.io.IOException;
import java.util.Vector;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.DataSink;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Processor;
import javax.media.control.StreamWriterControl;
import javax.media.format.AudioFormat;
import javax.media.format.VideoFormat;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;
import net.sf.fmj.media.RegistryDefaults;
import net.sf.fmj.media.cdp.GlobalCaptureDevicePlugger;
public class CaptureAll
{
/** <一句话功能简述>
* <功能详细描述>
* @param args
* @see [类、类#方法、类#成员]
*/
public static void main(String[] args)
{
Processor recordProcessor = null;
StateHelper sh = null;
//查询CaptureDeviceManager,来定位你需要使用的媒体采集设备。
// FMJ
RegistryDefaults.registerAll(RegistryDefaults.FMJ | RegistryDefaults.FMJ_NATIVE);
GlobalCaptureDevicePlugger.addCaptureDevices();
Vector<CaptureDeviceInfo> audioDeviceList =
CaptureDeviceManager.getDeviceList(new AudioFormat(AudioFormat.LINEAR, 44100, 16, 2));
CaptureDeviceInfo audioDevice = audioDeviceList.get(0);
Vector<CaptureDeviceInfo> videoDeviceList =
CaptureDeviceManager.getDeviceList(new VideoFormat(VideoFormat.RGB));
CaptureDeviceInfo videoDevice = (CaptureDeviceInfo)videoDeviceList.get(0);
try
{
MediaLocator audioMediaLocator = audioDevice.getLocator();
MediaLocator videoMediaLocator = videoDevice.getLocator();
DataSource audioDataSource = Manager.createDataSource(audioMediaLocator);
DataSource vedioDataSource = Manager.createDataSource(videoMediaLocator);
DataSource[] sources = new DataSource[2];
sources[0] = audioDataSource;
sources[1] = vedioDataSource;
DataSource mergeSource = Manager.createMergingDataSource(sources);
recordProcessor = Manager.createProcessor(mergeSource);
//获得MediaLocator,并由此创建一个Processor。
sh = new StateHelper(recordProcessor);
}
catch (Exception e)
{
e.printStackTrace();
System.exit(-1);
}
// Configure the processor
if (!sh.configure(10000))
{
System.out.println("configure wrong!");
System.exit(-1);
}
VideoFormat vfmt = new VideoFormat(VideoFormat.RGB);
AudioFormat afmt = new AudioFormat(AudioFormat.LINEAR);
(recordProcessor.getTrackControls())[0].setFormat(afmt);
(recordProcessor.getTrackControls())[0].setEnabled(true);
(recordProcessor.getTrackControls())[1].setFormat(vfmt);
(recordProcessor.getTrackControls())[1].setEnabled(true);
//定义待存储该媒体的内容类型(content type)。
recordProcessor.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.WAVE));
// realize the processor.
if (!sh.realize(10000))
{
System.out.println("realize wrong!");
System.exit(-1);
}
// 获取音频数据流
DataSource source = recordProcessor.getDataOutput();
//定义存储该媒体的文件。
MediaLocator dest = new MediaLocator(new java.lang.String("file:///E:/video.wav"));
//创建一个数据池
DataSink filewriter = null;
try
{
filewriter = Manager.createDataSink(source, dest);
filewriter.open();
}
catch (Exception e)
{
e.printStackTrace();
System.exit(-1);
}
// 获取音频录制流
StreamWriterControl swc =
(StreamWriterControl)recordProcessor.getControl("javax.media.control.StreamWriterControl");
recordProcessor.start();
//限制录制音频的大小
// swc.setStreamSizeLimit();
// 开始录制
try
{
filewriter.start();
}
catch (IOException e)
{
e.printStackTrace();
System.exit(-1);
}
// Capture for 5 seconds 设置录制
sh.playToEndOfMedia(60000);
sh.close();
filewriter.close();
System.out.println("Capture Audio success.");
}
}
报错:
2011-9-10 13:42:10 net.sf.fmj.ffmpeg_java.FFMPEGParser <init>
警告: Unable to initialize ffmpeg libraries: java.lang.UnsatisfiedLinkError: Cannot locate library avformat-51
Java_com_lti_civil_impl_jni_NativeCaptureStream_stop, stopping...
DSCaptureStream::stop, stopping...
DSCaptureStream::stop, stopped.
Java_com_lti_civil_impl_jni_NativeCaptureStream_stop, stopped.
Unable to handle format: LINEAR, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed
Unable to handle format: RGB, 640x480, FrameRate=30.0, 24-bit, Masks=3:2:1, PixelStride=3, LineStride=1920
Failed to realize: com.sun.media.ProcessEngine@1e0ff2f
Error: Unable to realize com.sun.media.ProcessEngine@1e0ff2f
realize wrong!
请问什么原因?谢谢。