JMF求教

zhuseahui 2011-09-10 02:14:29
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!

请问什么原因?谢谢。
...全文
262 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoufuguang 2014-06-03
  • 打赏
  • 举报
回复
是 fmj 吧,楼主如何解决的,我也遇到了

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