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

时间:2019-05-08 08:47:10

标签: android

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

无论哪种方式,我都认为应该在体系结构上解决此问题,而不是通过代码蛮力解决。

最简单的方法是在插页式广告以ExoPlayer开始之前立即释放ExoPlayer.release()实例,并在插页式广告结束后再次对其进行初始化。很高兴您在AdMob SDK中拥有插页式广告所需的所有回调方法。您可以将播放时间存储在某处,以便从用户被广告中断后停止的位置恢复播放。

更人性化的方法是不中断带有广告的视频-在广告之前和之后进行展示。或在视频中加入广告。但是完全取决于您的UI / UX和获利系统。

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