日期:2014-05-20  浏览次数:20847 次

JMF中三种数据源有什么区别和联系
想写个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));
        //可克隆数据源