使用 Chromecast SDK 确定是不是在接收器上为 android 启用了隐藏式字幕

Posted

技术标签:

【中文标题】使用 Chromecast SDK 确定是不是在接收器上为 android 启用了隐藏式字幕【英文标题】:Using Chromecast SDK to determine if closed captions are enabled on the receiver for android使用 Chromecast SDK 确定是否在接收器上为 android 启用了隐藏式字幕 【发布时间】:2019-10-30 14:33:32 【问题描述】:

我希望能够确定我的接收器(CAF 接收器)是否有正在显示的字幕。这样我就可以依靠接收者告诉发送者字幕已启用,而不是在发送者上保存隐藏字幕的先前状态。有没有使用 remoteMediaClient 的方法或方法?

【问题讨论】:

【参考方案1】:

我不确定你是指发送者还是接收者,但我会给你两个:)

可以像这样在android上获得它

  private val SUB_TITLE_TYPES = intArrayOf(MediaTrack.SUBTYPE_SUBTITLES, MediaTrack.SUBTYPE_CAPTIONS)

 fun getActiveMediaTracks(context: Context): LongArray =
    getRemoteMediaClient(context)?.mediaStatus?.activeTrackIds ?: longArrayOf()

 fun getSubtitleTracks(context: Context): List<MediaTrack> =
    getActiveMediaTracks(context).filter 
        it.type == MediaTrack.TYPE_TEXT && it.subtype in SUB_TITLE_TYPES
    

或在 Chromecast 接收器上 (TextTracksManager)

cast.framework.CastReceiverContext.getInstance().getTextTracksManager().getActiveTracks()

编辑可以看到,当我从 IDE 复制代码时,我混淆了这两个函数。有活动 ID 和所有媒体轨道(包括音频、视频、文本)。 MediaTrack.SUBTYPE_SUBTITLES* 之间可能存在差异,猜测取决于流。

这里是如何找到活动的文本轨道

val remoteMediaClient = CastContext.getSharedInstance(context).sessionManager?.currentCastSession?.remoteMediaClient
remoteMediaClient?.mediaInfo?.mediaTracks?.filter 
  it.type == MediaTrack.TYPE_TEXT && it.subtype in SUB_TITLE_TYPES
?.let  
  textTracks -> 
  val activeTrackIds = remoteMediaClient.mediaStatus?.activeTrackIds?.filter  activeTrackId ->
     textTracks.none  track -> track.id == activeTrackId 
  .toLongArray()
 activeTrackIds.size > 0

【讨论】:

我假设如果 activeTracks 返回为 null 或 0,那么没有启用字幕,对吗? 是的,我们使用相同的假设。

以上是关于使用 Chromecast SDK 确定是不是在接收器上为 android 启用了隐藏式字幕的主要内容,如果未能解决你的问题,请参考以下文章

除了来自 google 的 chromecast,是不是可以使用 google cast SDK 构建我自己的 google cast 接收器?

Chromecast SDK 投射整个屏幕

您的 chromecast 应用能否仅使用预览版 SDK 发布?

如何将屏幕内容流式传输到 Chromecast

ChromeCast SDK 专辑封面

支持 Chromecast 的 Android SDK 推荐视频播放器