{"id":15028808,"url":"https://github.com/jianjunxiao/nicevieoplayer","last_synced_at":"2025-05-15T08:08:59.863Z","repository":{"id":44441469,"uuid":"92027038","full_name":"jianjunxiao/NiceVieoPlayer","owner":"jianjunxiao","description":"IjkPlayer/MediaPlayer+TextureView，支持列表，完美切换全屏、小窗口的Android视频播放器 ","archived":false,"fork":false,"pushed_at":"2024-06-29T01:20:19.000Z","size":17826,"stargazers_count":2226,"open_issues_count":104,"forks_count":488,"subscribers_count":37,"default_branch":"master","last_synced_at":"2025-04-03T18:11:18.483Z","etag":null,"topics":["android","android-studio","media-player","mediaplayer","player-video","players","video-player"],"latest_commit_sha":null,"homepage":"http://www.jianshu.com/p/420f7b14d6f6","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jianjunxiao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-22T07:56:37.000Z","updated_at":"2025-04-03T06:15:47.000Z","dependencies_parsed_at":"2024-12-19T03:02:06.912Z","dependency_job_id":"1dd93b4e-2a25-47e1-b03e-7223ed423c21","html_url":"https://github.com/jianjunxiao/NiceVieoPlayer","commit_stats":{"total_commits":109,"total_committers":2,"mean_commits":54.5,"dds":0.00917431192660545,"last_synced_commit":"496fa2c7d046eee8f5b1d990ef1f758b59ace6f8"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jianjunxiao%2FNiceVieoPlayer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jianjunxiao%2FNiceVieoPlayer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jianjunxiao%2FNiceVieoPlayer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jianjunxiao%2FNiceVieoPlayer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jianjunxiao","download_url":"https://codeload.github.com/jianjunxiao/NiceVieoPlayer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248439932,"owners_count":21103715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-studio","media-player","mediaplayer","player-video","players","video-player"],"created_at":"2024-09-24T20:09:06.813Z","updated_at":"2025-04-11T16:27:10.882Z","avatar_url":"https://github.com/jianjunxiao.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NiceVieoPlayer\n\n[![](https://jitpack.io/v/xiaoyanger0825/NiceVieoPlayer.svg)](https://jitpack.io/#xiaoyanger0825/NiceVieoPlayer) [![API](https://img.shields.io/badge/API-16%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=16) [![作者](https://img.shields.io/badge/%E4%BD%9C%E8%80%85-xiaoyanger0825-orange.svg)](https://github.com/xiaoyanger0825)\n### Features\n\n * 用IjkPlayer/MediaPlayer + TextureView封装，可切换IjkPlayer、MediaPlayer.\n * 支持本地和网络视频播放.\n * 完美切换小窗口、全屏，可在RecyclerView中无缝全屏.\n * 手势滑动调节播放进度、亮度、声音.\n * 支持清晰度切换.\n * 可自定义控制界面.\n\n### Usage\n下载niceviewoplayer库，在AndroidStudio中作为Mudule添加依赖。\n\n或者在Gradle中添加依赖：\n\n```\nallprojects {\n    repositories {\n    ...\n    maven { url 'https://jitpack.io' }\n    }\n}\n\ndependencies {\n    compile 'com.github.xiaoyanger0825:NiceVieoPlayer:v2.2'\n}\n```\n**在对应视频界面所在的Activity的Manifest.xml中需要添加如下配置：**\n```\nandroid:configChanges=\"orientation|keyboardHidden|screenSize\"\n```\n\n#### 1.在Activity中使用\n在Activity中使用时，该Activity需要继承自`AppCompatActivity`，在onStop中需要释放播放器，并且要在onBackPress中处理按下返回键的逻辑：\n\n```\nprivate void init() {\n    mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);\n    mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // or NiceVideoPlayer.TYPE_NATIVE\n    mNiceVideoPlayer.setUp(mVideoUrl, null);\n  \n    TxVideoPlayerController controller = new TxVideoPlayerController(this);\n    controller.setTitle(mTitle);\n    controller.setImage(mImageUrl);\n    mNiceVideoPlayer.setController(controller);\n}\n\n@Override\nprotected void onStop() {\n    super.onStop();\n    // 在onStop时释放掉播放器\n    NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();\n}\n@Override\npublic void onBackPressed() {\n    // 在全屏或者小窗口时按返回键要先退出全屏或小窗口，\n    // 所以在Activity中onBackPress要交给NiceVideoPlayer先处理。\n    if (NiceVideoPlayerManager.instance().onBackPressd()) return;\n    super.onBackPressed();\n}\n```\n详细可参考demo中的`TinyWindowPlayActivity`、`ChangeClarityActivity`、`RecyclerViewActivity`.\n#### 2.在Fragment中使用\n在Fragment中使用时，该Fragment外层的Activity需要继承自`AppCompatActivity`，并且也要处理返回键按下逻辑：\n```\npublic class XXXActivity extends AppCompatActivity {\n    ...\n    @Override\n    public void onBackPressed() {\n        // 在全屏或者小窗口时按返回键要先退出全屏或小窗口，\n        // 所以在Activity中onBackPress要交给NiceVideoPlayer先处理。\n        if (NiceVideoPlayerManager.instance().onBackPressd()) return;\n        super.onBackPressed();\n    }\n    ...\n}\n```\n同时在Fragment中的onStop方法中释放播放器：\n```\npublic class XXXFragenment extends Fragment {\n    ...\n    @Override\n    public void onStop() {\n        super.onStop();\n        NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();\n    }\n    ...\n}\n```\n详细可参考demo中的`UseInFragActivity`和`DemoFragment`.\n\n#### 3.切换清晰度\n如果需要切换清晰度，需要在`controller`中配置清晰度相关的等级和视频链接地址：\n```\nprivate void init() {\n    mNiceVideoPlayer = (NiceVideoPlayer) findViewById(R.id.nice_video_player);\n    mNiceVideoPlayer.setPlayerType(NiceVideoPlayer.TYPE_IJK); // IjkPlayer or MediaPlayer\n    TxVideoPlayerController controller = new TxVideoPlayerController(this);\n    controller.setTitle(mTitle);\n    controller.setClarity(getClarites(), 0);    // 设置清晰度以及默认播放的清晰度\n    Glide.with(this)\n            .load(mImageUrl)\n            .placeholder(R.drawable.img_default)\n            .crossFade()\n            .into(controller.imageView());\n    mNiceVideoPlayer.setController(controller);\n}\n\npublic List\u003cClarity\u003e getClarites() {\n    List\u003cClarity\u003e clarities = new ArrayList\u003c\u003e();\n    clarities.add(new Clarity(\"标清\", \"270P\", \"http://play.g3proxy.lecloud.com/vod/v2/MjUxLzE2LzgvbGV0di11dHMvMTQvdmVyXzAwXzIyLTExMDc2NDEzODctYXZjLTE5OTgxOS1hYWMtNDgwMDAtNTI2MTEwLTE3MDg3NjEzLWY1OGY2YzM1NjkwZTA2ZGFmYjg2MTVlYzc5MjEyZjU4LTE0OTg1NTc2ODY4MjMubXA0?b=259\u0026mmsid=65565355\u0026tm=1499247143\u0026key=f0eadb4f30c404d49ff8ebad673d3742\u0026platid=3\u0026splatid=345\u0026playid=0\u0026tss=no\u0026vtype=21\u0026cvid=2026135183914\u0026payff=0\u0026pip=08cc52f8b09acd3eff8bf31688ddeced\u0026format=0\u0026sign=mb\u0026dname=mobile\u0026expect=1\u0026tag=mobile\u0026xformat=super\"));\n    clarities.add(new Clarity(\"高清\", \"480P\", \"http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479\u0026mmsid=65565355\u0026tm=1499247143\u0026key=98c7e781f1145aba07cb0d6ec06f6c12\u0026platid=3\u0026splatid=345\u0026playid=0\u0026tss=no\u0026vtype=13\u0026cvid=2026135183914\u0026payff=0\u0026pip=08cc52f8b09acd3eff8bf31688ddeced\u0026format=0\u0026sign=mb\u0026dname=mobile\u0026expect=1\u0026tag=mobile\u0026xformat=super\"));\n    clarities.add(new Clarity(\"超清\", \"720P\", \"http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479\u0026mmsid=65565355\u0026tm=1499247143\u0026key=98c7e781f1145aba07cb0d6ec06f6c12\u0026platid=3\u0026splatid=345\u0026playid=0\u0026tss=no\u0026vtype=13\u0026cvid=2026135183914\u0026payff=0\u0026pip=08cc52f8b09acd3eff8bf31688ddeced\u0026format=0\u0026sign=mb\u0026dname=mobile\u0026expect=1\u0026tag=mobile\u0026xformat=super\"));\n    clarities.add(new Clarity(\"蓝光\", \"1080P\", \"http://play.g3proxy.lecloud.com/vod/v2/MjQ5LzM3LzIwL2xldHYtdXRzLzE0L3Zlcl8wMF8yMi0xMTA3NjQxMzkwLWF2Yy00MTk4MTAtYWFjLTQ4MDAwLTUyNjExMC0zMTU1NTY1Mi00ZmJjYzFkNzA1NWMyNDc4MDc5OTYxODg1N2RjNzEwMi0xNDk4NTU3OTYxNzQ4Lm1wNA==?b=479\u0026mmsid=65565355\u0026tm=1499247143\u0026key=98c7e781f1145aba07cb0d6ec06f6c12\u0026platid=3\u0026splatid=345\u0026playid=0\u0026tss=no\u0026vtype=13\u0026cvid=2026135183914\u0026payff=0\u0026pip=08cc52f8b09acd3eff8bf31688ddeced\u0026format=0\u0026sign=mb\u0026dname=mobile\u0026expect=1\u0026tag=mobile\u0026xformat=super\"));\n    return clarities;\n}\n```\n详细参考demo中的`ChangeClarityActivity`\n\n#### 4.在RecyclerView列表中使用\n在ReclerView列表中使用时需要监听itemView回收，以此释放掉对应的播放器\n```\nmRecyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {\n    @Override\n    public void onViewRecycled(RecyclerView.ViewHolder holder) {\n        NiceVideoPlayer niceVideoPlayer = ((VideoViewHolder) holder).mVideoPlayer;\n        if (niceVideoPlayer == NiceVideoPlayerManager.instance().getCurrentNiceVideoPlayer()) {\n            NiceVideoPlayerManager.instance().releaseNiceVideoPlayer();\n        }\n    }\n});\n```\n详细参考demo中的`RecyclerViewActivity`.\n#### 5.播放时Home键按下以及回到播放界面的处理\n按照上面的做法，在onStop直接释放掉播放器，那么在播放时按下Home键播放器也会被释放掉，如果在此回到播放界面，播放器回到最初始的状态。如果需要在播放的时候按下Home键只是暂停播放器，重新回到播放界面时又继续播放，那么可以参考demo中的`CompatHomeKeyActiivty`，或者对应的Activity集成自`CompatHomeKeyActiivty`，详细参考demo中的`ProcessHome1Activity`。当然，如果是在Fragment中，参考`CompatKeyFragment`，或者继承自`CompatKeyFragment`(外层的Activity还是继承自AppCompat，并处理onBackPress)，详细参考demo中的`ProcessHome2Activity`.\n\n#### 5.自定义控制界面\n```\npublic class CustomController extends NiceVideoPlayerController {\n    // 实现自己的控制界面\n    ...\n}\n```\n### Proguard\n```\n-keep class tv.danmaku.ijk.media.player.**{*;}\n```\n### Demo\n![](https://github.com/xiaoyanger0825/NiceVieoPlayer/raw/master/images/aa.jpg)\n![](https://github.com/xiaoyanger0825/NiceVieoPlayer/raw/master/images/bb.jpg)\n![](https://github.com/xiaoyanger0825/NiceVieoPlayer/raw/master/images/cc.jpg)\n![](https://github.com/xiaoyanger0825/NiceVieoPlayer/raw/master/images/dd.jpg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjianjunxiao%2Fnicevieoplayer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjianjunxiao%2Fnicevieoplayer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjianjunxiao%2Fnicevieoplayer/lists"}