ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Exoplayer为android中的大型mp4文件抛出Decoder初始化异常

2019-06-24 01:21:28  阅读:1064  来源: 互联网

标签:android exoplayer decoder


我使用Exoplayer在Android中不断播放视频作为播放列表.当我播放低质量的mp4视频时它工作正常但是当我在播放列表中播放一个或两个视频后尝试播放更高质量的mp4视频时,屏幕不会显示任何内容,并且日志会给出以下异常

com.google.android.exoplayer.MediaCodecTrackRenderer $DecoderInitializationException:解码器初始化失败:OMX.amlogic.avc.decoder.awesome,MediaFormat(video / avc,198826,1920,1080,-1.0,-1,-1,-1, -1,-1)

即使我第一次播放相同的高质量视频,然后第二次抛出此异常.当视频大小超过80mb时抛出此异常.是否有一些缓冲区大小问题?有人可以指导我.非常感谢你

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.adplayertexture);   
    AdplayerTexture=(TextureView)findViewById(R.id.AdPlayerTexture);
    AdplayerTexture.setBackgroundColor(Color.BLACK);
        AdplayerTexture.setSurfaceTextureListener(this);
  }
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
    int height) {

 AdPlayerSurface = new Surface( surface); 
 playMedia(AdPlayerSurface);
}


private void playMedia(Surface surface){
mediaplayer=new ExoPlayer();
mediaplayer.play(this,Videopathlist[CurrentVideoIndex],surface;
 mediaplayer.addListener(this);   
   }

@Override
public void onStateChanged(boolean playWhenReady, int playbackState) {

if (playbackState == ExoPlayer.STATE_ENDED) {
//releasing the resources   
    mediaplayer.DestroyPlayer();
AdPlayerSurface.release();

AdPlayerSurface=new Surface(AdplayerTexture.getSurfaceTexture());
    CurrentVideoIndex++;
playMedia(AdPlayerSurface);
}

这是root2mediaplayer类中的函数play()

public void playMedia(Activity playerActivity,String mediapath,final long Position,Surface mediasurface){
    String Systemroot = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
try{
    File myFile=new File(Systemroot + java.io.File.separator + "Videos"
            + java.io.File.separator
            + mediapath);
    Uri uri = Uri.fromFile(myFile);
    final int numRenderers = 2;

    SampleSource sampleSource = 
            new FrameworkSampleSource(playerActivity, uri, /* headers */ null, numRenderers);

    // Build the track renderers
    TrackRenderer    videoRenderer = new MediaCodecVideoTrackRenderer(sampleSource, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT);

    TrackRenderer    audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);

    // Build the ExoPlayer and start playback
    MoviePlayer = ExoPlayer.Factory.newInstance(numRenderers);
    MoviePlayer.prepare(videoRenderer, audioRenderer);

    MoviePlayer.addListener(this);
    // Pass the surface to the video renderer.
    MoviePlayer.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, mediasurface);

            MoviePlayer.seekTo(Position);
            MoviePlayer.setPlayWhenReady(true);
}catch(Exception e){

e.printStackTrace();
FileLog("exception in mediaplayer");
}

解决方法:

在没有查看完整代码的情况下,如果不知道哪个设备/平台就会看到这个问题(虽然从你的问题看起来它看起来像AMLOGIC的平台啊),我只能猜测你可能没有在你的播放器中发布MediaCodec资源当播放结束和/或您切换播放新视频时.

MediaCodec在https://github.com/google/ExoPlayer/blob/master/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java版本的releaseCodec()API中发布.

您可能想要在停止播放第一个视频并开始播放播放列表中的下一个视频时检查是否确实调用了该视频.

通常,所有高端移动平台都具有基于h / w的解码器,其使用系统上的有限且专用的视频存储器(仅可由h / w解码器访问)来解码帧.在某些平台中,如果系统中的某个其他应用程序(或同一个应用程序)创建了同一个基于h / w的解码器的另一个实例,并且在进入后台时未释放它,则无法创建解码器(在Activity中)生命周期语言,onStop等).

此外,如果在解码器被破坏时未释放专用视频内存,则由于泄漏,您将在几个视频回放会话中耗尽平台上可用的有限视频内存.

在创建和销毁MediaCodec实例时(或者在您的情况下,停止并开始播放播放列表中的下一个视频),请注意完整平台adb日志.这可能会给你一些线索.

希望我的高级建议能够帮助你解决问题.祝好运!!!.

标签:android,exoplayer,decoder
来源: https://codeday.me/bug/20190624/1275694.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有