音视频处理MCT

    快速开始

    设置Acecess Key

    用户在使用SDK之前需要获取百度智能云Access Key,参考获取AK/SK

    调用BDCloudMediaPlayer的静态方法setAK来设置ak:

    BDCloudMediaPlayer.setAK(ak);

    初始化与设置监听

    初始化播放器BDCloudMediaPlayer

    BDCloudMediaPlayer mMediaPlayer = new BDCloudMediaPlayer(this.getApplicationContext());

    设置监听回调

    // 播放器已经解析出播放源格式时回调
    mMediaPlayer.setOnPreparedListener(mPreparedListener);
    // 视频宽高变化时回调, 首次解析出播放源的宽高时也会回调
    mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
    // 播放完成时回调
    mMediaPlayer.setOnCompletionListener(mCompletionListener);
    // 播放出错时回调
    mMediaPlayer.setOnErrorListener(mErrorListener);
    // 播放器信息回调,如缓冲开始、缓冲结束
    mMediaPlayer.setOnInfoListener(mInfoListener);
    // 总体加载进度回调,返回为已加载进度占视频总时长的百分比
    mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
    // seek快速调节播放位置,完成后回调
    mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener);
    // RTMP 或 http-flv 直播时实时 metadata 信息回调
    mMediaPlayer.setOnMetadataListener(mOnMetadataListener);

    直播的播放源在播放过程中,根据播放协议的不同,主播断流时可能走onCompletion回调也可能走onError回调。程序中,需要您检查主播是否完成直播,若未完成直播,自写监听器定期调用 start() 尝试继续拉流播放。

    设置播放源与显示目标

    设置播放源并让播放器解析准备播放

    // 若想设置headers,需使用setDataSource(String url, Map<String, String> headers) 方法
    mMediaPlayer.setDataSource(strVideoUrl);
    // 播放器仅支持异步准备,在onPrepared回调后方可调用start()启动播放
    mMediaPlayer.prepareAsync();

    设置播放的显示目标

    支持设置 setDisplay(SurfaceHolder holder)/setSurface(Surface surface)两种设置方法。设置时机一般在onSurfaceCreated/onSurfaceChanged回调函数中,拿到有效的SurfaceHolder时进行设置。

    public void surfaceCreated(SurfaceHolder holder) {
        mMediaPlayer.setDisplay(holder);
    }

    播放控制

    开始播放

    开始播放或者继续播放均使用start接口。调用该接口时,需保证播放器已经回调onPrepared。

    mMediaPlayer.start();

    暂停播放

    mMediaPlayer.pause();

    停止播放

    mMediaPlayer.stop();

    从stop到再次播放可以走如下几种调用:

    • 不更换播放源:stop() --> prepareAsync() --> start() when prepared
    • 更换播放源:stop() --> reset() --> setDataSource(url) --> prepareAsync() --> start() when prepared

    释放播放器

    mMediaPlayer.release();

    释放后,重新播放需创建新的player。

    属性获取

    获取音视频时长

    获取音视频时长,单位为毫秒

    long durationInMilliSeconds = mMediaPlayer.getDuration();

    获取当前播放位置

    获取当前播放位置,单位为毫秒

    long positionInMilliSeconds = mMediaPlayer.getCurrentPosition();

    获取视频宽高

    int videoWidth = mMediaPlayer.getVideoWidth();
    int videoHeight = mMediaPlayer.getVideoHeight();

    BDCloudVideoView控件

    BDCloudVideoView封装了BDCloudMediaPlayer,让您可以直接使用控件的方式来播放视频。该类直接提供了源代码,如果使用,需要将源码复制到您的项目中。大多数情况下,您仅需使用而不需要修改该控件,以防升级时与新版BDCloudVideoView不兼容。

    BDCloudVideoView的接口与系统类VideoView接口非常相似,主要作用如下:

    1. 内置视频渲染控件(TextureView/SurfaceView均可选),并可以指定视频渲染的模式(裁剪、填充、铺满),避免您直接操作mediaplayer去渲染视图的麻烦;
    2. 简化了MediaPlayer的控制接口。使用 new BDCloudVideoView --> setVideoPath --> start可以快速播放;
    3. 封装了与BDCloudMediaPlayer几乎一样的参数设置接口。使用该控件,您不需要再跟BDCloudMediaPlayer交互;

    BDCloudVideoView播放控制

    设置新的播放源

    该接口会创建一个全新的BDCloudMediaPlayer内部对象,来播放新的源。

    注意:

    调用stopPlayback()之前,不可多次调用该接口,以防对象泄漏。

    bdCloudVideoView.setVideoPath(info.getUrl());

    启动或恢复播放

    bdCloudVideoView.start();

    暂停播放

    bdCloudVideoView.pause(); // 后续可继续调用start()来恢复播放

    停止播放

    该函数会释放当前的BDCloudMediaPlayer内部对象

    bdCloudVideoView.stopPlayback();

    释放全部资源

    该函数会释放当前的BDCloudMediaPlayer内部对象和渲染目标等对象。当不再使用bdCloudVideoView对象时务必调用。

    bdCloudVideoView.release();

    设置播放相关参数

    BDCloudVideoView封装了BDCloudMediaPlayer的几乎所有参数设置接口,并以相同名字命名。

    注意:

    下列接口,请在bdCloudVideoView.setVideoPath之前调用,因setVideoPath中初始化BDCloudMediaPlayer时,需要用到这些参数的设置。

    举例:

    bdCloudVideoView.setLogEnabled(boolean enabled); // 是否显示日志
    bdCloudVideoView.setDecodeMode(int decodeMode); // 设置解码模式
    bdCloudVideoView.setInitPlayPosition(long milliSeconds); // 设置初始播放位置
    bdCloudVideoView.setUseApmDetect(boolean useApmDetect); // 是否开启APM探测;若开启,需额外嵌入APM SDK
    bdCloudVideoView.setMaxProbeTime(int maxProbeTimeInMs); // 设置最大探测时长
    bdCloudVideoView.setMaxProbeSize(int maxProbeSizeInBytes); // 设置最大探测的数据大小
    bdCloudVideoView.setMaxCacheSizeInBytes(int sizeInBytes); // 设置最大缓存数据大小
    bdCloudVideoView.setLooping(boolean isLoop); // 是否循环播放
    bdCloudVideoView.setBufferTimeInMs(int milliSeconds); // 设置"加载中"触发时,缓存多长时间的数据才结束

    另外,BDCloudVideoView还可以设置显示模式:

    // VIDEO_SCALING_MODE_SCALE_TO_FIT 填充,遵守宽高比,有黑边
    // VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING 裁剪,遵守宽高比,无黑边,但视频边缘可能被裁剪
    // VIDEO_SCALING_MODE_SCALE_TO_MATCH_PARENT 铺满,不遵守宽高比,直接铺满显示区域
    bdVideoView.setVideoScalingMode(BDCloudVideoView.VIDEO_SCALING_MODE_SCALE_TO_FIT);

    指定使用TextureView或SurfaceView

    • TextureView在Android 4.0引入,Android 4.1真正可用(因为4.1加入了setSurfaceTexture接口,可以避免黑屏)。该控件支持动画、旋转、截图等功能。如果您的播放器在ListView或ScrollView中,TextureView是首选,否则滚动的时候可能会出现边缘闪动。但缺点是性能表现不如SurfaceView。
    • SurfaceView在Android 1.0即引入,缺点是不支持旋转等动画,不宜放在有滚动条的viewgroup中。但优点是,有更好的性能,如果长时间播放视频,SurfaceView是首选。

    BDCloudVideoView默认优先使用TextureView(即:4.1及以上版本使用TextureView, 老版本使用SurfaceView)。
    如果您想设置不管系统版本,始终使用SurfaceView,以达到最好的性能,节省电量消耗,可将以下构造函数的第二个参数设置为false:

    bdCloudVideoView = new BDCloudVideoView(Context context, boolean useTextureViewFirst);

    自定义"加载中"的界面提示

    默认的加载中提示为 『一个加载圈』+ 『正在缓冲...』的提示。

    如果您想定制『加载中』的界面和提示信息,需要调用如下代码:

    bdCloudVideoView.showCacheInfo(false);

    然后,就可以在App层面自己写相关的控件,并自己控制该控件的显示与隐藏。

    工程中使用BDCloudVideoView实例

    初始化设置播放源并启动

    BDCloudVideoView.setAK(ak);
    bdVideoView = new BDCloudVideoView(this);
    /**
     * 注册listener
     */
    bdVideoView.setOnPreparedListener(this);
    bdVideoView.setOnCompletionListener(this);
    bdVideoView.setOnErrorListener(this);
    bdVideoView.setOnInfoListener(this);
    bdVideoView.setOnBufferingUpdateListener(this);
    bdVideoView.setOnPlayerStateListener(this);
    
    bdVideoView.setVideoScalingMode(BDCloudVideoView.VIDEO_SCALING_MODE_SCALE_TO_FIT);
    
    RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(-1, -1);
    rllp.addRule(RelativeLayout.CENTER_IN_PARENT);
    mViewHolder.addView(bdVideoView, rllp);
    
    // 参见demo中的AdvancedMediaController
    mediaController.setMediaPlayerControl(bdVideoView);
    
    bdVideoView.setVideoPath(info.getUrl());
    // BDCloudVideoView无prepare相关接口,允许setVideoPath后立即调用start。
    bdVideoView.start();

    停止并释放BDCloudVideoView所有资源

    注意:不使用该VideoView时务必调用本接口。

    bdVideoView.stopPlayback();
    bdVideoView.release();

    同一界面播放下一个新的视频源

    bdVideoView.stopPlayback(); // 释放上一个视频源
    bdVideoView.reSetRender(); // 清除上一个播放源的最后遗留的一帧
    bdVideoView.setVideoPath(info.getUrl());
    bdVideoView.start();

    同一界面播放同样视频的不同分辨率链接

    这种情况适用于您不同清晰度的视频是不同的播放链接时。如果不同清晰度视频在同一个链接内(即Master m3u8文件),参考进阶里面的“多码率切换”。

    bdVideoView.stopPlayback(); // 释放上一个视频源
    bdVideoView.setInitPlayPosition(1 * 1000); // 指定初始播放位置,单位为毫秒
    bdVideoView.setVideoPath(info.getUrl());
    bdVideoView.start();

    详细代码参见demo中的AdvancedPlayActivity.java或SimplePlayActivity.java

    上一篇
    SDK集成
    下一篇
    快速进阶