Processing Time-Based Media with JMF(第4页)

来源:互联网 发布:国研网统计数据库包括 编辑:程序博客网 时间:2024/04/28 00:52

 

处理JMF基于时间的媒体(JMF 2.0 API Guide第4页)
 
Processor可被用于一个可设计的Player,使你能够控制解码和编译过程。一个Processor也可被用于一个摄像机,使你能够控制解码和拍摄媒体数据的多路技术。
 
你可以通过一个Processor控制处理的几种方式:
 
使用一个ProcessorModel创建一个已包含了input和output特性的Processor。
使用TrackControl setFormat 方法指定在单一轨迹上完成格式转换的内容。
使用Processor setOutputContentDescriptor方法指定Processor对象的输出的多路数据格式。
使用TrackControl setCodeChain方法选择通过Processor使用的Effect 或 Codec 插件。
使用TrackControl setRenderer方法选择通过Processor使用的Renderer 插件.
 
注意:一些高效率或轻量级的Processor工具可能选择不支持处理选项,以便他们可以提供最优化的JMF处理方案。JMF2.0的引用工具由Sun Microsystems,Inc 和 IBM公司提供,通过TrackControl对象和setOutputCotentDescriptor全面支持处理选项。
 
配置一个Processor
 
为使任何一个Player进入Realizing和Prefetching状态,就像准备启动一样,一个Processor也进入一个Configuring 阶段。调用configure移动一个Unrealized Processor进入Configuring 阶段。
 
当处于Configuring 阶段中时,一个Processor集合了它必须为每一个轨迹创建TrackControl对象的信息。当它完成时,它进入Configured状态,并提交一个ConfigureCompleteEvent事件。一旦Processor被配置完,你就可以设置它的输出格式和TrackControl选项了。当你完成了指定处理选项,调用realize将Processor移动到Realizing状态,然后开始实现过程。
 
一旦Processor被实现,更进一步的尝试修改它的处理选项是不保证会成功的。更多情况下,会抛出一个FormatChangeException异常。
 
选择轨迹处理选项
 
要在媒体流中选择哪一个插件被用于处理各自的轨迹:
 
1.调用PlugInManager.getPlugInList方法确定什么插件是可用的。PlugInManager返回一个匹配指定输入输出格式和类型的插件列表。
2.在Processor上调用getTrackControls得到媒体流中各自轨迹的TrackControl。这个Processor必须在你调用getTrackControls前处于Configured状态下。
3.调用TrackControl setCodecChain或者setRenderer方法指定你想为每一个轨迹使用的插件。
 
当你使用setCodecChain指定多媒体数字信号编解码器(codec),并为一个Processor实现一个插件时,插件在处理链中实际出现的顺序是通过各自插件支持的输入和输出格式所定义的。
 
通过一个特殊的Codec,可以控制在一个轨迹的转换的完成,你可以使用编解码联合控制轨迹。要得到这个编解码控制,调用TrackControl getControls方法。这返回了所有联合轨迹的控制,包括如H263Control, QualityControl, MPEGAudioControl 的编解码控制。(因为编解码控制的列表通过JMF定义,参考Standard Controls)。
 
转换媒体数据从一种格式到另一种
 
你可以通过TrackControl为一个特殊的轨迹选择一种格式:
1.在Processor上调用getTrackControls为每一个在媒体流上的轨迹得到TrackControl。Processor在你调用getTrackControls之前必须处于Configured状态。
2.使用TrackControl setFormat方法指定你想转换选定的轨迹的格式。
 
指定输出数据格式
 
你可以使用Processor setContentDescriptor方法指定通过Processor输出的数据格式。调用getSupportedContentDescriptiors可以得到一个所支持数据格式的列表。
 
通过使用ProcessorModel去创建Processor,你也可以选择你想要的输出格式。(参考Using a ProcessorModel to Create a Processor得到更多信息)
 
指定一个输出数据格式,并为这个格式自动的选择默认的处理选项,通过TrackControls覆盖先前选择的处理选项。将输出数据格式置为空引起媒体数据被递归,而取代Processor对象的输出数据源。
 
指定媒体目的地
 
你可以通过选择一个特殊的Renderer为媒体数据流指定一个目的地,使一个轨迹通过它的TrackControl,或者通过使用从一个Processor作为输入到另一个特殊的DataSink的输出。你也可使用Processor输出做为输入到另一个有不同目的的Player或Processor。
 
选择一个递归者
 
选择你想使用的递归者(Renderer):
 
1.在Processor上调用getTrackControls得到在媒体流上的用于每个轨迹的TrackControl。在调用getTrackControls以前,这个Processor必须处于Configured状态.
2.调用TrackControl setRenderer方法指定Renderer插件。
 
将媒体数据写入文件
 
你可以使用DataSink从Processor对象的输出数据源读取媒体数据,然后复制数据到一个文件中。
1.调用getDataOutput从Processor中得到输出数据源。
2.调用Manager.createDataSink创建一个文件写入者DataSink。传递输出数据源和一个指定你想写入文件的位置的MediaLocator。
3.在DataSink上调用open打开文件。
4.在DataSink上调用start开始写入数据。
 
写入指定文件的数据格式是通过Processor控制的。用默认值,Processor输出未加工的数据。要改变一个Processor对象的输出数据源的内容类型,使用setContentDescriptor方法。
 

Example 4-1: Using a DataSink to write media data to a file.
 DataSink sink;
 MediaLocator dest = new MediaLocator(file://newfile.wav);
 try{
         sink = Manager.createDataSink(p.getDataOutput(), dest);
         sink.open();
         sink.start();
 } catch (Exception) {}

 
通过实现StreamWriterControl,一个Processor可以让用户能够控制超过它能写入的文件的最大字节数。在Processor上调用getControl(“javax.media.datasink.StreamWriterControl”),能找出是否一个Processor提供了StreamWriterControl。
 
连接一个Processor到另一个Player
 
来自Processor的输出能被用作另一个Player的输入。要从一个Processor中得到输出,调用返回一个DataSource的getDataOutput。通过Manager,这个DataSource可能被反过来用于创建一个Player或Processor。
 
使用JMF插件作为单机处理模块
 
JMF插件也可被用于JMF框架以外。你可以直接实例插件,然后调用它的处理方法完成处理操作。
 
你可能想编码或解码一个媒体流,或是转换一个流从一种格式到另一种格式。
原创粉丝点击