ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> 移动开发 >> 视频播放三——视频播放

视频播放三——视频播放(1/4)

来源:网络整理     时间:2016-03-31     关键词:

本篇文章主要介绍了"视频播放三——视频播放",主要涉及到方面的内容,对于移动开发感兴趣的同学可以参考一下: 这一篇开始讲视频播放,这是整个项目最重要的部分,所以尽量说的详细点。我们的视频播放使用的是surfaceView+MediaPlayer,下面一步一步来看具体的...

这一篇开始讲视频播放,这是整个项目最重要的部分,所以尽量说的详细点。我们的视频播放使用的是surfaceView+MediaPlayer,下面一步一步来看具体的实现,先看效果图:
视频播放三——视频播放

视频播放三——视频播放

一. 初始化
1. 进入PlayActivity后,肯定是需要先初始化此页面的所有控件,这个就不多说了。然后看其他初始化的信息:

 @Override
    protected void initView() {
     mHolder = mSv.getHolder();
     mHolder.setType(SurfaceHolder.
         SURFACE_TYPE_PUSH_BUFFERS);
     mHolder.addCallback(this);     Intent intent = getIntent();
        mVideoFrom = intent.getIntExtra(Contants.VIDEO_FROM, Contants.LOCAL);
        mCurrentPosition = intent.getIntExtra(Contants.VIDEO_POSITION, 0);
        mVideoList = (List) intent.getSerializableExtra(Contants.VIDEO_FILES);
        if (mVideoList == null || mVideoList.size() == 0) {
            Toast.makeText(this, "没有可播放的视频", Toast.LENGTH_SHORT).show();
            finish();
        }
        if (mCurrentPosition < mVideoList.size()) {
            mVideo = mVideoList.get(mCurrentPosition);
        }

        visibleSurfaceTopAndBottom();
        mHandler.sendEmptyMessage(SYSTEM_TIME_CHANED);    }

首先从SurfaceView中获取SurfaceHolder对象mHolder,然后调用addCallback方法为mHolder设置回调接口,此接口中包括surfaceCreated,surfaceChanged,surfaceDestroyed三个方法,来控制SurfaceView内部的surface的生命周期。再是获取intent传递过来的数据,分别赋给mVideoFrom(视频来源),mCurrentPosition(视频在集合中的位置),mVideoList(视频集合),对集合做一些不合法判断的处理。最后,调用了visibleSurfaceTopAndBottom方法和使用mHandler发送了一个SYSTEM_TIME_CHANED的空消息。
visibleSurfaceTopAndBottom方法后边会详细讲,这里我们调用,只是为了一开始播放时隐藏播放界面的上下两个布局。看横屏的效果图,可以看到右上角有一个系统时间的显示,发送SYSTEM_TIME_CHANED消息就是为了获取系统时间并显示在右上角。
当然,在setListener中还需要对一些控件设置监听,这个就不贴代码了,回头再源码中自己看。

二. 视频的播放/暂停:
使用SurfaceView播放视频,必须等到其内部的surface初始化完成后才可以播放,所以在surfaceCreated方法中初始化MediaPlayer:

publicvoidsurfaceCreated(SurfaceHolder holder) {
        mVideoPlayer = new MediaPlayer();
        mVideoPlayer.setDisplay(mHolder);
        mVideoPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mVideoPlayer.setOnCompletionListener(PlayActivity.this);
        // 错误监听回调函数
        mVideoPlayer.setOnErrorListener(PlayActivity.this);
        // 设置缓存变化监听
     mVideoPlayer.setOnBufferingUpdateListener(PlayActivity.this);
        play(mPlayPosition);

    }

首先创建MediaPlayer对象mVideoPlayer,设置显示画面为mHolder,再设置音频流为STREAM_MUSIC类型,然后为mVideoPlayer设置各种监听。最后调用play方法播放视频。

privatevoidplay(finalint playPosition) {
        try {
            //获取音频焦点if (Utils.getAudioFocus(PlayActivity.this, null)) {
                mVideoPlayer.reset();
                mVideoPlayer.setDataSource(mVideo.getUrl());
                mVideoPlayer.prepare();
                mVideoPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @OverridepublicvoidonPrepared(MediaPlayer mp) {
                        try {
                            mVideoPlayer.seekTo(playPosition);
                            mVideoPlayer.setScreenOnWhilePlaying(true);
                            updateUiInfo();
                            mVideoPlayer.start();
                        } catch (IllegalStateException e) {
                            e.printStackTrace();
                            Toast.makeText(PlayActivity.this, "非法状态", Toast.LENGTH_LONG).show();
                        }

                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "加载视频错误,可能格式不支持!", Toast.LENGTH_LONG).show();
        } catch (IllegalStateException e) {
            e.printStackTrace();
            Toast.makeText(this, "非法状态", Toast.LENGTH_LONG).show();
        }
    }

来看这段代码,首先调用reset方法是mVideoPlayer进入Idle(空闲)状态,然后调用setDataSource设置播放视频的路径,成功后进入Initialized状态,如果不是Idle状态调用setDataSource方法,则会抛IllegalStateException 异常。在Initialized状态下,调用prepare方法进入prepared状态,成功后调用onPrepared方法。如果不是Initialized状态,调用prepare方法也会抛IllegalStateException 异常。
在onPrepared方法中,现在视频恢复到之前播放的位置(如果之前有保存的话),设置播放时屏幕常亮,更新界面上视频相关的一下信息,最后,调用start方法播放视频,此时mVideoPlayer就处于Started状态。
如果播放的视频格式不支持,则会抛IOException异常。

当点击播放按钮时,如果视频在播放,则暂停播放,如果视频暂停,则播放视频,在onClick方法中的代码如下:

case R.id.play_play:
                if (isPlaying()) {
                    mVideoPlayer.pause();
                    changeState(PAUSE);
                } else {
                    if (mVideoState == PAUSE) {
                        mVideoPlayer.start();
                        changeState(PLAY);
                    } elseif (mVideoState == STOP) {
                        play(0);
                    }
                }
                break;

每次播放暂停时,都需要通过changeState方法来改变播放状态。

在finish页面或者Activity进入Stop状态时,surfaceDestroyed方法会被调用,此时应该释放的mVideoPlayer占用的资源,因为下次进来会重新初始化mVideoPlayer。

相关图片

相关文章