您的当前位置:首页正文

BiliBili Android第三方——第2步

来源:华佗小知识

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


视频播放

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

获取视频地址

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

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

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


{
    owner: {
        face: 
        mid: 867152,
        name: "Tsubomixy"
    },
    cover: {
        src: 
        height: 180,
        width: 320
    },
    title: "疯狂掉分少年",
    room_id: 81414,
    online: 157
}

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


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

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

String sign_this = string2MD5("appkey=" + appkey + "&cid=" + cid + secretkey);
String url =  + appkey + "&cid=" + cid + "&sign=" + sign_this;
<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[

]]>
        </url>
        <backup_url>
            <url>
                <![CDATA[

]]>
            </url>
            <url>
                <![CDATA[

]]>
        </url>
        </backup_url>
    </durl>
</video>```

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

播放视频的方式不止一种,这里只提供使用ijkplayer播放视频的方式,需要的同学可以看[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();
    }
}
。项目截图与bilibili官方对比图如下:
   =578x499)
  =285x577)
  =285x577)
 
 有待开发的功能还有很多,如弹幕、评论、视频下载等,大家敬请期待~
 
##### ThanksTo

* 
* 
* 
* 
*