快速开始
所有文档

          音视频处理 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集成
          下一篇
          快速进阶