Giter Site home page Giter Site logo

jiajunhui / playerbase Goto Github PK

View Code? Open in Web Editor NEW
2.9K 54.0 435.0 69.14 MB

The basic library of Android player will process complex business components. The access is simple。Android播放器基础库,专注于播放视图组件的高复用性和组件间的低耦合,轻松处理复杂业务。

License: Apache License 2.0

Java 100.00%
player video listvideo widget fullscreen android surfaceview textureview exoplayer mediaplayer

playerbase's Introduction

image

PlayerBase-Core

Download API

ExoPlayerPkg

Download API

IjkPlayerPkg

Download API

博文地址Android播放器基础封装库PlayerBase

使用及依赖-已适配AndroidX

需要的权限,如果targetSDK版本在Android M以上的,请注意运行时权限的处理。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

只使用MediaPlayer

dependencies {
  
  //该依赖仅包含MediaPlayer解码
  implementation 'com.kk.taurus.playerbase:playerbase:3.4.2'
  
}

使用ExoPlayer + MediaPlayer

dependencies {
 
  //该依赖包含exoplayer解码和MediaPlayer解码
  //注意exoplayer的最小支持SDK版本为16
  implementation 'cn.jiajunhui:exoplayer:342_2132_019'
  
}

使用ijkplayer + MediaPlayer

dependencies {
  
  //该依赖包含ijkplayer解码和MediaPlayer解码
  implementation 'cn.jiajunhui:ijkplayer:342_088_012'
  //ijk官方的解码库依赖,较少格式版本且不支持HTTPS。
  implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
  # Other ABIs: optional
  implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
  implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
  implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
  implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
  
}

使用ijkplayer + ExoPlayer + MediaPlayer

dependencies {
  
  //该依赖包含exoplayer解码和MediaPlayer解码
  //注意exoplayer的最小支持SDK版本为16
  implementation 'cn.jiajunhui:exoplayer:342_2132_019'

  //该依赖包含ijkplayer解码和MediaPlayer解码
  implementation 'cn.jiajunhui:ijkplayer:342_088_012'
  //ijk官方的解码库依赖,较少格式版本且不支持HTTPS。
  implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
  # Other ABIs: optional
  implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
  implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
  implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
  implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
  
}

如果您添加依赖exoplayer的库,需要在gradle中增加如下配置。

