NiceVieoPlayer

开源地址:https://github.com/xiaoyanger0825/NiceVieoPlayer

Features

用IjkPlayer/MediaPlayer + TextureView封装,可切换IjkPlayer、MediaPlayer.

支持本地和网络视频播放.

完美切换小窗口、全屏,可在RecyclerView中无缝全屏.

手势滑动调节播放进度、亮度、声音.

支持清晰度切换.

可自定义控制界面.

Usage

下载niceviewoplayer库,在AndroidStudio中作为Mudule添加依赖。

或者在Gradle中添加依赖:

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

dependencies {

compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v2.0'

}

在对应视频界面所在的Activity的Manifest.xml中需要添加如下配置:

android:configChanges="orientation|keyboardHidden|screenSize"

1.在Activity中使用

在Activity中使用时,该Activity需要继承自AppCompatActivity,在onStop中需要释放播放器,并且要在onBackPress中处理按下返回键的逻辑:

private void init() {

mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);

mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // or NiceVideoPlayer.TYPE_NATIVE

mNiceVideoPlayer.setUp(mVideoUrl, null);

TxVideoPlayerController controller = new TxVideoPlayerController(this);

controller.setTitle(mTitle);

controller.setImage(mImageUrl);

mNiceVideoPlayer.setController(controller);

}

@Override

protected void onStop() {

super.onStop();

// 在onStop时释放掉播放器

NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();

}

@Override

public void onBackPressed() {

// 在全屏或者小窗口时按返回键要先退出全屏或小窗口,

// 所以在Activity中onBackPress要交给NiceVideoPlayer先处理。

if (NiceVideoPlayerManager.instance().onBackPressd()) return;

super.onBackPressed();

}

详细可参考demo中的TinyWindowPlayActivity、ChangeClarityActivity、RecyclerViewActivity.

2.在Fragment中使用

在Fragment中使用时,该Fragment外层的Activity需要继承自AppCompatActivity,并且也要处理返回键按下逻辑:

public class XXXActivity extends AppCompatActivity {

...

@Override

public void onBackPressed() {

// 在全屏或者小窗口时按返回键要先退出全屏或小窗口,

// 所以在Activity中onBackPress要交给NiceVideoPlayer先处理。

if (NiceVideoPlayerManager.instance().onBackPressd()) return;

super.onBackPressed();

}

...

}

同时在Fragment中的onStop方法中释放播放器:

public class XXXFragenment extends Fragment {

...

@Override

public void onStop() {

super.onStop();

NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();

}

...

}

详细可参考demo中的UseInFragActivity和DemoFragment.

3.切换清晰度

如果需要切换清晰度,需要在controller中配置清晰度相关的等级和视频链接地址:

private void init() {

mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);

mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // IjkPlayer or MediaPlayer

TxVideoPlayerController controller = new TxVideoPlayerController(this);

controller.setTitle(mTitle);

controller.setClarity(getClarites(), 0);    // 设置清晰度以及默认播放的清晰度

Glide.with(this)

.load(mImageUrl)

.placeholder(R.drawable.img_default)

.crossFade()

.into(controller.imageView());

mNiceVideoPlayer.setController(controller);

}

public List getClarites() {

List clarities = new ArrayList<>();

clarities.add(new Clarity("标清", "270P", "http://play.g3proxy.lecloud.com/vod/v2/MjUxLzE2LzgvbGV0di11dHMvMTQvdmVyXzAwXzIyLTExMDc2NDEzODctYXZjLTE5OTgxOS1hYWMtNDgwMDAtNTI2MTEwLTE3MDg3NjEzLWY1OGY2YzM1NjkwZTA2ZGFmYjg2MTVlYzc5MjEyZjU4LTE0OTg1NTc2ODY4MjMubXA0?b=259&mmsid=65565355&tm=1499247143&key=f0eadb4f30c404d49ff8ebad673d3742&platid=3&splatid=345&playid=0&tss=no&vtype=21&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));

clarities.add(new Clarity("高清", "480P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));

clarities.add(new Clarity("超清", "720P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));

clarities.add(new Clarity("蓝光", "1080P", "http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479&mmsid=65565355&tm=1499247143&key=98c7e781f1145aba07cb0d6ec06f6c12&platid=3&splatid=345&playid=0&tss=no&vtype=13&cvid=2026135183914&payff=0&pip=08cc52f8b09acd3eff8bf31688ddeced&format=0&sign=mb&dname=mobile&expect=1&tag=mobile&xformat=super"));

return clarities;

}

详细参考demo中的ChangeClarityActivity

4.在RecyclerView列表中使用

在ReclerView列表中使用时需要监听itemView回收,以此释放掉对应的播放器

mRecyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {

@Override

public void onViewRecycled(RecyclerView.ViewHolder holder) {

NiceVideoPlayer niceVideoPlayer = ((VideoViewHolder) holder).mVideoPlayer;

if (niceVideoPlayer == NiceVideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {

NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();

}

}

});

详细参考demo中的RecyclerViewActivity.

5.播放时Home键按下以及回到播放界面的处理

按照上面的做法,在onStop直接释放掉播放器,那么在播放时按下Home键播放器也会被释放掉,如果在此回到播放界面,播放器回到最初始的状态。如果需要在播放的时候按下Home键只是暂停播放器,重新回到播放界面时又继续播放,那么可以参考demo中的CompatHomeKeyActiivty,或者对应的Activity集成自CompatHomeKeyActiivty,详细参考demo中的ProcessHome1Activity。当然,如果是在Fragment中,参考CompatKeyFragment,或者继承自CompatKeyFragment(外层的Activity还是继承自AppCompat,并处理onBackPress),详细参考demo中的ProcessHome2Activity.

5.自定义控制界面

public class CustomController extends NiceVideoPlayerController {

// 实现自己的控制界面

...

}

Proguard

-keep class tv.danmaku.ijk.media.player.**{*;}

Demo

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

推荐阅读更多精彩内容