GithubHelp home page GithubHelp logo

jiajunhui / playerbase Goto Github PK

View Code? Open in Web Editor NEW
2.9K 54.0 436.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 listplay ijkplayer

playerbase's Issues

Demo里面的视频列表问题

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

npe空指针

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

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

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

可否增加一个 AspectRatio_FILL_WIDTH

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

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

widthSpecSize,
heightSpecSize,
mVideoWidth,
mVideoHeight,

使测量结果为:

mMeasureWidth = widthSpecSize
mMeasureHeight = widthSpecSize * mVideoHeight / mVideoWidth

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

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

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以下机型使用,怎么设置?

内存泄露

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

无缝续播问题

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

环境配置问题

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

部分低版本手机出现奔溃

你好👋,我的应用用了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.

播放4k视频会卡顿

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

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

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

视频播放报错

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)

window播放

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

playerbase 播放直播视频!

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

列表页播放 不了。

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

Thanks

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

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层没有去掉,依然展示

扩展配置建议

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

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

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.