将查询参数发送到Chromecast

时间:2014-08-27 06:24:16

标签: chromecast google-cast

我们正在尝试在Chromecast设备上播放HLS视频。 我们启用了CORS。 我们可以成功播放普通的HLS视频。但是我们遇到了URL散列问题。

我们发送chromecast,一个带哈希的网址(出于安全目的) 例: 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在访问索引文件时保留散列参数。

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

控制台显示以下问题:

### MEDIA ELEMENT LOAD START 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

HOST ERROR - 致命错误:代码= 3 sample_media_receiver.html:487

### MEDIA ELEMENT STALLED

视频网址: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,带宽= 2037261,CODECS = “avc1.4d001f,mp4a.40.5”,分辨率960×540 =

ROTOX013V_iphone_hi.m3u8

EXT-X-STREAM-INF:PROGRAM-ID = 1,带宽= 740606,CODECS = “avc1.66.30,mp4a.40.5”,分辨率640×360 =

ROTOX013V_iphone_med.m3u8

EXT-X-STREAM-INF:PROGRAM-ID = 1,带宽= 296618,CODECS = “avc1.66.30,mp4a.40.5” RESOLUTION = 416x234

ROTOX013V_iphone_low.m3u8

EXT-X-STREAM-INF:PROGRAM-ID = 1,带宽= 5094217,CODECS = “avc1.4d001f,mp4a.40.5” RESOLUTION = 1280×720

ROTOX013V_ipad_hi.m3u8

如何制作?

2 个答案:

答案 0 :(得分:0)

你可能想看一下chromecast' mediaList/MediaInfo

并且在sample implementation。 - > ' buildMedia()'

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

您可能希望在接口上实现一个简单的List包装器,而不是试图将m3u8处理推送到不支持它的堆栈中?

喜欢" m3u8-to-mediaInfoList"和" mediainfoList-to-m3u8"。

OR

在列表项级别执行此操作。如果你看一下这个' buildMedia'源代码中的方法,它是如何从m3u8项获取MediaInfo项的一个很好的例子。

github上的一个CC样本的次要mod ....

   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;
    }

答案 1 :(得分:0)

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