编写JMF的程序最应该注意的是player的状态,因为只有player经过了正常的状态转换才能够正常进行读取媒体信息,和对媒体信息进行正常的操作。
以下是对读取的媒体信息进行保存的测试,程序启动后会读取10秒的媒体信息并进行保存:
package com.lcq.jmf;
import java.io.File;
import java.io.IOException;
import javax.media.DataSink;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Processor;
import javax.media.format.VideoFormat;
import javax.media.protocol.DataSource;
import javax.media.protocol.FileTypeDescriptor;
import jmapps.util.StateHelper;
public class Save2File {
public static void main(String[] args) throws Exception {
// CaptureDeviceInfo info = (CaptureDeviceInfo)
// CaptureDeviceManager.getDeviceList(new VideoFormat(null)).get(0);
MediaLocator mediaLocator = new MediaLocator("vfw://0");// 此类描述媒体目录的地址????
MediaLocator audioLocator = new MediaLocator("javasound://44100");
DataSource[] dataSources = new DataSource[2];
dataSources[0] = Manager.createDataSource(mediaLocator);
dataSources[1] = Manager.createDataSource(audioLocator);
DataSource ds = null;
ds = Manager.createMergingDataSource(dataSources);
ds = Manager.createCloneableDataSource(ds);
Processor p = null;
try {
p = Manager.createProcessor(ds);
} catch (Exception e) {
e.printStackTrace();
}
StateHelper sh = new StateHelper(p);
sh.configure(5000);
VideoFormat vf = new VideoFormat(VideoFormat.CINEPAK);
// AudioFormat vf = new AudioFormat(AudioFormat.IMA4);
p.getTrackControls()[0].setFormat(vf);
p.getTrackControls()[0].setEnabled(true);
p.setContentDescriptor(new FileTypeDescriptor(
FileTypeDescriptor.QUICKTIME));
sh.realize(5000);
File file = new File("video.avi");
try {
file.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
DataSink sink = null;
try {
sink = Manager.createDataSink(p.getDataOutput(), new MediaLocator(
file.toURL()));
} catch (Exception e) {
e.printStackTrace();
}
try {
p.start();
sink.open();
sink.start();
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(10000);// 录制10秒
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
p.close();
sink.stop();
sink.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
该程序中处理了视频的格式问题,可以进行存储后直接播放。但是视频和音频的混合播放好像有点问题,还需解决。