使用TextureView播放视频

TextureView在4.0(API level 14)中引入。它可以将内容流直接投影到View中,可以用于实现Live preview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。值得注意的是TextureView必须在硬件加速的窗口中。它显示的内容流数据可以来自App进程或是远端进程。下面是一个用TextureView进行视频播放的例子,非常简单。

1, 设置监听

textureView.setSurfaceTextureListener(this);

2,实现监听方法

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        this.surface = new Surface(surface);
        if (new File(mFilePath).exists()) {
            play(mFilePath);    //播放视频
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        surface = null;
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
        }
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }

主要就实现了连个方法,一个用于播放,一个用于释放资源。

3,实现播放方法

public void play(String filePath) {
        try {
            File file = new File(filePath);
            if (!file.exists()) {//文件不存在
                Toast.makeText(getActivity(), "文件路径错误", Toast.LENGTH_SHORT).show();
            }
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(file.getAbsolutePath());
            mMediaPlayer.setSurface(surface);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mMediaPlayer.start();
                }
            });
            mMediaPlayer.prepare();
            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    delayHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            removeSelf();
                        }
                    }, 1000);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

相当简单,而且没有使用SurfaceView和VideoView可能会出现的 QCMediaPlayer mediaplayer NOT present的问题。

推荐阅读更多精彩内容