Android 播放视频(一)SurfaceView + MediaPlayer

这篇博客分享了一个使用Android内置Mediaplayer和SurfaceView实现视频播放的小Demo,详细介绍了Java代码部分和布局文件的设置。项目源码已上传至GitHub,供读者参考学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最新项目中使用到了Android自带的Mediaplayer,所以在这里写了一个小Demo供大家参考使用。
##Java代码部分

package club.anhe.surfaceviewdemo.surfaceviewdemo;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import utils.CNTrace;

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
    MediaPlayer mMediaPlayer;
    SurfaceView mSurface;
    private int mPosition = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSurface = (SurfaceView) findViewById(R.id.surface);
        //mSurface.getHolder().setFixedSize(不要设置宽高,会自动拉伸播放,但不是我们所要的效果);
        mSurface.getHolder().addCallback(this);
        mSurface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//为了和低版本兼容添加上了这一句
        mMediaPlayer = new MediaPlayer();
    }

    private void play() {
        try {
            mMediaPlayer.reset();//重置为初始状态
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置音乐流的类型
            mMediaPlayer.setDisplay(mSurface.getHolder());//设置video影片以surfaceviewholder播放
            mMediaPlayer.setDataSource("/mnt/sdcard/sy.mp4");//设置路径,这里选用的是一个本地文件,Android支持http协议和rtsp协议。也可以填写这两个协议的链接。
            mMediaPlayer.prepare();//缓冲
            mMediaPlayer.start();//播放
        } catch (Exception e) {
            CNTrace.d(e.toString());
            e.printStackTrace();
        }
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.play_start:
                play();
                break;

            case R.id.play_pause:
                if(mMediaPlayer.isPlaying()){
                    mMediaPlayer.pause();
                }else{
                    mMediaPlayer.start();
                }
                break;

            case R.id.play_stop:
                if(mMediaPlayer.isPlaying()){
                    mMediaPlayer.stop();
                }
                break;

            case R.id.test:
                //startActivity(new Intent(this, TestActivity.class));
                break;
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        CNTrace.d("surfaceCreated");
        if(mPosition > 0){
            play();
            mMediaPlayer.seekTo(mPosition);
            mPosition =0;
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        CNTrace.d("format : " + format + ", width : " + width + ", height : " + height);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        CNTrace.d("surfaceDestroyed");
        if(mMediaPlayer.isPlaying()){
            mPosition = mMediaPlayer.getCurrentPosition();
            mMediaPlayer.stop();
        }
    }
}

##Layout文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="club.anhe.surfaceviewdemo.surfaceviewdemo.MainActivity">
    <SurfaceView
        android:id="@+id/surface"
        android:layout_gravity="center"
        android:layout_height="480px"
        android:layout_width="match_parent">
    </SurfaceView>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_below="@id/surface"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent">
        <Button
            android:text="播放"
            android:id="@+id/play_start"
            android:onClick="onClick"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </Button>

        <Button
            android:text="暂停"
            android:id="@+id/play_pause"
            android:onClick="onClick"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </Button>

        <Button
            android:text="停止"
            android:id="@+id/play_stop"
            android:onClick="onClick"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </Button>

        <Button
            android:text="测试"
            android:id="@+id/test"
            android:onClick="onClick"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </Button>
    </LinearLayout>
</RelativeLayout>

有了这两个文件大家就可以写出一个可以播放视频的小Demo来了。
项目放在了GitHub上,感兴趣的同学可以下载跑跑。https://github.com/kingroc711/AndroidMediaPlayer/releases/tag/SmallWindowPlay

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值