为 chromecast 设置 cors 标头

Posted

技术标签:

【中文标题】为 chromecast 设置 cors 标头【英文标题】:setting cors header for chromecast 【发布时间】:2014-08-23 01:07:56 【问题描述】:

如何在 Chromecast 中为 M3U8 文件流设置 CORS 标头?在我的发件人(android)中,我正在设置 Metadata 和 MediaInfo,如下所示:

metaData = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
metaData.putString(MediaMetadata.KEY_TITLE, "Demo Video");

MediaInfo mediaInfo = new MediaInfo.Builder(
        "http://playertest.longtailvideo.com/adaptive/bbbfull/bbbfull.m3u8")
        .setContentType("application/vnd.apple.mpegurl")
        .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
        .setMetadata(metaData)
        .build();

player.load(client, mediaInfo, true)
      .setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() 
       @Override
       public void onResult(RemoteMediaPlayer.MediaChannelResult mediaChannelResult) 
                    Status status = mediaChannelResult.getStatus();
                                 if (status.isSuccess()) 
                                  
                                  
                                  );

我的 onLoad 方法是这样设置的:

mediaManager.onLoad = function(event) 
        console.log("### Media Manager - LOAD: " + JSON.stringify(event));

        if(mediaPlayer !== null) 
            mediaPlayer.unload(); // Ensure unload before loading again
        

        if (event.data['media'] && event.data['media']['contentId']) 
            var url = event.data['media']['contentId'];

            mediaHost = new cast.player.api.Host(
                'mediaElement': mediaElement,
                'url': url
            );

            mediaHost.onError = function (errorCode) 
                console.error('### HOST ERROR - Fatal Error: code = ' + errorCode);

                if (mediaPlayer !== null) 
                    mediaPlayer.unload();
                
            

            var initialTimeIndexSeconds = event.data['media']['currentTime'] || 0;
            // TODO: real code would know what content it was going to access and this would not be here.
            var protocol = null;

            var parser = document.createElement('a');
            parser.href = url;

            var ext = ext = parser.pathname.split('.').pop();
            if (ext === 'm3u8') 
                protocol =  cast.player.api.CreateHlsStreamingProtocol(mediaHost);
             else if (ext === 'mpd') 
                protocol = cast.player.api.CreateDashStreamingProtocol(mediaHost);
             else if (ext === 'ism/') 
                protocol = cast.player.api.CreateSmoothStreamingProtocol(mediaHost);
            
            console.log('### Media Protocol Identified as ' + ext);


            if (protocol === null) 

                mediaManager['onLoadOrig'](event); // Call on the original callback
             else 

                mediaPlayer = new cast.player.api.Player(mediaHost);
                mediaPlayer.load(protocol, initialTimeIndexSeconds);
            
        
    

但是,我收到此错误:

XMLHttpRequest cannot load http://playertest.longtailvideo.com/adaptive/bbbfull/bbbfull.m3u8. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '----' is therefore not allowed access. 

对于 Chromecast,如何设置 Chromecast 的 CORS 标头?

【问题讨论】:

您必须启用托管媒体内容的网络服务器:developers.google.com/cast/docs/player#cors 【参考方案1】:

可能为时已晚,但刚刚遇到同样的问题并通过下面提到的方法完成。

我没有办法在发件人应用程序端添加标题,所以分享我自己的经验。我在首先确认我的服务器支持 CORS 后解决了 CORS 问题。然后为了在 chromecast 上播放媒体,我需要添加 gstatic.com 以及在我的情况下另一个作为服务器上允许的域,这实际上是 CORS 的整个想法,即我们的服务器应该知道每个域。就是这样。

注意:非常肯定go through this official documentation. 但是对于初学者来说,从这里获取所有东西可能看起来有点棘手。所以也分享了自己的经验。

【讨论】:

您好,请您详细说明“添加 gstatic.com” 也请您查看此问题github.com/googlecast/CastReceiver/issues/26 您需要将 chromecast 来源(即服务器上的 gstatic)列入白名单,以便在 chromecast 请求时接收流。

以上是关于为 chromecast 设置 cors 标头的主要内容,如果未能解决你的问题,请参考以下文章

Apache Solr:从 solrconfig.xml 为 CORS 设置 HTTP 响应标头

Chromecast 客户端是不是支持 Cache-Control 或 Expires 标头?

为啥浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检

我没有设置 CORS 标头,即使它已设置。为啥?

未设置 CORS 标头

尽管设置了标头,但不允许 CORS 请求