TextureView与MediaPlayer播放视频

什么是TextureView

TextureView 是在 4.0(API level 14) 引入的,与 SurfaceView 相比,它不会创建新的窗口来显示内容。它是将内容流直接投放到 View 中,并且可以和其它普通 View 一样进行移动,旋转,缩放,动画等变化。TextureView 必须在硬件加速的窗口中使用。现在的移动设备基本都有GPU进行硬件加速渲染。

SurfaceTexture

在这篇文章中,我们已经知道了 Surface 是内存中一段绘图缓冲区
那么 SurfaceTexture 是什么呢?
SurfaceTexture 用来捕获视频流中的图像帧,视频流可以是相机预览或者是视频解码数据。
TextureView 可以通过 getSurfaceTexture() 方法来获取 TextureView 相应的 SurfaceTexture。

因此我们使用 TextureView 时,首先要获取到用于渲染内容的 SurfaceTexture 。具体做法是先创建 TextureView 对象,然后实现 SurfaceTextureListener 接口

protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.main_layout);
    myTexture = new TextureView(this);
    myTexture.setSurfaceTextureListener(this);
}

Activity implements了SurfaceTextureListener接口因此activity中需要重写如下方法:

@Override
public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2) {
}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2) {
}

@Override
public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
}

 具体实现:

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.view.Surface;
import android.view.TextureView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, MediaPlayer.OnPreparedListener{

    private TextureView textureView;
    private Surface mSurface;
    private String URL = "/sdcard/Video/MV.mp4";
    private MediaPlayer mediaPlayer;

    private final static int REQUEST_CODE = 1234;

    private final static String[] permissions = new String[]{
            Manifest.permission.READ_EXTERNAL_STORAGE,};

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                && checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) {
            requestPermission();
        }

        setContentView(R.layout.activity_main);
        mediaPlayer = new MediaPlayer();
        textureView = findViewById(R.id.textureview);
        textureView.setSurfaceTextureListener(this);
    }

    public void play() {
        try {
            mediaPlayer.reset();//重置
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDataSource(URL);
            mediaPlayer.setSurface(mSurface);
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        mSurface = new Surface(surface);
        play();
    }

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

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        surface = null;
        mSurface = null;
        mediaPlayer.stop();
        mSurface.release();
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //释放资源
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }

    private void requestPermission() {
        requestPermission(permissions);
    }

    protected void requestPermission(String[] permissions) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissions, REQUEST_CODE);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextureView
        android:id="@+id/textureview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</RelativeLayout>

猜你喜欢

转载自blog.csdn.net/qq_37381177/article/details/112610480