插页式广告后的 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】:
这是很难调试的错误,但相对容易避免。
问题是ExoPlayer
是Google
开发的库。显然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 播放错误的主要内容,如果未能解决你的问题,请参考以下文章