昨天,在网上找了好多资料,终于做了一个自定义的播发器。
视频播放方式
在Android中播放视频的方式有两种:
1、使用MediaPlayer结合SurfaceView进行播放。其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置播放参数、并控制视频的播放操作。
该方式的好处是灵活性强,可随意定制。缺点是编码复杂,连开始/暂停的按钮都要自己实现。
2、使用VideoView结合MediaController进行播放。VideoView其实是从SurfaceView扩展而来,并在内部集成了MediaPlayer,从而实现视频画面与视频操作的统一管理;而MediaController则是一个简单的播放控制条,它实现了基本的控制按钮,如开始/暂停按钮、上一个/下一个按钮、快进/快退按钮,以及进度条等控件;把VideoView与MediaController关联起来,便是一个类似于Window Media Player的精简版播放器。
该方式的好处是简单易用,编码容易。缺点是可定制差,难以扩展,想给按钮换个样式都不行。
一。自定义一个activity继承SurfaceHolder和SeekBarMediaPlayer的所以接口。然后初始化界面。
package com.mymp4player; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.support.v7.app.AppCompatActivity; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.HashMap; /** * 创建:dongshuaijun * 日期:2016/7/1 * 注释:视屏播放 */ public class MainActivity extends Activity implements SurfaceHolder.Callback, View.OnClickListener , SeekBar.OnSeekBarChangeListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnSeekCompleteListener { //surfaceView private SurfaceView surfaceView; //视频最外层layout private RelativeLayout videoLayout; //控制台layout private LinearLayout controlLayout; //播放、全屏button private ImageButton playBtn, screenBtn; //进度条 private SeekBar seekBar; //加载视频进度progressBar private ProgressBar progressBar; //当前时间,总时间 private TextView currTime, countTime; //surface holder private SurfaceHolder mHolder; //媒体控制 mediaPlayer private MediaPlayer mediaPlayer; //是否全屏 private boolean isFullScreen = false; //是否正在播放 private boolean isPlay = false; //控制台是否显示 private boolean isControl = false; //是否正在拖动seekBar private boolean isSetProgress = false; //是否播放完成 private boolean isPlayCom = false; //是否是第一次加载视频 private boolean isFirstLoadVideo = true; //是否销毁activity private boolean isOnDestroy = false; //是否可见 private boolean isPause = false; //媒体音量管理 private AudioManager audioManager; //点击纵坐标 private float dY = 0; //点击横坐标 private float dX = 0; //抬起纵坐标 private float uY = 0; //抬起横坐标 private float uX = 0; //屏幕当前亮度 private float f = 0; //手机当前亮度模式 0 1 private int countLight; //系统当前亮度 1-255 private int currLight; private String width, height; private static final int HIDE_CONTROL_LAYOUT = -1; //这个地址是我抓的某平台的,我发现这个地址是变化的,所以有可能不能使用,如果不能播放,换个正常的就可以运行了,不要用模拟器运行 private static final String BASE_STORAGE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath(); public static final String RECORD_VIDEO_PATH = BASE_STORAGE_PATH + "/p2pviewcam/videos/"; private static final String VIDEO_URL = RECORD_VIDEO_PATH+"BZWYZN-031016-CBGTK_2017_06_12_17_01_37_CH_1.mp4"; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg)