JMF求教

zhuseahui zhuseahui 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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!

请问什么原因?谢谢。
...全文
评论 1
收藏 已收藏
分享
返回顶部
zhuseahui
Java 51,407 成员 86,127 内容