Android MediaPlayer 播放视频
MediaPlayer 主要用于播放音频,没有提供图像输出界面,如果我们要使用 MediaPlayer 播放视频,则需要借助其它的 组件来显示 MediaPlayer 播放的图像输出
Android 提供了 SurfaceView 可以显示视频图像
下面是这个 MediaPlayer 播放视频应用的效果图
-
创建一个 空的 Android 项目
cn.twle.android.VideoPlayer
-
在 res 目录上点右键,然后选择
Android resource directory
,在弹出的界面中Resource type
项选择 raw 然后点击 OK -
下载 /static/i/android/fengfeng. mp4 放到
res/raw/
目录下注意去掉 fengfeng .mp4 之间的空格
-
修改
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>
-
修改
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 创建时,发生变化时,以及销毁时的三个方法