我正在使用 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
is Google
开发的库。明显地Google
在自己的产品中使用它。Google AdMob SDK
uses ExoPlayer
在它里面。更具体地说,它使用此播放器来显示一些插页式广告甚至横幅广告。在一般应用程序屏幕上,它通常可以无缝运行,没有错误和错误(有少量错误)。
相同的屏幕上情况会有所不同ExoPlayer
正在使用的播放器AdMob SDK
。两个实例使用相同的资源 - 编解码器、渲染器等。因此设备必须提供此资源。可能同时活动的数量ExoPlayer
实例可能从 1(或者在旧的弱设备上甚至可能是 0)到 10+ 不等 - 它与设备可以处理的硬件解码器的最大数量相关。有关此的更多信息在这里(ExoPlayer 问题 273) https://github.com/google/ExoPlayer/issues/273.
解决此限制的可能方法是设置ExoPlayer
使用软件解码器。但它可能会大大降低弱设备上的体验质量。如何创建软件解码器,您可以在源代码中找到ExoPlayer
in MediaCodecTrackRenderer.java
class.
你的情况有点不同,因为你无法控制至少一个实例 - 所以我无法预测它是否会起作用。
不管怎样,我认为这个问题应该从架构上解决,而不是通过代码暴力解决。
最简单的方法是释放您的实例ExoPlayer
就在插页式广告开始之前ExoPlayer.release()
并在插页式广告结束后再次初始化。很高兴您拥有所有需要的回调方法AdMob SDK
用于插页式广告。您可以将播放时间存储在某处,以便从用户因广告中断而停止的位置继续播放。
对用户更友好的方法是不要用广告打断视频 - 在之前和之后显示它们。或者在视频中加入广告。但完全取决于您的 UI/UX 和货币化系统。
我知道这并不完全是您问题的答案,而是围绕主题的想法,但我希望它能对您有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)