插页式广告后的 Exoplayer 播放错误

Posted

技术标签:

【中文标题】插页式广告后的 Exoplayer 播放错误【英文标题】:Exoplayer playback error after interstitial ad 【发布时间】: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.***.com/a/260246/6296561 和***.com/help/editing 也许在<Applications... android:usesCleartextTraffic="true">... 下添加这一行会有所帮助。 【参考方案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]***.com/q/51660817/8969251 中的解码器信息 您提供的信息很棒! 我希望它如此简单,但就我而言,它足以实例化插页式广告并加载广告。我也尝试过释放 Exoplayer 并在 ExoPlayer 的 onError 中重新实例化它,但它没有帮助。这种情况很少发生,这使得找到有效的解决方案变得更加困难。

以上是关于插页式广告后的 Exoplayer 播放错误的主要内容,如果未能解决你的问题,请参考以下文章

插页式广告加载失败:缓存错误 facebook 受众网络

Android 中的插页式广告实施错误

插页式dfp广告未在Android平板电脑上全屏显示

Admob 插页式接收请求但不填充广告

RecycleViewerAdapter 未完美显示 admob 插页式广告

Admob 和 facebook 插页式广告在同一个活动中