想写个JMF程序实现:
1.获得媒体设备,捕捉数据
2.本地播放视频捕捉的数据
3.传输该数据至远程PC机
4.将该数据本地保存
为了解决三个问题(本地播放、传输、保存)得用数据克隆
部分代码如下:
//自定义类
//获得设备数据
import CaputreUtil;
//传输数据
import RTPTransmit;
//保存数据
import Store;
import ……;
public class Server{
……
DataSource datasource = null;
datasource = CaptureUtil.getCaptureDS( new VideoFormat(null) ,new AudioFormat(null));//获得数据源
//创建可克隆数据源
DataSource cloneableDS = Manager.createCloneableDataSource(datasource);
//由可克隆数据源克隆出新的数据源,一个用于保存,一个用于传输
DataSource toFileDS = ((SourceCloneable)dataClone).createClone();
DataSource transmitDS = ((SourceCloneable)dataClone).createClone();
//传输数据
RTPTransmit rtpTransmit = new RTPTransmit(transmitDS, "192.168.1.15 ", "8686 ",null);
rtpTransmit.mystart();
//保存数据
Store store = new Store(toFileDS);
……
}
////////////////////////////////////////////////////////////////////
public class CaputreUtil{
……
public DataSource getCaptureDS(Format vf,Format af){
……//获得数据源
}
……
}
///////////////////////////////////////////////////////////////////
public class RTPTransmit{
……
public RTPTransmit(DataSource ds,String ipAddress,String port,Format mf){
……//用ds创建一个processor传输数据
}
……
}
//////////////////////////////////////////////////////////////////
public class Store{
……
DataSource datasource = null;
public Store(DataSource ds){
this.datasource = ds;
……/用datasource创建一个processor
……//调用processor.getDataOutput()获得数据流 DataSource outSource
……//再用该数据流创建一个DataSink datasink;
……//然后调用processor.start
}
……
}
经过测试上面那样做,三个功能都可以实现。
也就是说克隆所获得的数据既可以用于播放,又可以用于传输,还可以本地存储。
不过遇到了个问题,我做了如下的修改:
1.将Server中获得数据的方法直接复制到Server中
2.分别用三种数据源测试文件传输单个功能
三种数据源如下:
DataSource datasource = null;
//原数据源
datasource = CaptureUtil.getCaptureDS( new VideoFormat(null) ,new AudioFormat(null));
//可克隆数据源