android surfaceView+mediaPlayer 自定义视频播放器

android surfaceView+mediaPlayer 自定义视频播放器

问题描述:

播放M3U8为什么不回调setOnPrepareListener

你可以参考我的写法,注意点就是你自定义的MyCallBack()里面要回调,也就是我写的SurfaceCallBack()里面的SurfaceCreated()函数要实现你写的setOnPreparedListener()的监听
public class Video implements MediaPlayer.OnCompletionListener,MediaPlayer.OnPreparedListener,MediaPlayer.OnErrorListener,MediaPlayer.OnBufferingUpdateListener,VideoClickListener{

private Context context;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private MediaPlayer mediaPlayer;
private ProgressBar progressBar;
private SeekBar seekBar;
private VerticalSeekBar seekBar_sound;
private ImageView pause,full_screen,silent;
private TextView textView;
private boolean seekBarAutoFlag;
private String videoTimeString;


//判断值
private boolean isFullScreen=false;  //是否全屏
private boolean isPause=false; //是否暂停
private boolean isSilent=false;//是否静音

private int screenWidth;  //获取到设备的宽高
private int screenHeight;
@Override
public MediaPlayer getMediaPlayer() {
    return mediaPlayer;
}

@Override
public SurfaceView getSurfaveView() {
    return surfaceView;
}

@Override
public Thread getThread() {
    return thread;
}

public Video(Context context, MediaPlayer mediaPlayereekBar, SurfaceView surfaceView, ProgressBar progressBar, SeekBar seekBar, TextView textView, ImageView pause, ImageView full_screen) {
    this.context = context;
    this.mediaPlayer=mediaPlayereekBar;
    this.surfaceView=surfaceView;
    this.progressBar=progressBar;
    this.seekBar=seekBar;
    this.textView=textView;
    this.pause=pause;
    this.full_screen=full_screen;

    init();
}



/**
 * 初始化控件
 */
public void init(){


    // 设置surfaceHolder
    surfaceHolder = surfaceView.getHolder();
    // 设置Holder类型,该类型表示surfaceView自己不管理缓存区,虽然提示过时,但最好还是要设置
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    // 设置surface回调
    surfaceHolder.addCallback(new SurfaceCallback());

 //   mAudioManager= (AudioManager) context.getSystemService(AUDIO_SERVICE);
    //获取屏幕的宽高
    WindowManager wm = (WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE);
    screenWidth = wm.getDefaultDisplay().getWidth();
    screenHeight = wm.getDefaultDisplay().getHeight();

}

/**
 * 回调 对SurfaceView的生命周期的实现。
 */
private class SurfaceCallback implements SurfaceHolder.Callback {
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // SurfaceView的大小改变
        mediaPlayer.setDisplay(surfaceHolder);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // surfaceView被创建
        // 设置播放资源
        playVideo();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // surfaceView销毁
        // 如果MediaPlayer没被销毁,则销毁mediaPlayer
        if (null != mediaPlayer) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }
}


/**
 * 播放视频
 */
public void playVideo() {
    // 初始化MediaPlayer
    mediaPlayer = new MediaPlayer();
    // 重置mediaPaly,建议在初始滑mediaplay立即调用。
    mediaPlayer.reset();
    // 设置声音效果
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    // 设置播放完成监听
    mediaPlayer.setOnCompletionListener(Video.this);

    // 设置媒体加载完成以后回调函数。
    mediaPlayer.setOnPreparedListener(this);
    // 错误监听回调函数
    mediaPlayer.setOnErrorListener(this);
    // 设置缓存变化监听
    mediaPlayer.setOnBufferingUpdateListener(this);
    File file = new File(Environment.getExternalStorageDirectory(), "震撼宇宙10秒倒计时.mp4");
    String a=file.getPath();
    Uri uri = Uri
            .parse("http://video.eastday.com/a/180320180216447158758.html?qid=01360");
    try {
        // mediaPlayer.reset();
       //mediaPlayer.setDataSource(media.this, uri);
       mediaPlayer.setDataSource(a);
        // 设置异步加载视频,包括两种方式 prepare()同步,prepareAsync()异步
        mediaPlayer.prepareAsync();
    } catch (IOException e) {
        e.printStackTrace();
    }
}