1

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

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

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

protocol.getStreamCount();

我只得到两个流:一个用于视频,一个用于音频。我在那里看不到任何字幕的迹象。我还尝试覆盖主机对象中的清单信息(这适用于许可证 url):

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

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

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

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

感谢您的帮助!

关于 CORS 的更新:

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

4

2 回答 2

0

首先,当我进行如下调用时,它对我有用:

window.mediaPlayer.enableCaptions(true,'ttml','captions_styled.ttml');

我的 window.mediaPlayer 是我的实例

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

并且我的 captions_styled.ttml 与我的接收器应用程序托管在同一台服务器上,以避免出现 CORS 问题。

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

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

window.mediaPlayer.enableCaptions(false,'vtt');

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

于 2014-03-12T00:32:59.317 回答
0

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

document.getElementById('video').textTracks[0]

在开发工具中,我看到它在那里(长度===1)。但它在“提示”键下没有任何内容,即没有从 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 上支持的东西吗?

于 2014-03-12T12:01:29.967 回答