qq_24852895 2018-06-07 01:11 采纳率: 0%
浏览 1752
已采纳

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

播放M3U8为什么不回调setOnPrepareListener

  • 写回答

2条回答 默认 最新

  • nuanchenmi 2018-06-08 02:45
    关注

    你可以参考我的写法,注意点就是你自定义的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();
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置