我使用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日志.这可能会给你一些线索.
希望我的高级建议能够帮助你解决问题.祝好运!!!.