最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)優(yōu)酷視頻地址解析示例代碼分享

 更新時(shí)間:2014年01月10日 11:19:24   作者:  
最近做了一個(gè)在線視頻的下載器,需要解析youku的視頻,獲得真正的視頻地址,現(xiàn)在把解析過(guò)程記錄下來(lái)以供參考

舉個(gè)例子比較好理解,比如我現(xiàn)在要下http://v.youku.com/v_show/id_XNDM2Mjc0MzAw.html這個(gè)視頻。這里我們要獲得的是視頻的id,就是XNDM2Mjc0MzAw這部分,這是一個(gè)視頻唯一的,所以在解析的時(shí)候肯定會(huì)用到。

為了能看清楚youku視頻的播放過(guò)程,可以使用火狐的插件firebug對(duì)網(wǎng)頁(yè)進(jìn)行跟蹤,如下圖。

可以看到有很多GET,我們要找的應(yīng)該是以這個(gè)id作為參數(shù)的GET,在下面我們可以找到這個(gè)鏈接
http://v.youku.com/player/getPlayList/VideoIDS/XNDM2Mjc0MzAw/timezone/+08/version/5/source/video?ran=3545&password=&n=3
這是youku獲取播放列表的GET,打開(kāi)它的響應(yīng),這是一個(gè)json,我們需要的內(nèi)容是seed、streamfileids和segs。segs里面放的是視頻的分段key,streamfileids是一串亂碼,要用seed對(duì)他解碼。下面我截取了下載器的一部分來(lái)說(shuō)明解碼的過(guò)程,解析json用的是json-lib-2.4-jdk15。

復(fù)制代碼 代碼如下:

List<Video> videos = new ArrayList<Video>();
JSONObject data;
//json就是剛獲得的響應(yīng),類(lèi)型為String。
data = JSONObject.fromObject(json).getJSONArray("data").getJSONObject(0);
double seed = Double.valueOf(data.getString("seed"));
String title = data.getString("title");
String fileid = data.getJSONObject("streamfileids").getString("flv");//如果要下的是mp4格式的話
String realFileid = getFileID(fileid, seed);            //把flv改成mp4(前提是這個(gè)節(jié)點(diǎn)存在)
String fileid1 = realFileid.substring(0, 8);//解碼出來(lái)的id分成兩部分,中間要插入視頻分段
String fileid2 = realFileid.substring(10);

JSONArray segs = data.getJSONObject("segs").getJSONArray("flv");//segs部分解析
for (Iterator iterator = segs.iterator(); iterator.hasNext();) {
    JSONObject object = (JSONObject) iterator.next();
    int order = object.getInt("no");
    String size = object.getString("size");
    int seconds = object.getInt("seconds");
    String key = object.getString("k");
    String no = String.format("%1$02x", order);
    String youUrl = "http://f.youku.com/player/getFlvPath/sid/" + "00_"
        + no + "/st/flv/fileid/" + fileid1 + no + fileid2 + "?K="
        + key;         
    videos.add(new Video(order, seconds, youUrl, size, key, title));
}

youUrl就是我們要的視頻地址,比如上面那個(gè)視頻的第一段是:

http://f.youku.com/player/getFlvPath/sid/134434081131213125530_00/st/flv/fileid/030001090050201D77EDBC04650AC2DD6027D5-ED5F-27F6-8E73-DEF478121887&K=b499f3d5df944cfc2827e2ec

藍(lán)色的是隨機(jī)生成的,可以用00代替。
flv表示所要下載的視頻格式,也可以選mp4,如果有的話。
黃色的兩個(gè)00是分段碼,十六進(jìn)制,比如第一段是00,第二段01,第十五段0f。
后面的是fileid,需要通過(guò)seed和streamfileids來(lái)破解,每段視頻都一樣。
最后面的K是在segs中獲得的,不需要破解,每段視頻都不一樣。

其中的兩個(gè)解碼函數(shù)為:

復(fù)制代碼 代碼如下:

private String getFileID(String fileid, double seed) {
    String mixed = getFileIDMixString(seed);
    String[] ids = fileid.split("\\*");
    StringBuilder realId = new StringBuilder();
    int idx;
    for (int i = 0; i < ids.length; i++) {
        idx = Integer.parseInt(ids[i]);
        realId.append(mixed.charAt(idx));
    }
    return realId.toString();
}

