【问题标题】:Sending Query Parameters to Chromecast向 Chromecast 发送查询参数
【发布时间】:2014-10-20 15:07:22
【问题描述】:

我们正在尝试在 Chromecast 设备上播放 HLS 视频。 我们启用了 CORS。 我们可以成功播放正常的 HLS 视频。但我们遇到了 URL 哈希问题。

我们发送 chromecast,一个带有散列的 url(出于安全目的) 例子: http://domainname.com/70000871V/70000871V.m3u8?cp=%2FsFcurrent%2F70000871V%2F*&cf=1403&e=1493&h=cbc90

上面基本上是一个m3u8视频索引文件,chromecast查看索引文件并选择播放的分辨率,当它访问子文件时,它会删除url中提供的哈希。这导致 chromecast 无法访问子文件,因为它删除了 url 中的哈希参数。

考虑 m3u8 文件包含一些文件,例如 70000871V_iphone_med.m3u8,因此当它尝试访问它们时,它会删除散列...

如何告诉 chromecast 在访问索引文件时保留哈希参数。

注意:此网址在移动设备上播放成功。

控制台显示以下问题:

### 媒体元素加载开始 sample_media_receiver.html:573

XMLHttpRequest 无法加载 http://domainname.com/s/web_vod/current/90002466V/ROTOX013V_iphone_med.m3u8。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“http://”。 sample_media_receiver.html:1

主机错误 - 致命错误:代码 = 3 sample_media_receiver.html:487

### 媒体元素停滞不前

视频网址:http://domainname.com/70000871V/70000871V.m3u8?cp=%2FsFcurrent%2F70000871V%2F*&cf=1403&e=1493&h=cbc90

.m3u8 文件有,

EXTM3U

EXT-X-VERSION:3

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2037261,CODECS="avc1.4d001f,mp4a.40.5",RESOLUTION=960x540

ROTOX013V_iphone_hi.m3u8

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=740606,CODECS="avc1.66.30,mp4a.40.5",RESOLUTION=640x360

ROTOX013V_iphone_med.m3u8

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=296618,CODECS="avc1.66.30,mp4a.40.5",RESOLUTION=416x234

ROTOX013V_iphone_low.m3u8

EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=5094217,CODECS="avc1.4d001f,mp4a.40.5",RESOLUTION=1280x720

ROTOX013V_ipad_hi.m3u8

这个怎么做?

【问题讨论】:

    标签: chromecast google-cast


    【解决方案1】:

    你可能想看看 chromecast 的 mediaList/MediaInfo

    并在其中的sample implementation。 -> 'buildMedia()'

    Chromecast media support 没有内置对 m3u8 列表的支持。

    与其尝试将 m3u8 处理下推到不支持它的堆栈中,不如在接口上实现一个简单的 List 包装器??

    如“m3u8-to-mediaInfoList”和“mediainfoList-to-m3u8”。

    在列表项级别进行。如果您查看源代码中的“buildMedia”方法,它是如何从 m3u8 项目获取 MediaInfo 项目的一个很好的例子。

    对 github 上的 CC 示例之一进行小修改......

       public static List<MediaInfo> buildMedia(String url, Context ctx) throws JSONException {
    //check nulls
            mediaList = new ArrayList<MediaInfo>();
            JSONObject jsonObj = new VideoProvider().parseUrl(url, ctx);
            JSONArray categories = jsonObj.getJSONArray(TAG_RESULTS);
            if (null != categories) {
                for (int i = 0; i < categories.length(); i++) {                                       
                    JSONObject category = categories.getJSONObject(i);
                    String title = category.getString(TAG_MSG);
                    String subTitle = category.getString(TAG_MSG);                 
                    JSONObject media3 = category.getJSONObject(TAG_MEDIA3);
                    String videoUrl = media3.getString(TAG_URL);               
                    JSONObject media4 = category.getJSONObject(TAG_MEDIA4);
                    String imageurl = media4.getString(TAG_URL); 
                    String bigImageurl = media4.getString(TAG_URL);
    
                    String studio = category.getJSONObject(TAG_CREATEDBY).getString(TAG_USERNAME);
                    mediaList.add(buildMediaInfo(title, studio, subTitle, videoUrl, imageurl,
                         bigImageurl));
                    Log.d(TAG, "MediaInf " +i +" " +imageurl +" " +bigImageurl +" " +videoUrl);
                }
            }
            return mediaList;
        }
    

    【讨论】:

    • 感谢罗伯特·朗特里。我将尝试使用您的建议来解决问题,并在解决后标记答案。感谢您的帮助。
    【解决方案2】:

    您需要编写一个自定义接收器(使用 MPL)并使用主机覆盖 updateManifestRequestInfo / updateSegmentRequestInfo 来实现所需的行为。

    【讨论】:

    • @AliNaddaf,我们正在使用来自示例 Custom Receiver 的自定义接收器。我已经在第 485 行覆盖了方法“updateManifestRequestInfo”。但这似乎不起作用。
    • 这是我们的 updateManifestRequestInfo 代码,javascript window.mediaHost.updateManifestRequestInfo = function(cast.player.api.RequestInfo requestInfo) { 'mediaElement': window.mediaElement, 'url': requestInfo.url });
    • 嗨 Ali Naddaf,您能提供更多关于实施的见解吗?就像在主线程中提到的那样,chromecast 能够使用我们的 url 参数访问资产,但是在访问 m3u8 索引文件中的子元素时,它会截断 url 参数。这是 chromecast 在内部做的事情,我们无法控制。您能否告诉我们任何限制或替代选项?
    • 首先,回头看看你原来的帖子,你为什么会遇到 CORS 问题?你解决了这些问题吗?
    • 我们遇到了 CORS 问题,因为 Chromecast 会截断 url 参数。内容受哈希保护,因此当参数被截断时,内容无法访问,并引发 CORS 错误。如果您使用 url 参数直接访问资产,则没有 CORS 问题。
    猜你喜欢
    • 2013-08-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多