Chromecast 更新流的元数据而不重新启动流
Posted
技术标签:
【中文标题】Chromecast 更新流的元数据而不重新启动流【英文标题】:Chromecast update meta data for stream without restarting stream 【发布时间】:2014-02-18 23:13:41 【问题描述】:我最初使用以下代码在 ios 中进行投射:
metadata setString:lblSongInfo.text forKey:kGCKMetadataKeyTitle];
[metadata setString:currentStation.stationName
forKey:kGCKMetadataKeySubtitle];
[metadata addImage:[[GCKImage alloc]
initWithURL:[[NSURL alloc] initWithString:urlString]
width:300
height:300]];
//define Media information
GCKMediaInformation *mediaInformation =
[[GCKMediaInformation alloc] initWithContentID:
streamURL
streamType:GCKMediaStreamTypeLive
contentType:@"audio/mp3"
metadata:metadata
streamDuration:0
customData:nil];
//cast audio
[_mediaControlChannel loadMedia:mediaInformation autoplay:TRUE playPosition:0];
如何在不重新加载音频流的情况下仅更新此媒体项目的元数据(标题、副标题和图像)?我不希望播放中断。任何帮助表示赞赏。
【问题讨论】:
嗨 Codeman,您找到满足您要求的解决方案了吗?我在编写自定义接收器时处于相同的位置,想知道您是否成功了? 【参考方案1】:您需要编写自己的自定义接收器才能接收带外数据;如果您坚持使用 Styled/Default 接收器,这些接收器将无法接收该类型的消息。要将纯数据发送到接收器,您有两种选择:
使用某些媒体控制命令中可用的 customData 字段,或 添加一个新的命名空间,并使用它随时发送数据。第一个选项仅限于那些在尝试向接收器发送媒体控制命令时发送数据就足够的场景。
在您的情况下,最简洁的解决方案是使用第二个选项,但您可以使用第一个选项并发送元数据集合,例如,加载媒体,然后在接收器上有一个自定义逻辑来提取该集合并按照您自己的逻辑(例如定期)更新元数据。如果这满足您的要求,那么您将不需要新的命名空间,但它有其局限性,并且创建命名空间确实很简单。
【讨论】:
谢谢阿里。你能指出我正确的方向来更新元数据的命名空间解决方案的一些示例代码吗?每次歌曲在我的音频流中发生变化时,我都需要更新元数据。谢谢。 很简单,请看一下这个 Github 项目:github.com/googlecast/CastHelloText-android,其中设置了一个简单的通道/命名空间来与接收者通信。接收器代码也在其中,因此您可以看到两端。 还有一个类似的 ios 示例执行相同的操作:github.com/googlecast/CastHelloText-ios 对于流媒体广播应用,您是否建议应用(发送方)拥有正在播放但静音的流的副本,并在歌曲更改为自定义接收方时发送更新的元数据?或者当流中的元数据发生变化时,自定义接收者是否应该通知发送者?试图找出最好的方法。谢谢! 如果您的接收器可以检测到,最好这样做;当它捕捉到变化时,它会“广播”一条消息(可能将相关数据作为消息的一部分传递),因此任何连接的发送者都可以相应地更新其 UI。在官方 SDK 中,接收者有两种发送消息的模式:它可以将其发送给特定的发送者,也可以将其发送给所有连接的发送者(广播);在您的情况下,广播更有意义,更容易;您无需遍历每个连接的设备并将相同的消息发送给各个设备。以上是关于Chromecast 更新流的元数据而不重新启动流的主要内容,如果未能解决你的问题,请参考以下文章
如何在邮件被验证时更新Firebase用户流的数据(Flutter)
如何在邮件被验证时更新Firebase用户流的数据(Flutter)