private String getFileIDMixString(double seed) {
    StringBuilder mixed = new StringBuilder();
    StringBuilder source = new StringBuilder(
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890");
    int index, len = source.length();
    for (int i = 0; i < len; ++i) {
        seed = (seed * 211 + 30031) % 65536;
        index = (int) Math.floor(seed / 65536 * source.length());
        mixed.append(source.charAt(index));
        source.deleteCharAt(index);
    }
    return mixed.toString();
}

代碼最后將得到一個(gè)Video類(lèi)型的List,Video中的order是視頻的編號(hào),seconds是時(shí)間長(zhǎng)度,size是字節(jié)長(zhǎng)度,youUrl就是真正的視頻地址,還有視頻的標(biāo)題title。還有一些其他的內(nèi)容都可以從json中獲得。

相關(guān)文章

  • Java中stream處理中map與flatMap的比較和使用案例

    Java中stream處理中map與flatMap的比較和使用案例

    這篇文章主要介紹了Java中stream處理中map與flatMap的比較和使用案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java 8 動(dòng)態(tài)類(lèi)型語(yǔ)言Lambda表達(dá)式實(shí)現(xiàn)原理解析

    Java 8 動(dòng)態(tài)類(lèi)型語(yǔ)言Lambda表達(dá)式實(shí)現(xiàn)原理解析

    Java 8支持動(dòng)態(tài)語(yǔ)言,看到了很酷的Lambda表達(dá)式,對(duì)一直以靜態(tài)類(lèi)型語(yǔ)言自居的Java,讓人看到了Java虛擬機(jī)可以支持動(dòng)態(tài)語(yǔ)言的目標(biāo)。接下來(lái)通過(guò)本文給大家介紹Java 8 動(dòng)態(tài)類(lèi)型語(yǔ)言Lambda表達(dá)式實(shí)現(xiàn)原理分析,需要的朋友可以參考下
    2017-02-02
  • 深入理解java泛型詳解

    深入理解java泛型詳解

    這篇文章主要介紹了Java中的泛型詳解,什么是泛型,作用以及基礎(chǔ)實(shí)例等,喜歡的朋友可以參考
    2017-04-04
  • SpringCloud Gateway自定義filter獲取body中的數(shù)據(jù)為空的問(wèn)題

    SpringCloud Gateway自定義filter獲取body中的數(shù)據(jù)為空的問(wèn)題

    這篇文章主要介紹了SpringCloud Gateway自定義filter獲取body中的數(shù)據(jù)為空,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 一文詳解如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序

    一文詳解如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序

    線程池是一種工具,但并不是適用于所有場(chǎng)景。在使用線程池時(shí),我們需要根據(jù)應(yīng)用程序的性質(zhì)、計(jì)算資源的可用性和應(yīng)用程序的需求進(jìn)行適當(dāng)?shù)呐渲?。本文主要介紹了如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序,需要的可以參考一下
    2023-04-04
  • Java集合之LinkedList源碼解析

    Java集合之LinkedList源碼解析

    這篇文章主要介紹了Java集合之LinkedList源碼解析,LinkedList和ArrayList數(shù)據(jù)結(jié)構(gòu)是完全不一樣的,ArrayList 底層是數(shù)組的結(jié)構(gòu),而 LinkedList 的底層則是鏈表的結(jié)構(gòu), 它可以進(jìn)行高效的插入和移除的操作,它基于的是一個(gè)雙向鏈表的結(jié)構(gòu),需要的朋友可以參考下
    2023-12-12
  • java 刪除文件夾中的所有內(nèi)容而不刪除文件夾本身的實(shí)例

    java 刪除文件夾中的所有內(nèi)容而不刪除文件夾本身的實(shí)例

    下面小編就為大家?guī)?lái)一篇java 刪除文件夾中的所有內(nèi)容而不刪除文件夾本身的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • java求100以內(nèi)的素?cái)?shù)示例分享

    java求100以內(nèi)的素?cái)?shù)示例分享

    素?cái)?shù)是指因數(shù)只有1和本身的數(shù)字,這篇文章主要介紹了java求100以內(nèi)的素?cái)?shù)示例,需要的朋友可以參考下
    2014-03-03
  • Java使用JNDI連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法

    Java使用JNDI連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法

    本文主要介紹了Java使用JNDI連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Kotlin協(xié)程與并發(fā)深入全面講解

    Kotlin協(xié)程與并發(fā)深入全面講解

    Android官方對(duì)協(xié)程的定義-協(xié)程是一種并發(fā)設(shè)計(jì)模式,您可以在Android平臺(tái)上使用它來(lái)簡(jiǎn)化異步執(zhí)行的代碼。協(xié)程是在版本1.3中添加到Kotlin的,它基于來(lái)自其他語(yǔ)言的既定概念
    2022-11-11

最新評(píng)論

霞浦县| 博乐市| 太仆寺旗| 卓资县| 南通市| 宁陵县| 泽库县| 安阳县| 广元市| 东光县| 苍山县| 防城港市| 吉林省| 福州市| 崇州市| SHOW| 海伦市| 闵行区| 巨野县| 茂名市| 海南省| 叙永县| 桂林市| 资溪县| 海盐县| 南京市| 承德县| 托里县| 翁源县| 张家港市| 山丹县| 普兰店市| 板桥市| 文登市| 和田市| 嘉义县| 德化县| 甘泉县| 滕州市| 孟津县| 墨脱县|