buildTypes {

    //...
    
    compileOptions{
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

代码混淆时,请在proguard中添加如下保护

-keep public class * extends android.view.View{*;}

-keep public class * implements com.kk.taurus.playerbase.player.IPlayer{*;}

初始化

public class App extends Application {

    @Override
    public void onCreate() {
        //...
        
        //如果您想使用默认的网络状态事件生产者,请添加此行配置。
        //并需要添加权限 android.permission.ACCESS_NETWORK_STATE
        PlayerConfig.setUseDefaultNetworkEventProducer(true);
        //初始化库
        PlayerLibrary.init(this);
        
        //-------------------------------------------
        
        //如果添加了'cn.jiajunhui:exoplayer:xxxx'该依赖
        ExoMediaPlayer.init(this);
        
        //如果添加了'cn.jiajunhui:ijkplayer:xxxx'该依赖
        IjkPlayer.init(this);
        
        
        //播放记录的配置
        //开启播放记录
        PlayerConfig.playRecord(true);
        PlayRecordManager.setRecordConfig(
                        new PlayRecordManager.RecordConfig.Builder()
                                .setMaxRecordCount(100)
                                //.setRecordKeyProvider()
                                //.setOnRecordCallBack()
                                .build());
        
    }
    
}

交流

联系方式:[email protected]

QQ群:600201778

License

Copyright 2017 jiajunhui<[email protected]>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0
   
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

playerbase's People

Contributors

fanwc avatar jiajunhui avatar karashok avatar nukc avatar superman32432432 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

playerbase's Issues

window播放

刚下了demo试了下,窗口播放应该是要权限的吧,没给权限直接点窗口播放就白屏了,是不是没做权限的判断?
手机是:魅蓝5s 6.0系统

播放4k视频会卡顿

用ijkplayer播放4k视频卡顿,按ijkplayer官方文档开启mediacodec-hevc也还是会卡顿,但切换原生MediaPlayer播放就不会卡顿

npe空指针

Attempt to invoke interface method 'void com.kk.taurus.playerbase.extension.ReceiverEventSender.sendInt(java.lang.String, int)' on a null object reference
希望作者修一下 我这边就不fork改了

视频播放横竖屏切换黑屏问题

大佬好,请教一个问题,视频切换到横屏播放时,然后暂停播放,再切回到竖屏,这个时候并没有横屏播放时暂停的那一帧画面,而是黑屏。同理,竖屏暂停切横屏也会出现这种情况,请问这个要怎么处理呢?

GroupValue的一点改进建议

GroupValue现在是receiver group的数据共享池,在每次调用putXXX系列方法时,除了把value存起来都会去遍历内部 OnGroupValueUpdateListener,这样做基本没错。但是有时候有些需求单纯的只是想存值,然后在某些时候拿出来用,而不想去遍历各种listener。
比如说,在controller中调节进度条onProgressChanged的时候,我想存值。但是每次存值都会去遍历listener并回调一些方法,固然可以通过filterKeys去过滤这些lietener。但是由于这个onProgressChanged回调的次数很多,所以GroupValue去遍历回调各种listener的次数也很多,这样就会造成一定的效率问题。
这个例子是在说,在你需要频繁的去改变数据共享池的时候,一些需求只是单纯的存储数据,但是附带的遍历回调会带来效率问题。
所以希望提供这样的接口,给putXXX系列方法一个flag,表示是否去遍历回调listener,
比如 putInt(int key, int value, boolean isNotifyCallback)

视频播放时loading层展示

进在线视频列表,随机点击一个视频,在缓冲的时候,条目里面的视频view 有 loading 层展示,这时候再点击条目的跳转展示大屏播放,在大屏里面缓冲完毕播放,点击关闭返回列表页,列表里面的视频在播放 但是 loading层没有去掉,依然展示

环境配置问题

demo导入AS后,没有成功依赖support v7及ijkplayer,exoplayer lib。而且项目并没有依赖support-v4包。
是我本地环境的原因吗?
image
image
image

同一CoverLevel中的Cover怎么区分显示层级?

现在是对不同的CoverLevel设计3个不同的组别层级,但是在实际中,可能UI组件需要多于三个的显示层级顺序。但在同一Level层级中,要区分它们的显示顺序是做不到的(代码中是在ReceiverGroup中使用Set的增强for循环遍历Cover,这个在不同的JDK版本得出的结果可能不一样,可能根据key的hashCode得到一种有序的结果)。所以建议设计CoverLevel为int值(类似ZOrder的概念),来区分不同的显示层级。
还有既然设计了IReceiverGroup接口,为什么在xxx.setReceiverGroup(ReceiverGroup r)方法中,不指定参数为IReceiverGroup而是直接使用ReceiverGroup实现类?我想改你的forEach方法都做不到。。

无缝续播问题

续播是不是对解码器有要求的,发现如果注释掉demo中App的ijk和exo player,使用默认的mediaplayer,续播会出现问题

内存泄露

每次Window的无缝切播退出后都会弹出的警告

列表页播放 不了。

重现步骤:
1,列表页播放一个,然后滑动出去。
2, 再次回到刚刚播放的 item ,播放不了。
3, ijkPlayer return code MEDIA_INFO_OPEN_INPUT 10005

playerbase 播放直播视频!

您写的这个好像不能播放直播视频 ,或许我没有找到设置 !如果您有空能方便通知我一下吗?谢谢!

视频播放报错

Failed to register native method tv.danmaku.ijk.media.player.IjkMediaPlayer._injectCacheNode(IJJJJ)V in /data/app/-mJm7CVdaglBjUXLqzs-Lqg==/base.apk!classes2.dex
java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception java.lang.NoSuchMethodError: no static or non-static method "Ltv/danmaku/ijk/media/play
java_vm_ext.cc:534] at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2)
java_vm_ext.cc:534] at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1099)
java_vm_ext.cc:534] at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.String) (Runtime.java:1014)
java_vm_ext.cc:534] at void java.lang.System.loadLibrary(java.lang.String) (System.java:1657)
java_vm_ext.cc:534] at void tv.danmaku.ijk.media.player.IjkMediaPlayer$1.loadLibrary(java.lang.String) (IjkMediaPlayer.java:179)
java_vm_ext.cc:534] at void tv.danmaku.ijk.media.player.IjkMediaPlayer.loadLibrariesOnce(tv.danmaku.ijk.media.player.IjkLibLoader) (IjkMediaPlayer.java:192)
java_vm_ext.cc:534] at void com.kk.taurus.ijkplayer.IjkPlayer.() (IjkPlayer.java:46)
java_vm_ext.cc:534] at java.lang.Class java.lang.Class.classForName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
java_vm_ext.cc:534] at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:453)
java_vm_ext.cc:534] at java.lang.Class java.lang.Class.forName(java.lang.String) (Class.java:378)
java_vm_ext.cc:534] at java.lang.Class com.kk.taurus.playerbase.config.PlayerLoader.getSDKClass(java.lang.String) (PlayerLoader.java:75)
java_vm_ext.cc:534] at java.lang.Object com.kk.taurus.playerbase.config.PlayerLoader.getDecoderInstance(int) (PlayerLoader.java:49)
java_vm_ext.cc:534] at com.kk.taurus.playerbase.player.BaseInternalPlayer com.kk.taurus.playerbase.config.PlayerLoader.loadInternalPlayer(int) (PlayerLoader.java:36)
java_vm_ext.cc:534] at void com.kk.taurus.playerbase.AVPlayer.loadInternalPlayer(int) (AVPlayer.java:87)
java_vm_ext.cc:534] at void com.kk.taurus.playerbase.AVPlayer.(int) (AVPlayer.java:75)
java_vm_ext.cc:534] at void com.kk.taurus.playerbase.AVPlayer.() (AVPlayer.java:64)
java_vm_ext.cc:534] at void com.kk.taurus.playerbase.assist.RelationAssist.(android.content.Context, com.kk.taurus.playerbase.widget.SuperContainer) (RelationAssist.java:87)
java_vm_ext.cc:534] at void com.kk.taurus.playerbase.assist.RelationAssist.(android.content.Context) (RelationAssist.java:82)

