【问题标题】:Exoplayer playback error after interstitial ad插页式广告后的 Exoplayer 播放错误
【发布时间】:2019-09-25 22:58:58
【问题描述】:

我正在使用 ExoPlayer 播放视频并展示 Google AdMob 插页式广告。

广告消失后,无法播放视频并显示如下错误:

Playback error.com.google.android.exoplayer2.ExoPlaybackException
   at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.throwDecoderInitError(MediaCodecRenderer.java:441)
   at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:428)
   at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:920)
   at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:503)
   at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:557)
   at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:518)
   at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:301)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:193)
   at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException: Decoder init failed: OMX.qcom.video.decoder.avc, Format(1, null, video/avc, -1, null, [720, 420, -1.0], [-1, -1])
   at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.maybeInitCodec(MediaCodecRenderer.java:428) 
   at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.onInputFormatChanged(MediaCodecRenderer.java:920) 
   at com.google.android.exoplayer2.video.MediaCodecVideoRenderer.onInputFormatChanged(MediaCodecVideoRenderer.java:503) 
   at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:557) 
   at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:518) 
   at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:301) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:193) 
   at android.os.HandlerThread.run(HandlerThread.java:65) 

我正在使用库:

implementation 'com.google.android.exoplayer:exoplayer:2.8.1'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.8.1'

【问题讨论】:

  • 我也有这个问题,你找到解决办法了吗?
  • 请使用所有生命周期方法(您在哪里展示广告以及在哪里恢复 ExoPlayer)发布活动的代码 sn-p。
  • 删除HttpURLConnection.setFollowRedirects(false);如果你写在你的代码中,并按照这个solution尝试它
  • @NikhilSolanki 请不要进行这样的编辑 - 它们不被认为是好的,而且它不应该首先被批准。见meta.stackoverflow.com/a/260246/6296561stackoverflow.com/help/editing
  • 也许在<Applications... android:usesCleartextTraffic="true">... 下添加这一行会有所帮助。

标签: android admob exoplayer interstitial exoplayer2.x


【解决方案1】:

这是很难调试的错误,但相对容易避免。

问题是ExoPlayerGoogle 开发的库。显然Google 在自己的产品中使用它。 Google AdMob SDK 在其中使用 ExoPlayer。更具体地说,它使用这个播放器来展示它的一些插页式广告,甚至是横幅广告。虽然在一般应用程序屏幕上,它通常可以无缝运行,没有错误和错误(有少量错误)。

AdMob SDK 中使用相同的ExoPlayer 播放器时,屏幕上的情况会有所不同。两个实例都使用相同的资源——编解码器、渲染器等,因此设备必须提供这些资源。可能同时活动的ExoPlayer 实例的数量可能从 1(或者在旧的弱设备上甚至可能为 0)到 10+ 不等 - 它与设备可以处理的最大硬件解码器数量相关。有关此here (ExoPlayer issue 273) 的更多信息。

解决此限制的可能方法是设置ExoPlayer 以使用软件解码器。但是,它可能会大大降低弱设备上的体验质量。如何创建软件解码器你可以在MediaCodecTrackRenderer.java类的ExoPlayer的源代码中找到。

您的情况有点不同,因为您无法控制至少一个实例 - 所以我无法预测它是否会起作用。

无论哪种方式,我认为这个问题应该在架构上解决,而不是通过代码蛮力解决。

最简单的方法是在插页式广告以 ExoPlayer.release() 开头之前释放您的 ExoPlayer 实例,并仅在插页式广告结束后再次初始化它。很高兴您在AdMob SDK 中为插页式广告提供了所有需要的回调方法。您可以将播放时间存储在某个地方,以便从用户停止被广告中断的地方继续播放。

对用户更友好的方法是不要用广告打断视频 - 在之前和之后显示它们。或者在视频中加入广告。但完全取决于您的 UI/UX 和货币化系统。

我知道这并不完全是对您问题的回答,而是围绕主题的想法,但我希望它对您有所帮助。

【讨论】:

  • 嗯,这不是确切的解决方案,答案很好! :) 我现在正在寻找 [this question]{stackoverflow.com/q/51660817/8969251} 中的解码器信息
  • 您提供的信息很棒!
  • 我希望它如此简单,但就我而言,它足以实例化插页式广告并加载广告。我也尝试过释放 Exoplayer 并在 ExoPlayer 的 onError 中重新实例化它,但它没有帮助。这种情况很少发生,这使得找到有效的解决方案变得更加困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多