使用 CastCompanionLibrary 将“播放列表”推送到 Chromecast

Posted

技术标签:

【中文标题】使用 CastCompanionLibrary 将“播放列表”推送到 Chromecast【英文标题】:Pushing a "playlist" to Chromecast using CastCompanionLibrary 【发布时间】:2015-11-11 15:13:24 【问题描述】:

使用CastCompanionLibrary,将MediaInfo 发送到Chromecast API 即可轻松播放。

MediaInfo.Builder media = new MediaInfo.Builder("http://url.to/video.mp4");

VideoCastManager cast = ...
cast.startVideoCastControllerActivity(context, media.build(), 0, true);

发送多个MediaInfos 以创建队列(播放列表)的推荐方法是什么?

更新 #1:

我尝试将 queueLoad 添加到代码中。让它在startVideoCastControllerActivity之后运行。

MediaInfo.Builder info = new MediaInfo.Builder("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
info.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED);
info.setContentType("video/mp4");

MediaQueueItem[] items = new MediaQueueItem[] 
        new MediaQueueItem.Builder(info.build()).build(),
        new MediaQueueItem.Builder(info.build()).build(),
        new MediaQueueItem.Builder(info.build()).build()
;

cast.queueLoad(items, 0, 0, null);

它使用此日志使应用程序崩溃:

java.lang.NullPointerException:尝试调用虚拟方法 'java.lang.String com.google.android.gms.cast.MediaMetadata.getString(java.lang.String)' 在空对象引用上 com.google.android.libraries.cast.companionlibrary.cast.VideoCastManager.updateMiniController(SourceFile:309) 在 com.google.android.libraries.cast.companionlibrary.cast.VideoCastManager.updateMiniControllers(SourceFile:321) 在 com.google.android.libraries.cast.companionlibrary.cast.VideoCastManager.onRemoteMediaPlayerStatusUpdated(SourceFile:2126) 在 com.google.android.libraries.cast.companionlibrary.cast.VideoCastManager.access$200(SourceFile:136) 在 com.google.android.libraries.cast.companionlibrary.cast.VideoCastManager$22.onStatusUpdated(SourceFile:1804) 在 com.google.android.gms.cast.RemoteMediaPlayer.onStatusUpdated(未知 来源)在 com.google.android.gms.cast.RemoteMediaPlayer.zza(未知 来源)在 com.google.android.gms.cast.RemoteMediaPlayer$1.onStatusUpdated(未知 来源)在 com.google.android.gms.cast.internal.zzm.zza(未知 来源)在 com.google.android.gms.cast.internal.zzm.zzbZ(未知 来源)在 com.google.android.gms.cast.RemoteMediaPlayer.onMessageReceived(未知 来源)在 com.google.android.gms.cast.internal.zze$zzb$4.run(未知 来源)

【问题讨论】:

目前,想法是您将项目添加到要播放的队列中,但您不会将用户发送到 VideoCastControllerActivity,而是将它们保留在浏览页面上,以便他们可以添加更多项目到队列或管理队列。当队列加载到接收器上时,迷你控制器会出现,如果用户想要进入 VideoCastControllerActivity,她可以按下迷你控制器(在内部调用 startVideoCastcontrollerActivity)。也就是说,你可以在等待队列加载后调用startVideoCastControllerActivity。 如果您想要一个新的 startVideoCastControllerActivity 变体,它需要一个队列项数组,请随时打开一个功能请求。 也许它崩溃的原因是我目前根本不使用 MiniController。这可以想象吗? 您需要为用户提供一种方法,让他们可以在您的应用程序中的任何位置控制演员内容的播放,迷你控制器是基于 UX Checklist 的推荐方法,因此它是一种不管这个问题如何,添加这一点是个好主意。在您当前的应用中,用户离开该页面后如何返回 VideoCastControllerActivity? 当前有通知或Chromecast路由器按钮。 【参考方案1】:

推荐的方法是为每个 MediaInfo 创建一个 MediaQueueItem,然后使用 VideoCastManager#queueLoad() 并传递一个 MediaQueueItem 数组。也可以从单个队列项开始并附加到该队列项,或插入队列中的某个位置等;还有很多方法可以编辑和管理队列。

SDK(和 CCL)有一些回调可以让您知道队列何时更新等,因此您可以使用这些回调来更新您的发送方(例如,如果发送方 A 更新队列,发送方 B 可以使用这些回调来保持同步)。 CastVideos-android 应用程序使用它并提供了一个简单的用户界面来滑动队列项目或重新排序等。

【讨论】:

我尝试使用queueLoad,它可以与startVideoCastControllerActivity 一起使用吗?请参阅有问题的更新 #1。 这看起来是最好的答案。无法直接向 Activity 发送队列。 是否可以检测到某一集已结束并进行网络调用以获取下一集?当用户开始投射时,我必须进行 20 次网络调用才能获得我希望在队列中拥有的所有剧集。【参考方案2】:

您必须创建一个自定义接收器来实现播放列表功能。如何使用 javascript 在接收器上实现播放列表结构取决于您。 See this answer 来自 Ali Nadaf,关于为什么需要在接收方而不是发送方维护播放列表。

至于加载多个 MediaInfo 项目,您必须查看 castManager 和 MediaQueueItem 类的 queueLoad 方法。

【讨论】:

Cast SDK现在有队列相关的api,推荐使用,另外样式化的receiver或defaultreceiver现在可以处理queue,所以你不必为简单的情况编写自己的receiver ;由于接收方 SDK 现在了解队列是什么,因此它会在队列发生更改时通知所有连接的设备,因此我之前发布的大部分 cmets 现在都由接收方处理。播放列表没有持久性,这是发送者或接收者可以做的事情,需要在完整的实现中使用云。

以上是关于使用 CastCompanionLibrary 将“播放列表”推送到 Chromecast的主要内容,如果未能解决你的问题,请参考以下文章

使用 CastCompanionLibrary 仅投射音频?

CastCompanionLibrary 和不扩展 ActionBarActivity

使用适用于 Android 的 CastCompanionLibrary 扫描设备

CastCompanionLibrary : mApiClient 或 mRemoteMediaPlayer 为空

R 无法解析为 Eclipse 中 CastCompanionLibrary 上的变量

mediaroutebutton CastCompanionLibrary 上的连接动画