克隆数据源(DataSource) --JMF

浅克隆数据源
     
    为一个数据源创建多个克隆数据源,再利用这些克隆数据源创建不同的播放器.

解决方案:

1.为输入URL创建一个数据源.
2.利用Manager.createCloneableDataSource()从原始数据源创建一个克隆数据源。
3.创建多个数据源由可克隆数据源。

 Related Classes
 
javax.media.Player
javax.media.Manager
javax.media.protocol.SourceCloneable
 
 
How to run this sample
 
java Clone <URL> <# of copies>


Example:
java Clone file:/c:/temp/foo.mov 2
 
 
Source Code
 
import java.awt.*;
import javax.media.*;
import javax.media.control.TrackControl;
import javax.media.format.*;
import javax.media.protocol.*;
import javax.media.protocol.DataSource;

/**
 * Sample program to clone a data source using the cloneable DataSource and
 * playback the result.
 */
public class Clone extends Frame implements ControllerListener {

 Player p; // 播放器

 Object waitSync = new Object(); // 同步对象

 boolean stateTransitionOK = true; // 状态标识符

 /**
  *
  * 创建一个数据源,并利用数据源创建一个播放器来播放媒体,如果启动成功则返回true,否则返回false
  */
 public boolean open(DataSource ds) {
  System.err.println("create player for: " + ds.getContentType());
  try {
   p = Manager.createPlayer(ds);
  } catch (Exception e) {
   System.err.println("Failed to create a player from the given DataSource: "+ e);
   return false;
  }

  p.addControllerListener(this);  //添加监听器为播放器

  // Realize the player.
  p.prefetch();    //使播放器达到 prefetched状态
  if (!waitForState(p.Prefetched)) {
   System.err.println("Failed to realize the player.");
   return false;
  }

  // Display the visual & control component if there's one.

  setLayout(new BorderLayout());

  Component cc;

  Component vc;
  if ((vc = p.getVisualComponent()) != null) {
   add("Center", vc);
  }

  if ((cc = p.getControlPanelComponent()) != null) {
   add("South", cc);
  }

  // Start the player.
  p.start();    //播放媒体

  setVisible(true);

  return true;
 }

 public void addNotify() {   //唤醒被阻塞的线程
  super.addNotify();
  pack();
 }

 /**
  * 当状态转换时阻塞播放器,直到播放器达到参数中给定的状态。如果转换失败则返回false
  *
  */
 boolean waitForState(int state) {
  synchronized (waitSync) {
   try {
    while (p.getState() < state && stateTransitionOK)
     waitSync.wait();
   } catch (Exception e) {
   }
  }
  return stateTransitionOK;
 }

 /**
  * 监听器
  */
 public void controllerUpdate(ControllerEvent evt) {

  if (evt instanceof ConfigureCompleteEvent
    || evt instanceof RealizeCompleteEvent
    || evt instanceof PrefetchCompleteEvent) {
   synchronized (waitSync) {
    stateTransitionOK = true;
    waitSync.notifyAll();
   }
  } else if (evt instanceof ResourceUnavailableEvent) {
   synchronized (waitSync) {
    stateTransitionOK = false;
    waitSync.notifyAll();
   }
  } else if (evt instanceof EndOfMediaEvent) {
   p.close();
   // System.exit(0);
  } else if (evt instanceof SizeChangeEvent) {
  }
 }

 /**
  * Main program
  */
 public static void main(String[] args) {

  if (args.length == 0) {
   prUsage();
   System.exit(0);
  }

  MediaLocator ml;
  int copies = 1;

  if ((ml = new MediaLocator(args[0])) == null) {
   System.err.println("Cannot build media locator from: " + args[0]);
   prUsage();
   System.exit(0);
  }

  if (args.length > 1) {
   try {
    copies = new Integer(args[1]).intValue();
   } catch (NumberFormatException e) {
    System.err.println("An invalid # of copies is specified: "
      + args[1]);
    System.err.println("Will default to 1.");
    copies = 1;
   }
  }

  DataSource ds = null;

  try {
   ds = Manager.createDataSource(ml); 
  } catch (Exception e) {
   System.err.println("Cannot create DataSource from: " + ml);
   System.exit(0);
  }

  ds = Manager.createCloneableDataSource(ds); //克隆数据源

  if (ds == null) {
   System.err.println("Cannot clone the given DataSource");
   System.exit(0);
  }

  Clone clone = new Clone();

  if (!clone.open(ds))
   System.exit(0);

  for (int i = 1; i < copies; i++) {

   clone = new Clone();
   if (!clone.open(((SourceCloneable) ds).createClone()))
    System.exit(0);
   // dd = ((SourceConeable)ds).createClone() 返回 DataSource 的基类或 是 DataSource类
   // clone.open(dd);
   //以后的每一个都是DataSource;
  }
 }

 static void prUsage() {
  System.err.println("Usage: java Clone <url> <# of copies>");
 }
}

总结:先利用Manager创建一个克隆数据源即Manager.createCloneableDataSource(ds),然后再利用这个克隆数据源就可以无限制的再创建克隆

数据源了,DataSource ds = ((SourceConable)ds).createClone(),这后以后就可以很方便的使用这个数据源了。

 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值