我正在尝试设置CAF接收器以播放直播电视频道。它是单个频道的连续不可搜索流。我有要定期加载的当前和后续程序的所有程序信息。
最初,我使用“ LOAD”消息拦截器将其设置为标准媒体项目,它可以很好地播放流,但没有单独程序的概念。
参加Google Home Cast开发者研讨会后,我意识到应该使用Queuing系统处理LIVE TV流,每个节目都表示为一个Queue项。这样可以使媒体信息自动针对每个程序进行更新,并显示正确的进度信息。但是,我没有看到任何实现此目标的示例。
我一直在研究文档,试图使某些东西正常工作,但是很难将它们全部拼合在一起。以下是我的QueueBase
实现的示例。它确实使用第一个队列项加载并播放流,仅此而已。进度条/值不正确,似乎在进度条上使用各个流段作为持续时间/进度,因此我认为我没有正确设置这些值。我也不确定containerMetadata
信息是否正确或什至需要。
是否有人有更多有关如何配置接收器播放LIVE TV流的信息?似乎我正在丢失某些东西或以错误的方式进行操作,因此将不胜感激。
谢谢
export class LiveQueue extends cast.framework.QueueBase {
async initialize(loadRequestData: LoadRequestData) {
if (
loadRequestData.media &&
loadRequestData.media.contentId &&
loadRequestData.customData.assetType === 'LIVE'
) {
const {
media: { contentId },
customData: { state },
} = loadRequestData;
const { channel, region } = await getLiveAsset(contentId, state);
const queueItems = await this.getLiveQueueItems(channel, region);
const queueData = new cast.framework.messages.QueueData(
channel.id,
channel.name,
channel.description,
'REPEAT_OFF',
queueItems,
0
);
queueData.queueType = 'LIVE_TV';
queueData.containerMetadata = new cast.framework.messages.ContainerMetadata();
queueData.containerMetadata.title = channel.name;
queueData.containerMetadata.containerDuration = Infinity;
queueData.containerMetadata.sections = channel.listings.map(
(program, index) => {
const startTime = moment(program.startTime);
const endTime = moment(program.endTime);
const duration = endTime.diff(startTime) / 1000;
let metadata = new cast.framework.messages.MediaMetadata('GENERIC');
metadata.queueItemId = queueItems[index].itemId;
metadata.sectionDuration = duration;
metadata.sectionStartAbsoluteTime = startTime.unix();
return metadata;
}
);
return queueData;
}
return null;
}
async getLiveQueueItems(channel: Channel, region: Region) {
const playbackDetails = await getLivePlaybackDetails(channel.referenceId);
const { contentUrl, contentType } = playbackDetails;
const queueItems = channel.listings.map((program, index) => {
const startTime = moment(program.startTime);
const endTime = moment(program.endTime);
const duration = endTime.diff(startTime) / 1000;
const media = new cast.framework.messages.MediaInformation();
media.contentId = program.id;
media.contentType = contentType;
media.contentUrl = contentUrl;
media.streamType = 'LIVE';
media.startAbsoluteTime = startTime.unix();
media.duration = duration;
media.metadata = new cast.framework.messages.GenericMediaMetadata();
media.metadata.title = channel.name;
media.metadata.subtitle = channel.listings[index].name;
const queueItem = new cast.framework.messages.QueueItem();
queueItem.media = media;
return queueItem;
});
return queueItems;
}
onCurrentItemIdChanged(itemId: number) {
console.log('onCurrentItemIdChanged', itemId);
}
}