插页广告后Exoplayer播放错误

10

我正在使用 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'

我也遇到了这个问题,你找到解决方案了吗? - Anton
请发布带有所有生命周期方法的活动代码片段(其中您显示广告并恢复ExoPlayer)。 - Pratik Butani
如果您在代码中写了HttpURLConnection.setFollowRedirects(false),请将其删除并按照此解决方案尝试。 - Pratik Butani
@NikhilSolanki 请不要进行那样的编辑 - 它们被认为不好,并且一开始就不应该被批准。请参阅 https://meta.stackoverflow.com/a/260246/6296561 和 https://stackoverflow.com/help/editing。 - Zoe stands with Ukraine
也许在 <Applications... android:usesCleartextTraffic="true"> 下添加这行代码会有所帮助。 - ansh sachdeva
1个回答

3

这是一个非常难以调试的错误,但可以相对容易地避免。

问题在于ExoPlayer是由 Google 开发的库。显然,Google 在其自己的产品中使用它。Google AdMob SDK在其中使用了ExoPlayer。更具体地说,它使用该播放器来显示其一些插页式广告甚至横幅广告。通常情况下,在一般的应用程序屏幕上,它无错误和异常地工作(有少量bug)。

然而,在同样使用AdMob SDK内部的ExoPlayer播放器的屏幕上,情况就不同了。两个实例使用相同的资源 - 编解码器、渲染器等,因此设备必须提供这些资源。可能同时活跃的ExoPlayer实例数量从1(或甚至0在旧的弱设备上)到10+不等——这与设备可以处理的最大硬件解码器数量相关。关于这个问题可以在这里(ExoPlayer issue 273)了解更多。

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

您的情况略有不同,因为您无法控制至少一个实例——因此我无法预测它是否有效。

无论如何,我认为这个问题应该从架构上解决,而不是通过代码暴力破解。

最简单的方法是在插页式广告开始前使用ExoPlayer.release()释放您的ExoPlayer实例,然后只有在插页式广告完成后再初始化它。幸运的是,在AdMob SDK的插页式广告中,您具有所有所需的回调方法。您可以将播放时间存储在某处,以便在广告中断时恢复从用户停止的地方继续播放。

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

我知道这并不完全是您问题的答案,而是围绕这个主题的思考,但我希望它能在某种程度上帮助您。


这不是确切的解决方案,答案是好的! :) 我现在正在寻找来自[这个问题]{https://stackoverflow.com/q/51660817/8969251}的解码器信息。 - Jayesh Rathod
你提供了非常棒的信息! - Md Mohsin
我希望这很容易,但在我的情况下,只需实例化插页式广告并加载广告即可。我也尝试在ExoPlayer的onError中释放Exoplayer并重新实例化它,但这并没有帮助。这种情况很少发生,这使得找到有效解决方案更加困难。 - bojan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接