Android开发新手,若有错误请指出,谢谢~
视频播放
bilibili的核心功能不用说,即播放视频 + 弹幕功能,本章主要讲述如何在Android中播放B站视频(争取下一章中加入弹幕功能)。首先,Android中播放视频使用Bilibili官方开源的ijkMediaPlayer,Android自带的MediaPlayer支持格式有限,无法满足Bilibili视频源的格式。ijkPlayer的github中展示了许多编译、修改的内容,对于仅需要使用的可以暂时不看。
获取视频地址
视频主要分为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
*
*
*
*
*