BiliBili Android第三方——第2步


Android开发新手,若有错误请指出,谢谢~

blog
github
简书


视频播放

bilibili的核心功能不用说,即播放视频 + 弹幕功能,本章主要讲述如何在Android中播放B站视频(争取下一章中加入弹幕功能)。首先,Android中播放视频使用Bilibili官方开源的ijkMediaPlayer,Android自带的MediaPlayer支持格式有限,无法满足Bilibili视频源的格式。ijkPlayer的github中展示了许多编译、修改的内容,对于仅需要使用的可以暂时不看。

获取视频地址

视频主要分为2类,直播和点播,这两类的接口是不一样的。其中点播又有专辑、番剧等包含集数等概念的内容,需要播放不同内容。这里我们只讨论一个地址的那种,即单个视频。

  1. 直播地址
  2. 点播地址

直播地址URL如下,可以通过live/Index获取直播页的内容,其中最重要的内容为每一个直播Item的room_id,其他也有很多接口获取房间号内容,如直播详情、直播列表等,这里使用直播首页作为示例。

http://live.bilibili.com/AppIndex/home?_device=android&_hwid=51e96f5f2f54d5f9&_ulv=10000&access_key=563d6046f06289cbdcb472601ce5a761&appkey=c1b107428d337928&build=410000&platform=android&scale=xxhdpi&sign=fbdcfe141853f7e2c84c4d401f6a8758
{
    owner: {
        face: "http://i0.hdslb.com/bfs/face/ac9785955b2d95391495869e7d64b8dc7d9499d4.jpg",
        mid: 867152,
        name: "Tsubomixy"
    },
    cover: {
        src: "http://i0.hdslb.com/group1/M00/B6/AA/oYYBAFbmgraAF4DkAADqc2Inrws485.jpg",
        height: 180,
        width: 320
    },
    title: "疯狂掉分少年",
    room_id: 81414,
    online: 157
}

每一个直播间的Item如上述Json,每一个视频直播都对应一个直播间Id,与Web端相同,通过调用接口获取视频直播地址。具体playurl接口获取直播视频地址如下,返回数据为xml格式,

http://live.bilibili.com/api/playurl?player=1&quality=0&cid=room_id

房间号23058为B站官方音乐直播间,房间号稳定,可供大家测试。将http://live.bilibili.com/api/playurl?player=1&quality=0&cid=23058 粘到浏览器中即可,这种xml格式浏览器无法直接解析因此可能看不到内容,需要查看源代码,即可查看到如下图的内容:

![直播地址xml](https://github.com/HakuLess/ImageLib/blob/master/blog/live_xml.png?raw=true =744x209)

url为默认使用线路,b1、b2、b3指的是备用线路1、2、3。至此,我们获取到了B站直播的播放地址。接下来就可以使用ijkplayer使用该地址进行播放视频。

点播地址URL与直播地址相似,同样有cid的概念。首先需要通过其他接口获取视频直播地址的cid,然后通过如下接口获取点播视频的地址:

String sign_this = string2MD5("appkey=" + appkey + "&cid=" + cid + secretkey);
String url = "http://interface.bilibili.com/playurl?appkey=" + appkey + "&cid=" + cid + "&sign=" + sign_this;

视频点播与直播不一样需要使用secretkey进行md5加密,这部分详细内容可以查看第0步的内容。这里使用cid为3885454为例,其获取地址URL为 http://interface.bilibili.com/playurl?appkey=f3bb208b3d081dc8&cid=3885454&sign=3aa2879fb591b4e297ed3e69156c821e

<video>
    <result>suee</result>
    <timelength>206000</timelength>
    <format>
        <![CDATA[ flv ]]>
    </format>
    <accept_format>
        <![CDATA[ mp4,hdmp4,flv ]]>
    </accept_format>
    <accept_quality>
        <![CDATA[ 3,2,1 ]]>
    </accept_quality>
    <from>
        <![CDATA[ local ]]>
    </from>
    <seek_param>
        <![CDATA[ start ]]>
    </seek_param>
    <seek_type>
        <![CDATA[ offset ]]>
    </seek_type>
    <src>0</src>
    <durl>
        <order>1</order>
        <length>206000</length>
        <size>39674116</size>
        <url>
            <![CDATA[
http://cn-zjhz5-dx.acgvideo.com/vg11/0/28/3885454-1.flv?expires=1458561300&ssig=SalA4VKqDvz49duWpIJ1Tg&oi=1961670062&appkey=f3bb208b3d081dc8&or=3026306826&rate=0
]]>
        </url>
        <backup_url>
            <url>
                <![CDATA[
http://cn-zjwz3-dx.acgvideo.com/vg16/7/18/3885454-1.flv?expires=1458561300&ssig=OmgeF1kfdbUgTkGTBMO2xw&oi=1961670062&appkey=f3bb208b3d081dc8&or=3026306826&rate=0
]]>
            </url>
            <url>
                <![CDATA[
http://cn-zjsx10-dx.acgvideo.com/vg2/f/a0/3885454-1.flv?expires=1458561300&ssig=MTYHl-CUFarh8LpXnMXjEg&oi=1961670062&appkey=f3bb208b3d081dc8&or=3026306826&rate=0
]]>
        </url>
        </backup_url>
    </durl>
</video>```

其中三个URL分别为默认线路、备用线路1和备用线路2。至此,获取单个视频点播的视频地址~ 下面就可以使用播放器进行视频播放了~!
 
##### 播放视频

播放视频的方式不止一种,这里只提供使用ijkplayer播放视频的方式,需要的同学可以看[ijkplayer github](https://github.com/Bilibili/ijkplayer)。对于我们只使用不修改的同学,可以直接在gradle中配置即可。

required
allprojects {
repositories {
jcenter()
}
}

dependencies {
# required, enough for most devices.
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.4.5.1'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.4.5.1'

# Other ABIs: optional
compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.4.5.1'
compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.4.5.1'
compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.4.5.1'

# ExoPlayer as IMediaPlayer: optional, experimental
compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.4.5.1'

}

对于大部分情况只需要配置required项即可,之后就可以在项目中直接使用ijkMediaPlayer,使用方式与普通的MediaPlayer相似,具体代码如下:

private void playVideo(String uri) {
try {
ijkMediaPlayer.setDataSource(this, Uri.parse(uri));
ijkMediaPlayer.setDisplay(holder);
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {

            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                ijkMediaPlayer.setDisplay(holder);
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });
        ijkMediaPlayer.prepareAsync();
        ijkMediaPlayer.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
完整项目代码可以在[我的github](https://github.com/HakuLess)中查看。项目截图与bilibili官方对比图如下:
  ![直播首页截图](https://github.com/HakuLess/ImageLib/blob/master/blog/compare_live_index.png?raw=true =578x499)
 ![直播页面_官方](https://raw.githubusercontent.com/HakuLess/ImageLib/master/blog/compare_live_play_bili.jpeg?raw=true =285x577)
 ![直播页面_自定义](https://github.com/HakuLess/ImageLib/blob/master/blog/compare_live_play_hbili.jpeg?raw=true?raw=true =285x577)
 
 有待开发的功能还有很多,如弹幕、评论、视频下载等,大家敬请期待~
 
##### ThanksTo

* [bilibili视频解析](http://www.iippcc.com/bilibili/)
* [爱bilibili](http://www.ibilibili.com/)
* [B站视频地址获取](https://www.blackglory.me/bilibili-video-source-get/)
* [B站API](http://www.fuckbilibili.com/biliapi.html)
* [哔哩哔哩JJ](http://www.bilibilijj.com/)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容