android - 在 RecyclerView (Inside ViewPager) 中播放多个 ExoPlayer 导致 MediaCodec 异常
问题描述
我正在尝试在 ViewPager 内的 RecyclerView 中播放多个 (10) ExoPlayer(在三星 Galaxy Note9 上运行),并且在左右滑动足够多的时间后,我得到了异常并且播放器(引发异常)停止播放。
你可以在这里看到一个专门的简单项目: https ://github.com/matanmarciano/MultiplePlayers.git
我的预期结果是 1. 永远向左、向右、向上和向下滑动,玩家继续游戏。2. 在所有应用程序生命周期中,每个 Stream(带有 videoUrl)的单个 ExoPlayer(我已经实现了它)
例外情况是:
2019-09-12 17:19:20.780 21989-22074/com.matanmarciano.multipleplayers E/ExoPlayerImplInternal: Internal runtime error.
java.lang.IllegalStateException
at android.media.MediaCodec.native_dequeueInputBuffer(Native Method)
at android.media.MediaCodec.dequeueInputBuffer(MediaCodec.java:2635)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:972)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:653)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:575)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:326)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
2019-09-12 17:19:20.784 21989-22074/com.matanmarciano.multipleplayers E/ExoPlayerImplInternal: Disable failed.
java.lang.IllegalStateException
at android.media.MediaCodec.native_flush(Native Method)
at android.media.MediaCodec.flush(MediaCodec.java:2131)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.flushOrReleaseCodec(MediaCodecRenderer.java:701)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.flushOrReleaseCodec(MediaCodecVideoRenderer.java:605)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onDisabled(MediaCodecRenderer.java:581)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onDisabled(MediaCodecVideoRenderer.java:451)
at com.google.android.exoplayer2.BaseRenderer.disable(BaseRenderer.java:158)
at com.google.android.exoplayer2.ExoPlayerImplInternal.disableRenderer(ExoPlayerImplInternal.java:1078)
at com.google.android.exoplayer2.ExoPlayerImplInternal.resetInternal(ExoPlayerImplInternal.java:844)
at com.google.android.exoplayer2.ExoPlayerImplInternal.stopInternal(ExoPlayerImplInternal.java:806)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:399)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
2019-09-12 17:19:20.839 21989-22074/com.matanmarciano.multipleplayers E/ExoPlayerImplInternal: Reset failed.
java.lang.IllegalStateException
at android.media.MediaCodec.native_stop(Native Method)
at android.media.MediaCodec.stop(MediaCodec.java:2084)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.releaseCodec(MediaCodecRenderer.java:608)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.releaseCodec(MediaCodecVideoRenderer.java:595)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onReset(MediaCodecRenderer.java:588)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onReset(MediaCodecVideoRenderer.java:460)
at com.google.android.exoplayer2.BaseRenderer.reset(BaseRenderer.java:164)
at com.google.android.exoplayer2.ExoPlayerImplInternal.resetInternal(ExoPlayerImplInternal.java:853)
at com.google.android.exoplayer2.ExoPlayerImplInternal.stopInternal(ExoPlayerImplInternal.java:806)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:399)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
2019-09-12 17:19:21.047 21989-22075/com.matanmarciano.multipleplayers E/ExoPlayerImplInternal: Internal runtime error.
java.lang.IllegalStateException
at android.media.MediaCodec.releaseOutputBuffer(Native Method)
at android.media.MediaCodec.releaseOutputBuffer(MediaCodec.java:2804)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.renderOutputBufferV21(MediaCodecVideoRenderer.java:999)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.processOutputBuffer(MediaCodecVideoRenderer.java:752)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.drainOutputBuffer(MediaCodecRenderer.java:1492)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:652)
at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:575)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:326)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
2019-09-12 17:19:21.048 21989-22075/com.matanmarciano.multipleplayers E/ExoPlayerImplInternal: Disable failed.
java.lang.IllegalStateException
at android.media.MediaCodec.native_flush(Native Method)
at android.media.MediaCodec.flush(MediaCodec.java:2131)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.flushOrReleaseCodec(MediaCodecRenderer.java:701)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.flushOrReleaseCodec(MediaCodecVideoRenderer.java:605)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onDisabled(MediaCodecRenderer.java:581)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onDisabled(MediaCodecVideoRenderer.java:451)
at com.google.android.exoplayer2.BaseRenderer.disable(BaseRenderer.java:158)
at com.google.android.exoplayer2.ExoPlayerImplInternal.disableRenderer(ExoPlayerImplInternal.java:1078)
at com.google.android.exoplayer2.ExoPlayerImplInternal.resetInternal(ExoPlayerImplInternal.java:844)
at com.google.android.exoplayer2.ExoPlayerImplInternal.stopInternal(ExoPlayerImplInternal.java:806)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:399)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
2019-09-12 17:19:21.094 21989-22075/com.matanmarciano.multipleplayers E/ExoPlayerImplInternal: Reset failed.
java.lang.IllegalStateException
at android.media.MediaCodec.native_stop(Native Method)
at android.media.MediaCodec.stop(MediaCodec.java:2084)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.releaseCodec(MediaCodecRenderer.java:608)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.releaseCodec(MediaCodecVideoRenderer.java:595)
at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onReset(MediaCodecRenderer.java:588)
at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onReset(MediaCodecVideoRenderer.java:460)
at com.google.android.exoplayer2.BaseRenderer.reset(BaseRenderer.java:164)
at com.google.android.exoplayer2.ExoPlayerImplInternal.resetInternal(ExoPlayerImplInternal.java:853)
at com.google.android.exoplayer2.ExoPlayerImplInternal.stopInternal(ExoPlayerImplInternal.java:806)
at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:399)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:214)
at android.os.HandlerThread.run(HandlerThread.java:65)
我的估计: 向右、向左、向下和向上滑动会导致更新 ViewHolder(所以 playerView 也在更新并且 playerView.setPlayer 被调用,所以 ExoPlayer 表面发生了变化)并且 ExoPlayer 无法克服。如果这听起来是真的,我该如何解决?有什么方法可以改变这个 ViewHolder 行为?
解决方案
推荐阅读
- javascript - 根据单选选择添加 HTML 表单的操作
- python - 为什么我的 Python 机器人有时会多次发帖?
- java - 如果浏览器控制台有任何 SEVERE 日志,则获取浏览器日志并使 TestNG 测试失败
- rstudio - 如何扩展 RStudio MathJax 以在“实时”笔记本中包含扩展?
- javascript - Wordpress 中的 GA 自定义维度 - 正确实现数据层
- flutter - Flutter:带有前导图标和标题的 CupertinoNavigationBar
- design-patterns - 直接将消息代理与最终用户客户端一起使用
- java - 是否可以调用在 1 个服务中返回 2 个不同类型列表的 2 个服务?
- python - 如何使用 `construct_change_message` 在我自己的视图中创建一个 `change_message` 以在内置的 `LogEntry` 模型中记录我的操作?在 django
- rest - TJSON.JsonToObject 不通过设置器