【问题标题】:TextureView playing video turns black after onPause在 onPause 后 TextureView 播放视频变黑
【发布时间】:2015-10-11 03:36:56
【问题描述】:

我正在使用 TextureView 在 ListView 中播放视频。 TextureView 本身工作得很好,但是,如果我按主页按钮并重新进入应用程序几次,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项目上使用do e.printStackTrace();,而是使用Log.e("UNIQUE_TAG", "error doing ....", e);,这样你就可以通过logcat获得有用的错误信息
  • 每次都调用 onSurfaceTextureAvailable 吗?如果您每次都启动媒体播放器,您在哪里停止它?
  • 希望你的评论是一个流行的答案,答案确实在 onSurfaceTextureAvailable

标签: android android-listview android-mediaplayer onpause textureview


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据我的研究,textureView.getSurfaceTexture() 返回 null onResume()。我所做的是在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()上做你平常的事情

    【讨论】:

      【解决方案3】:

      当我没有释放 MediaPlayer 对象时,我发生了黑屏和音频播放。

      【讨论】:

        猜你喜欢
        • 2012-05-30
        • 1970-01-01
        • 2015-09-07
        • 2014-12-21
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多