TextureView在onPause后播放视频会变黑

7
我正在使用TextureView在ListView中播放视频。TextureView本身工作得非常好,但是如果我按下home按钮并重新进入应用程序多次,TextureView会变成黑色(尽管音频仍在播放)。如果我再次退出并重新进入,TextureView就会变成白色(或者可能是透明的,因为白色是我的背景颜色)。
这是我的代码:
holder.instagramTextureView
    .setSurfaceTextureListener(new SurfaceTextureListener() {

        @Override
        public void onSurfaceTextureUpdated(
                SurfaceTexture surface) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSurfaceTextureSizeChanged(
                SurfaceTexture surface, int width, int height) {
            // TODO Auto-generated method stub

        }

        @Override
        public boolean onSurfaceTextureDestroyed(
                SurfaceTexture surface) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public void onSurfaceTextureAvailable(
                SurfaceTexture surface, int width, int height) {
            final Surface s = new Surface(surface);

            try {
                holder.mMediaPlayer = new MediaPlayer();
                holder.mMediaPlayer.setDataSource(post
                                .getMedias().get(0)
                                .getMediaUrlVideomp4StandardRes());
                holder.mMediaPlayer.setSurface(s);
                holder.mMediaPlayer.prepare();

                holder.instagramVideoVolume = 0f;
                holder.mMediaPlayer.setVolume(
                        holder.instagramVideoVolume,
                        holder.instagramVideoVolume);
                //holder.mMediaPlayer.setOnBufferingUpdateListener(this);

                holder.mMediaPlayer
                    .setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(
                                MediaPlayer mp) {

                            // To play:
                            mp.reset();
                            try {
                                mp.setDataSource(post
                                    .getMedias()
                                    .get(0)
                                    .getMediaUrlVideomp4StandardRes());
                                mp.prepare();

                            } catch (IllegalArgumentException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            } catch (SecurityException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            } catch (IllegalStateException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            }
                            // <--- Here comes a call to
                            // "To Resize" which is shown
                            // right above this code
                            mp.start();
                        }
                });

                // holder.mMediaPlayer.setOnPreparedListener(this);
                //holder.mMediaPlayer.setOnVideoSizeChangedListener(this);

                holder.mMediaPlayer
                    .setAudioStreamType(AudioManager.STREAM_MUSIC);
                holder.mMediaPlayer.start();

                holder.instagramTextureView
                    .setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            if (holder.instagramVideoVolume == 1) {
                                holder.instagramVideoVolume = 0f;
                                holder.mMediaPlayer
                                    .setVolume(
                                        holder.instagramVideoVolume,
                                        holder.instagramVideoVolume);
                            } else {
                                holder.instagramVideoVolume = 1f;
                                holder.mMediaPlayer
                                    .setVolume(
                                        holder.instagramVideoVolume,
                                        holder.instagramVideoVolume);
                                    }
                            }
                });

            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
});

不要在Android项目中使用e.printStackTrace(),而应该使用Log.e("UNIQUE_TAG", "error doing ....", e);,这样你可以通过logcat获取有用的错误信息。 - petey
onSurfaceTextureAvailable每次都被调用了吗?如果您每次启动媒体播放器,那么在哪里停止它呢? - fadden
希望您的评论是一个答案,fadden。答案确实在onSurfaceTextureAvailable中。 - Userrrrrrrrr
3个回答

2
问题在于每次可用表面时都会创建一个新的媒体播放器。不太确定它是如何工作的,但这就是问题所在。相反,我将媒体播放器创建在此侦听器之外。

0
根据我的研究,textureView.getSurfaceTexture()onResume() 中返回 null。我所做的是在 onResume() 中重新附加一个监听器。
TextureView textureView;

/*....
Usual stuff
*/

public void onPause(){
    super.onPause();

    //... destroy or disable image producer
}

public void onResume(){
    super.onResume();

    textureView.setSurfaceTextureListener(/*another listener*/);
}

然后,在onSurfaceTextureAvailable()上执行您通常的操作


0
当我没有释放MediaPlayer对象时,出现了黑屏和音频播放的情况。

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