osmf cuepoint

来源:互联网 发布:com域名注册最便宜 编辑:程序博客网 时间:2024/05/21 06:20
 

OSMF中支持提示点

提示点,Cue Point,OSMF
OSMF,全称是Open Source MediaFramework,开源媒体框架,以前的项目代号是Strobe。其中Akamai和Adobe将基于此OSMF框架共同开发Open VideoPlayer应用。OSMF目的是为了让开发者可以更加容易的创建在线媒体播放应用,同时可以轻松扩展媒体应用之上的广告,监控,报告和内容交 付层面的功能。OSMF开源媒体框架包含了针对合作伙伴使用的API,可以用来在使用OSMF开发的媒体应用上添加功能插件扩展。
   OSMF v0.7版包括新的功能有允许你创建,检查,和对临时的元数据作出响应,无论是在媒体编码时嵌入的还是运行时添加给媒体元素的。
   由于提示点从本质上讲是一种临时的元数据,所以我们决定为临时元数据提供一个通用的解决方案,而不是限制自己的视频内容中的提示点。因此,在OSMF中临时数据可以应用于任何媒体元素;你不只限于视频内容的提示点。
提示点的类型:

  • Event:当播放器到达提示点时引发一些具体的行为,例如显示标题,控制动画等。
  • Navigation:允许在媒体中搜索指定点,例如一个章节或一个序列。编码软件在提示点位置创建关键帧。
  • ActionScript:在运行时创建外部提示点,需要代码监视这些提示点。

Event 和 Navigation提示点是在编码时添加,而ActionScript提示点是在运行时添加。
Easing Your Pain解决难点
    在OSMF中新的功能支持临时元数据,解决了一些难点,使我们可以基于这个核心功能构建其它功能,如关闭字幕。解决的具体难点如下:
   1.用CS4进行F4V编码或是以前版本不能在流媒体中监听提示点事件,你需要从onMetaData()处理器提取提示点信息并创建一个计时器来监视提示点再广播一个自定义事件。
   2.为了使你的播放器对ActionScript提示点作出反应,如第1项所述,你必须编写一些代码,这可能不是小事,取决于你是否优化了计时器处理器方法,支持搜索等。
F4V文件是H.264编码。为了响应嵌入式提示点事件,你需要读取onMetaData()处理器中的一组提示点数据,创建一个计时器,编写一些代码来监视NetStream的time属性再广播自定义事件。
ActionScript提示点,你需要做同样的事情,而且确保提示点已存储到你的内部收集器中。
OSMF 0.7版中一个新的metadata facet类TemporalFacet支持处理临时元数据。
如果你不熟悉OSMF元数据,这里是一个简短的介绍(有关更多的资讯,您可以在这里阅读规范http://opensource.adobe.com/wiki/display/osmf/Metadata+Support))。

           
  • 元数据可以被添加到一个媒体元素或媒体资源。
           
  • 所有元数据是由命名空间进行组织,保证其唯一性,允许几种不同类型的数据添加到一个媒体元素或资源。
           
  • 除开命名空间,一个元数据实例还有facet 类型。
           
  • 该facet type描述了元数据,例如有一个KeyValueFacet负责一个包含键值对集合的具体类。该类允许你轻松地添加key/value键值对(mediaName=Test)作为一个媒体元素或媒体资源的元数据。


新类
这些新的类实现了支持新的临时元数据,下面是一个简短的描述:
org.osmf.metadata.TemporalIdentifier
该类是临时元数据的基类,它定义了time 和 duration属性。新的CuePoint类是从该类扩展。
org.osmf.metadata.TemporalFacetEvent
TemporalFacet类广播该事件,表示特定的事件"position reached" 和 "duration reached"。
org.osmf.metadata.TemporalFacet
   这个类主要是管理临时元数据。它管理与媒体元素相关的TemporalIdentifier类型的临时元数据,并且当媒体元素的播放头位置与TemporalIdentifer对象的集合中time值相匹配则广播TemporalFacetEvent类型的事件。基本上,在你的播放器中编写的代码需要处理F4V事件提示点和ActionScript提示点。
   该TemporalFacet类含有添加与监视TemporalIdentifier对象内部集合中的time值的优化算法。以下是优化算法的一些方式:

  • 采用二进制搜索TemporalIdentifier对象内部集合中插入项(按time排序),而不是在每次播放时调用sort排序方法。插入至任何位置都非常快。
  • 当用户暂停播放时停止计时器并且在用户恢复播放时重新启动计时器。
  • 优化了到下一个提示点计时器的间隔(没有理由始终保持每100毫秒检查一次,例如,距离下一个提示点在15秒)
  • 保持最新的提示点引用,就不需要用它时再从集合中搜索。
  • 如果用户搜索,它广播TemporalFacetEvent事件。


org.osmf.video.CuePoint
   该类扩展自TemporalIdentifier类,为视频提示点提供一个更标准的提示点模型。该类包含的属性有:name, type和parameters(parameters属性返回在编码时或运行时的一个键值对的数组)。
提示点示例应用程序
   在OSMF 0.7版提供的提示点样例应用说明如下:
    加载一个视频并填充从onMetaData()处理器中提取的嵌入式的Event和Navigation提示点数据(示例应用的右上角)你可以用time排序表格。该表格的目的是向你展示事件可以收到,允许你Navigation提示点导航和证明TemporalFacet类工作正常。
   点击表格中Navigation提示点视频会到达这个位置(key frame)这代表可以用于章节或序列。
   显示所收到的ActionScript 和 Event提示点(应用程序的左下角)(运行时TemporalFacet类广播的事件)。
   允许你在运行时添加ActionScript提示点(应用程序右下方),查看这些事件被激发。当你点击“Add”按钮你将会看到ActionScript提示点被添加到表格中(注意你可能需要点击Time列强制排序)如果你输入一个重复的值只是保留最后一个。
如何监听提示点
第一步监听元数据facet被添加到你的媒体内容:
  1. videoElement = new VideoElement(new NetLoader(), new URLResource(new URL(MY_STREAM)));
  2. videoElement.metadata.addEventListener(MetadataEvent.FACET_ADD, onFacetAdd);
复制代码
当TemporalFacet被添加到你的媒体元素,你可以开始监听TemporalFacetEvent.POSITION_REACHED事件:
  1. private function onFacetAdd(event:MetadataEvent):void
  2. {
  3.    var facet:TemporalFacet = event.facet as TemporalFacet;
  4.    if (facet)
  5.    {
  6.       facet.addEventListener(TemporalFacetEvent.POSITION_REACHED,
  7.                              onCuePoint);
  8. ...
复制代码
如何在运行时添加提示点
   唯一命名空间中创建一个新的TemporalFacet,为视频元素的元数据添加facet,接着将提示点添加到facet。
  1. _temporalFacet = new TemporalFacet(new URL(CUSTOM_NAMESPACE), videoElement);
  2. videoElement.metadata.addFacet(_temporalFacet);                  
  3.                   
  4. var cuePoint:CuePoint = new CuePoint(CuePointType.ACTIONSCRIPT,
  5.                                     121, // time in seconds
  6.                                     'my test cue point',
  7. null);
  8. _temporalFacet.addValue(cuePoint);
复制代码
当你为媒体元素的元数据添加facet,你将得到上述例子所示的MetadataEvent.FACET_ADD,在此事件处理器中,你可以为你的命名空间创建一个唯一的监听器,或是为来自所有命名空间的提示点用一个事件监听器。