Android MediaPlayer 播放视频

MediaPlayer 主要用于播放音频,没有提供图像输出界面,如果我们要使用 MediaPlayer 播放视频,则需要借助其它的 组件来显示 MediaPlayer 播放的图像输出

Android 提供了 SurfaceView 可以显示视频图像

下面是这个 MediaPlayer 播放视频应用的效果图


  1. 创建一个 空的 Android 项目 cn.twle.android.VideoPlayer

  2. 在 res 目录上点右键,然后选择 Android resource directory,在弹出的界面中 Resource type 项选择 raw 然后点击 OK

  3. 下载 /static/i/android/fengfeng. mp4 放到 res/raw/ 目录下

    注意去掉 fengfeng .mp4 之间的空格

  4. 修改 activity_main.xml 采用线性布局,添加一个 VideoView 和三个 Button

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="5dp">
    
        <LinearLayout
                android:id="@+id/btns"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" 
                android:orientation="horizontal" >
    
            <Button
                android:id="@+id/btn_start"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="开始" />
    
            <Button
                android:id="@+id/btn_pause"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="暂停 " />
    
            <Button
                android:id="@+id/btn_stop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="终止" />
        </LinearLayout>
    
        <SurfaceView
            android:id="@+id/video_show"
            android:layout_above="@id/btns"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
  5. 修改 MainActivity.java 绑定布局和创建 MediaPlayer 实例,并且播放 raw 目录下的 fengfeng.mp4

    package cn.twle.android.videoplayer;
    
    import android.content.pm.ActivityInfo;
    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 android.widget.Button;
    import android.widget.LinearLayout;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback {
    
        private MediaPlayer mPlayer = null;
        private SurfaceView sfv_show;
        private SurfaceHolder surfaceHolder;
        private Button btn_start;
        private Button btn_pause;
        private Button btn_stop;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bindViews();
        }
    
        private void bindViews() {
            sfv_show = (SurfaceView) findViewById(R.id.video_show);
            btn_start = (Button) findViewById(R.id.btn_start);
            btn_pause = (Button) findViewById(R.id.btn_pause);
            btn_stop = (Button) findViewById(R.id.btn_stop);
    
            btn_start.setOnClickListener(this);
            btn_pause.setOnClickListener(this);
            btn_stop.setOnClickListener(this);
    
            //初始化SurfaceHolder类SurfaceView的控制器
            surfaceHolder = sfv_show.getHolder();
            surfaceHolder.addCallback(this);
            surfaceHolder.setFixedSize(320, 220);   //显示的分辨率,不设置为视频默认
    
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_start:
                    mPlayer.start();
                    break;
                case R.id.btn_pause:
                    mPlayer.pause();
                    break;
                case R.id.btn_stop:
                    mPlayer.stop();
                    break;
            }
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mPlayer = MediaPlayer.create(MainActivity.this, R.raw.fengfeng);
            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    
            changeVideoSize();
    
            mPlayer.setDisplay(surfaceHolder);    //设置显示视频显示在SurfaceView上
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            changeVideoSize();
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {}
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (mPlayer.isPlaying()) {
                mPlayer.stop();
            }
            mPlayer.release();
        }
    
        public void changeVideoSize() {
    
            int surfaceWidth = sfv_show.getLayoutParams().width;
            int surfaceHeight= sfv_show.getLayoutParams().height;
    
            int videoWidth = mPlayer.getVideoWidth();
            int videoHeight = mPlayer.getVideoHeight();
    
            //根据视频尺寸去计算->视频可以在sufaceView中放大的最大倍数
    
            float max;
            if (getResources().getConfiguration().orientation==ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                //竖屏模式下按视频宽度计算放大倍数值
                max = Math.max((float) videoWidth / (float) surfaceWidth,(float) videoHeight / (float) surfaceHeight);
            } else{
                //横屏模式下按视频高度计算放大倍数值
                max = Math.max(((float) videoWidth/(float) surfaceHeight),(float) videoHeight/(float) surfaceWidth);
            }
    
            //视频宽高分别/最大倍数值 计算出放大后的视频尺寸
            videoWidth = (int) Math.ceil((float) videoWidth / max);
            videoHeight = (int) Math.ceil((float) videoHeight / max);
    
            //无法直接设置视频尺寸,将计算出的视频尺寸设置到surfaceView 让视频自动填充。
            sfv_show.setLayoutParams(new LinearLayout.LayoutParams(videoWidth, videoHeight));
        }  
    }
    

布局有个 SurfaceView,然后调用 getHolder() 方法获得一个 SurfaceHolder 对象

然后完成 SurfaceView 相关的设置,设置了显示的分辨率以及一个 Callback 接口

最后重写了 SurfaceView 创建时,发生变化时,以及销毁时的三个方法

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.