用系统的MediaPlayer播放器,暂停切换屏幕会出现绿屏

库很不错,感谢作者的开源,如题 我使用库后会出现绿屏的问题,手机为Meizu mi metal android5.1 api22
出现场景为: 暂停播放后切换屏幕会出现绿屏(全屏操作或者跳到第二个页面再回来), 该库例子中使用的是 ijkplayer 改为系统播放器后,也会重现这个绿屏的问题

Thanks

很不错,帮我解决了一个大麻烦,值得好好学习下!

扩展配置建议

将ijkplayer和exoplayer也放到远程仓库中,这样需要扩展的就直接引用即可,而且您要是有修改也能方便使用者更新。

扩展的方式让我学习了不少。感谢提供这样好用的库。

可否增加一个 AspectRatio_FILL_WIDTH

布局方式是充满 renderView的测量宽度,高度根据比例计算。

比如 RenderMeasure.doMeasure 里的 四个变量:

widthSpecSize,
heightSpecSize,
mVideoWidth,
mVideoHeight,

使测量结果为:

mMeasureWidth = widthSpecSize
mMeasureHeight = widthSpecSize * mVideoHeight / mVideoWidth

部分低版本手机出现奔溃

你好👋,我的应用用了PlayerBase后,是使用了RelationAssist,在部分4.2.2手机上面出现了这个奔溃
下面是奔溃信息
Thread Name: 'main'
Back traces starts.
java.lang.RuntimeException: Error during detachFromGLContext (see logcat for details)
at android.graphics.SurfaceTexture.attachToGLContext(SurfaceTexture.java:237)
at android.view.GLES20TextureLayer.setSurfaceTexture(GLES20TextureLayer.java:81)
at android.view.HardwareRenderer$Gl20Renderer.setSurfaceTexture(HardwareRenderer.java:1576)
at android.view.TextureView.getHardwareLayer(TextureView.java:393)
at android.view.View.getDisplayList(View.java:12806)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.getDisplayList(View.java:12838)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.draw(View.java:13939)
at android.widget.FrameLayout.draw(FrameLayout.java:467)
at android.view.View.getDisplayList(View.java:12843)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.draw(View.java:13939)
at android.widget.FrameLayout.draw(FrameLayout.java:467)
at android.view.View.getDisplayList(View.java:12843)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.draw(View.java:13939)
at android.widget.FrameLayout.draw(FrameLayout.java:467)
at android.view.View.getDisplayList(View.java:12843)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.getDisplayList(View.java:12838)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.getDisplayList(View.java:12838)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.getDisplayList(View.java:12838)
at android.view.View.getDisplayList(View.java:12887)
at android.view.View.draw(View.java:13632)
at android.view.ViewGroup.drawChild(ViewGroup.java:3045)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2909)
at android.view.View.draw(View.java:13939)
at android.widget.FrameLayout.draw(FrameLayout.java:467)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2228)
at android.view.View.getDisplayList(View.java:12843)
at android.view.View.getDisplayList(View.java:12887)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1249)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2523)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2390)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2192)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1181)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4945)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
at android.view.Choreographer.doCallbacks(Choreographer.java:579)
at android.view.Choreographer.doFrame(Choreographer.java:548)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5409)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:897)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:664)
at dalvik.system.NativeStart.main(Native Method)
Back traces ends.

5.0以下机型使用设置圆角直接崩溃

Caused by: java.lang.NoSuchMethodError: android.view.View.setClipToOutline
        at com.kk.taurus.playerbase.style.StyleSetter.setRoundRectShape(StyleSetter.java:50)
        at com.kk.taurus.playerbase.style.StyleSetter.setRoundRectShape(StyleSetter.java:44)
        at com.kk.taurus.playerbase.widget.BaseVideoView.setRoundRectShape(BaseVideoView.java:488)
        at com.kk.taurus.avplayer.ui.VideoViewActivity.onStyleSetRoundRect(VideoViewActivity.java:163)

没有做兼容低版本处理嘛?如果想在5.0以下机型使用,怎么设置?

Demo里面的视频列表问题

如果在视频列表里面点击播放,然后上下滚动,此时视频播放停止,然后再次点击相同视频会出现无法播放。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.