Chromecast将TTML网址添加到Smooth Stream清单中

时间:2014-03-08 21:25:39

标签: google-cast chromecast smooth-streaming ttml

我想在接收器应用程序中使用TTML字幕URL更新SmoothStreaming chromecast播放器。 我的清单文件从一开始就不包含此URL,因此我需要添加它:

cast.player.enableCaptions(true, 'ttml', subtitleUrl);

我在播放器启动后立即执行此操作并将元数据加载到媒体元素(如其他帖子中所推荐的那样),但是在查看

protocol.getStreamCount();

我只获得两个流:一个用于视频,一个用于音频。我看不到那里有标题的迹象。 我还尝试覆盖宿主对象中的清单信息(适用于许可证URL):

host.updateCaptionsRequestInfo = function (request){
    requestInfo.url=subtitleUrl;
}

但是直到我调用enableCaptions函数才会调用此函数(并且只有在我添加第三个参数时才调用此函数,此时第三个参数是不必要的,因为它被updateCationsRequestInfo函数覆盖)。

有谁知道如何检查字幕请求是否被接受或拒绝,以及如何处理?不使用updateCationsRequestInfo()会更好,因为我可以在播放期间更改字幕。

问题可能是网址看起来不像是ttml链接(它是通过转换器传递的另一种格式)吗?

感谢您的帮助!

有关CORS的更新:

我在调用player.enableCaptions()之前记录了ttml-url,如果我按照url,我得到了ttml文件(响应头:Content-Type:text / xml和一些与CORS相关的头文件)。在谷歌开发工具中,我无法看到任何与player.enableCaptions()相关的内容,没有错误或成功消息。因此它与CORS问题无关。

2 个答案:

答案 0 :(得分:0)

首先,当我拨打以下电话时,它对我有用:

window.mediaPlayer.enableCaptions(真,' TTML'' captions_styled.ttml&#39);

我的window.mediaPlayer是我的

实例

new cast.player.api.Player(window.mediaHost);

和我的captions_styled.ttml托管在与我的接收器应用程序相同的服务器上,以避免CORS问题。

其次,这种添加标题的方式是通过外部文件。这与清单文件中规定的标题不同。这就是你的getStreamCount没有显示它的原因。

您可以通过调用以下方法禁用外部字幕:

window.mediaPlayer.enableCaptions(假,' VTT&#39);

请务必在重新装入媒体播放器之前调用window.mediaPlayer.unload()。

答案 1 :(得分:0)

我找到了出错的部分! 我的应用程序从一开始就正确设置了标题,当我查看

document.getElementById('video').textTracks[0]
在开发工具中我看到它在那里(长度=== 1)。但它在“cues”键下没有任何内容,即没有从ttml文件中加载任何内容。经过一些测试后,我发现问题在于在ttml文件中显示时间的语法。第一行有效,第二行无效:

<p begin="00:00:05.83" end="01:00:15.00"></p>
<p begin="8.0s" end="1000.0s"></p>

据我了解,这两种格式都支持ttml格式(http://www.w3.org/TR/ttaf1-dfxp/#timing-value-timeExpression)。似乎这是chromecast浏览器不支持的东西,或者我错过了ttml时间语法如何工作的东西。

用于测试参考的TTML文件:

这是我在检查问题所在时使用的测试TTML文件:

<tt xmlns:tts="http://www.w3.org/2006/04/ttaf1#styling" xmlns="http://www.w3.org/2006/04/ttaf1">
<head>
  <styling>
  <style id="defaultCaption" tts:fontSize="24" tts:fontFamily="Arial" tts:fontWeight="normal" tts:fontStyle="normal" tts:textDecoration="none" tts:color="white" tts:backgroundColor="black" tts:textAlign="center"/>
  </styling>
</head>
  <body style="defaultCaption" id="thebody">
    <div>
    <p begin="00:00:05.83" end="01:00:15.00">
      <metadata ccrow="0" cccol="15"/>
      On screen for 10 sec
    </p>
    <p begin="8.0s" end="1000.0s">
      <metadata ccrow="5" cccol="15"/>
      CCROW 8 COL 15 for 5 sec
    </p>
    </div>
  </body>
</tt>

这就是开发工具中出现的内容:

document.getElementById('video').textTracks[0]
  > TextTrack {oncuechange: null, activeCues: TextTrackCueList, cues: TextTrackCueList, mode: "showing", language: ""…}
    >  activeCues: TextTrackCueList
    >  cues: TextTrackCueList
      >  0: TextTrackCue
     length: 1
      >  __proto__: TextTrackCueList
       kind: "captions"
       label: ""
       language: ""
       mode: "showing"
       oncuechange: null
    >  __proto__: TextTrack

在关键字textTracks [0] .cues下有一个对象,即表示使用“hh:mm:ss.fraction”语法的标题的对象。另一个在加载到浏览器时丢失。这是否可能在将来支持chromecast?