SurfaceView和MediaPlayer视频

SurfaceView和MediaPlayer视频


* http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4 格式
调用player.setDataSource()方法设置要播放的资源,可以是文件、文件路径、或者URL。
调用MediaPlayer.setDisplay(holder)设置surfaceHolder,surfaceHolder可以通过surfaceview的getHolder()方法获得。
调用MediaPlayer.prepare()来准备。
调用MediaPlayer.start()来播放视频。

布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
<SurfaceView
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:id="@+id/sf6"
    />

<LinearLayout
    android:background="#FF231111"
    android:orientation="vertical"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:layout_marginLeft="50dp"
           android:id="@+id/iv4"
            android:background="@drawable/o"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <ImageView
                android:visibility="gone"
                android:id="@+id/iv1"
                android:background="@drawable/l"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <ImageView
                android:id="@+id/iv2"
                android:background="@drawable/m"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </FrameLayout>



        <ImageView
            android:id="@+id/iv3"
            android:background="@drawable/j"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/t1"
            android:textColor="#fff"
            android:text="123"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <SeekBar
            android:layout_weight="1"
            android:id="@+id/seekbar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/t2"
            android:textColor="#fff"
            android:text="123"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</LinearLayout>

</RelativeLayout>

activity

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
SeekBar seekBar;
ImageView left;
ImageView right;
ImageView start;
ImageView stop;
MediaPlayer mediaPlayer;
int time;
TextView textView;
TextView textView1;
private boolean isPlaying;
int duration;
private boolean isPause;
SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
Date date = new Date();
Date date1 = new Date();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initSurfaceView();





}

@SuppressLint("HandlerLeak")
Handler handler= new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        if (time*1000 <=duration && !isPause){
            seekBar.setProgress(time*1000);
            date1.setTime(time*1000);
            String format = sdf.format(date1);
            textView.setText(format);
            Message message = new Message();
            time++;
            handler.sendMessageDelayed(message,1000);
        }else if (time*1000>=duration){
            time=0;
            seekBar.setProgress(time*1000);
            Message message = new Message();
            date1.setTime(time*1000);
            String format = sdf.format(date1);
            textView.setText(format);
            time++;
            handler.sendMessageDelayed(message,1000);

        }
    }
};

public void initSurfaceView(){
    surfaceView = findViewById(R.id.sf6);
    left  = findViewById(R.id.iv4);
    right = findViewById(R.id.iv3);
    start = findViewById(R.id.iv1);
    stop = findViewById(R.id.iv2);
    seekBar = findViewById(R.id.seekbar);

    textView = findViewById(R.id.t1);
    textView1 = findViewById(R.id.t2);


    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            start.setVisibility(View.GONE);
            stop.setVisibility(View.VISIBLE);
            if (mediaPlayer.isPlaying()){
                mediaPlayer.pause();
                isPause=true;
            }
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            start.setVisibility(View.VISIBLE);
            stop.setVisibility(View.GONE);
            if (isPause){
                mediaPlayer.start();
                isPause= false;

            }
        }
    });

    //左
    left.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (time>=5){
                time-=5;
            }else {
                time= 0;
            }

            mediaPlayer.seekTo(time*1000);
            handler.removeCallbacksAndMessages(null);
            Message message = new Message();
            handler.sendMessage(message);

        }
    });

    //右
    right.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (time+5 <=duration){
                time+=5;
            }else {
                time= duration;
            }

            mediaPlayer.seekTo(time*1000);
            handler.removeCallbacksAndMessages(null);
            Message message = new Message();
            handler.sendMessage(message);
        }
    });

    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mediaPlayer.seekTo(seekBar.getProgress());
            handler.removeCallbacksAndMessages(null);
            Message message = new Message();
            time = (seekBar.getProgress()/1000);
            handler.sendMessage(message);

        }
    });

}

public void initplare(){
    if (mediaPlayer==null){
        mediaPlayer = new MediaPlayer();
    }
    try {
        mediaPlayer.setDataSource("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4");
    } catch (IOException e) {
        e.printStackTrace();
    }


    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaPlayer.setLooping(true);
                duration = mp.getDuration();
                int jin=duration;
                date.setTime(jin);
            String format = sdf.format(date);
            textView1.setText(format);
            seekBar.setMax(duration);


                mediaPlayer.start();
                Message message1 = new Message();
                message1.arg1=time;
                handler.sendMessage(message1);

        }
    });


}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    initplare();
    mediaPlayer.setDisplay(surfaceHolder);
    mediaPlayer.prepareAsync();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (isPlaying){
        mediaPlayer.pause();
        mediaPlayer.release();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    handler.removeCallbacksAndMessages(null);
}
}

效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值