【问题标题】:Playing video ads on Chromecast在 Chromecast 上播放视频广告
【发布时间】:2014-07-31 21:50:38
【问题描述】:

我正在尝试查看是否可以在来自 Android 发件人的 Chromecast 视频之前/期间播放广告。我知道我可以处理接收方的逻辑并切换视频 src 以播放广告,但是我将如何暂停发送方应用程序上的控制器,以便在接收方上更改视频 src 时它不会崩溃?我一直在浏览文档,但我似乎真的找不到关于这个主题的任何内容。

感谢您的帮助

【问题讨论】:

    标签: android chromecast google-cast


    【解决方案1】:

    我一直在使用从接收方到发送方的自定义消息来通知发送方接收方的任何状态变化,效果很好。这是一个示例代码 sn-p,用于处理从发送者到接收者的各种消息——我的应用是一个卡拉 OK 播放列表,它可以将视频排队播放——它基于 CastVideoPlaylist 示例应用)

    在发送方,我只是注册一个消息监听器来相应地更新 UI。

               var playlistMessageBus = castReceiverManager.getCastMessageBus(
                namespace, cast.receiver.CastMessageBus.MessageType.JSON);
            // Create a message handler for the custome namespace channel
            playlistMessageBus.onMessage = function(event) {
                console.log('Playlist message: ' + JSON.stringify(event));
                // Handle the ADD command from the sender
                // Other commands could also be supported
                switch (event.data.command) {
                    case 'ADD':
                        if (playlist == null) {
                            playlist = [];
                        }
                        console.log("Adding " + event.data.playlistItem.contentId + " to playlist");
                        playlist.push(event.data.playlistItem);
                        break;
                    case 'DELETE':
                        // delete the selected item from playlist
                        {
                        var code = 0;
                        if (playlist == null) {
                            code = 0;
                        }
                        else {
                            // find the listItem title, then delete it
                            var index;
                            for (index = 0; index < playlist.length; index++) {
                                if (playlist[index].title == event.data.playlistItem.title) {
                                console.log('Found ' + event.data.playlistItem.title + 'in playlist');
                                break;
                                }
                            }
                            if (index < playlist.length) {
                                playlist.splice(index,1);
                                code = 1;
                            }
                        }
                        var message = {
                            commandResult: 'CMD_RESULT',
                            responseCode: code 
                            };
                        playlistMessageBus.send(event.senderId, JSON.stringify(message));
                        }
                        break;
                    case 'MOVE_TOP':
                        {
                        // move the selected listItem to top of the playlist
                        var code = 0;
                        if (playlist == null) {
                            code = 0;
                        }
                        else if (playlist.length == 1) {
                            code = 1;
                        }
                        else {
                            // find the listItem title, then move it to the top
                            var index;
                            for (index = 0; index < playlist.length; index++) {
                                if (playlist[index].title == event.data.playlistItem.title) {
                                    console.log('Found ' + event.data.playlistItem.title + 'in playlist');
                                    break;
                                }
                            }
                            if (index < playlist.length) {
                                playlist.splice(index,1);
                                playlist.unshift(event.data.playlistItem);
                                code = 1;
                            }
                        }
                        var message = {
                            commandResult: 'CMD_RESULT',
                            responseCode: code
                            };
                        playlistMessageBus.send(event.senderId, JSON.stringify(message));
                        }
                        break;
                    case 'QUERY':
                        switch (event.data.category) {
                            case 'PLAY_STATUS':
                                {
                                console.log("Sending play status back to sender app");
                                // inform all senders on the CastMessageBus of the incoming message event
                                // sender message listener will be invoked
                                var playState = (inPlay) ? 'PLAYING' : 'STOPPED';
                                var message = {
                                    playstatus: 'PLAY_STATUS',
                                    state: playState
                                    };
                                playlistMessageBus.send(event.senderId, JSON.stringify(message));
                                }
                                break;
                            case 'SELECTED_MEDIA':
                                {
                                // return the current select media
                                var listItem = null;
                                if (curLoadedPlaylistItem != null) {
                                    listItem = {
                                        title: curLoadedPlaylistItem.title,
                                        contentId : curLoadedPlaylistItem.contentID,
                                        image: curLoadedPlaylistItem.image
                                        };
                                }
                                var message = {
                                    mediastatus: 'MEDIA_STATUS',
                                    playlistItem: listItem
                                    };
                                playlistMessageBus.send(event.senderId, JSON.stringify(message));
                                }
                                break;
                            case 'PLAYLIST':
                                {
                                // return the playlist
                                var message = {
                                    playliststatus: 'PLAYLIST',
                                    playlist: playlist
                                    };
                                playlistMessageBus.send(event.senderId, JSON.stringify(message));
                                }
                                break;
                            default:
                                console.log("Unrecognized category from sender: " + event.data.category);
                                break;
                        }
                        break;
                    default:
                        console.log("Unrecognized command from sender: " + event.data.command);
                        break;
                }
            };
    

    【讨论】:

      【解决方案2】:

      您有几个不同的选择。我认为更适合您的情况是让您的接收器在发生更改时将接收器端的更改广播给所有连接的发送者,以便发送者可以调整/更新自己;更改可能是播放器状态和元数据更改。例如,在正常情况下,Sender A 可以开始播放电影 A。然后在播放的同时,也连接的 Sender B 可以开始播放电影 B。然后 Sender A 将收到媒体状态和元数据更新通知如果媒体发生了变化,那么它就可以采取适当的行动,无论它是什么。你的情况并没有那么不同。根据您的要求,发送方的处理可能会有所不同。

      【讨论】:

      • 是的,我理解必须做什么背后的概念,但我的主要问题是我不知道执行此操作的函数。我一直在浏览 chromecast api 和文档,但没有发现太多有用的东西。你能给我一个例子/链接到解决这个问题的文件吗?而“适当的动作”是暂停控制器,而不是根据新信息更新自身,直到视频变回原始内容,但我似乎不知道如何“暂停”控制器
      • developers.google.com/cast/docs/custom_receiver 中有大量信息,其中讨论了如何覆盖各种方法,例如 onPlay 等。请注意,在您的接收器中,您应该考虑使用媒体元素和可用于播放/暂停/...的方法以及将触发的事件。我们的 github 上也有一些示例,例如您可以在这里找到一些有用的信息:github.com/googlecast/cast-custom-receiver
      • 我已经完成了所有这些,但我的主要问题是发件人代码。我不知道如何在广告播放时“暂停”投射控制器并显示不同的屏幕,并在视频恢复到原始内容时恢复对视频的控制
      • 您的意思是在发送方切换页面并在发送方暂停?您的发送方是否收到接收方的状态更新?如果是这样,那么您需要注册这些消息,然后做任何您想做的事情,无论是暂停还是其他。如果问题出在发送方,不清楚哪一部分不能做:发送方上的 Cast 相关 api 是通过 SDK api 完成的,您可以在 api 参考中轻松查看它们的内容。除了演员表之外,它只是一个 Android 应用程序,因此您可以执行通常可以在 Android 应用程序中执行的任何操作。
      猜你喜欢
      • 2014-09-10
      • 2016-09-23
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2013-08-21
      • 2014-06-05
      • 2017-10-25
      相关资源
      最近更新 更多