音视频转码MCT

    快速进阶

    播放控制条

    简单播放控制条可参考demo中的SimpleMediaController类。该类由播放按钮、播放进度条等组成。 涉及到的接口有:

    • long getDuration() 获取视频时长,单位为毫秒
    • long getCurrentPosition 获取当前播放位置,单位为毫秒
    • void seekTo(long milliSecond) 切换到某处播放
    • start() 开始播放
    • pause() 暂停播放
    • OnBufferingUpdateListener监听,回调时返回已缓存时长占视频播放时长的百分比,根据该值更新二级进度条(缓存进度)。
    • boolean isPlaying() 是否正在播放

    高级设置接口

    BDCloudMediaPlayer提供多个高级设置接口:

    • setBufferSizeInBytes(int size) 设置缓冲过程中,起播数据字节长度;即『加载中』缓冲字节数达到这个size后,回调BUFFERING_END;默认为 1*1024*1024,即1M,上限为4M;
    • setBufferTimeInMs(int time) 设置缓冲过程中,起播数据时长,单位为毫秒;即『加载中』缓冲数据可播放时长达到这个time后,回调BUFFERING_END;与上面的设置函数相关,以先达到者为准;默认为1*1000,即1秒上限为4秒。
    • setDecodeMode(int mode) 设置解码模式,可以设置为 DECODE_AUTO(优先硬解,其次软解) 或者 DECODE_SW(软解),默认为DECODE_AUTO;
    • setLogEnabled(boolean enable) 设置开启播放器Logcat输出,默认为false;发布应用时,需保证该值为false;
    • setMaxCacheSizeInBytes(int size) 设置最大缓存区大小;默认为 5*1024*1024,即 5M,上限为5M。下载数据领先于播放数据的大小。
    • setMaxProbeSize(int maxProbeSize) 设置最大视频探测probe大小;默认为 1*1024*1024,即1M,上限为4M;
    • setMaxProbeTime(int maxProbeTime) 设置最大视频探测probe时长,单位为毫秒;默认为1*1000,即1秒,上限为4秒。
    • setVolume(float leftVolume, float rightVolume) 设置左右声道的音量
    • setInitPlayPosition(long positionInMilliSeconds) 设置初始播放位置
    • setTimeoutInUs(int timeout) 设置建立连接和数据下载过程中超时时长,单位为微秒

    多码率切换

    当播放的是HLS多码率视频时,播放器支持在播放过程中实时切换码率。

    获取多码率视频(Master M3U8)的index数目

    String[] getVariantInfo()
    • 该variantinfo直接从Master m3u8文件中取值,根据(#EXT-X-STREAM-INF)格式的不同,取到的值可能为:1920x1080,3541000也可能为,232370(不规范的视频)。逗号前是分辨率,逗号后是码率;
    • 数组的大小即为多码率的数目;

    选择多码率

    播放过程中,选择多码率:

    mMediaPlayer.selectResolutionByIndex(index);

    该函数会使得player内部的状态变化stop --> prepareAsync --> prepared

    BDCloudMediaPlayer还开放了selectVariantByIndex接口。该接口不帮忙维护mediaplayer状态。如果想使用该接口,需要保证在prepareAsync之前调用。

    多码率无缝切换

    播放器不仅支持HLS的多码率快速切换,同时也支持HLS,MP4等主流媒体格式的无缝切换功能。具体操作如下:

    Master playlist 的HLS格式多码率无缝切换

    1. 设置输入格式: mMediaPlayer.setMediaInputType(mode);
    2. 在PlayerState.STATE_PREPARED状态后,调用mMediaPlayer.getMediaItems()获取多码率信息列表,更新UI。
    3. 用户根据对应索引切换到指定码率: mMediaPlayer.selectMediaByIndex(index)。
    4. 当收到IMediaPlayer.MEDIA_INFO_MEDIA_CHANGE_START通知表示视频开始切换。
    5. 当收到IMediaPlayer.MEDIA_INFO_MEDIA_CHANGE_END通知表示切换结束,同时可以取extra值判断切换是否成功。此时播放器缓冲播放完成后即会切换到新的码率显示。
    6. 当收到onVideoSizeChanged(...) 回调表示视频分辨率发生变化。

    MP4等非嵌套码率的无缝切换

    1. 设置输入格式 mMediaPlayer.setMediaInputType(mode)。
    2. 设置多码率视频链接(注意这里和HLS的区别)mMediaPlayer.setMediaItems(mediaItems)。
    3. 在PlayerState.STATE_PREPARED状态后,调用 mVideoView.getMutilMediasDsc()获取多码率信息列表,更新UI。
    4. 用户根据对应索引切换到指定码率 mMediaPlayer.selectMediaByIndex(index)。
    5. 当收到IMediaPlayer.MEDIA_INFO_MEDIA_CHANGE_START通知表示视频开始切换。
    6. 当收到IMediaPlayer.MEDIA_INFO_MEDIA_CHANGE_END通知表示切换结束,同时可以取extra值判断切换是否成功。此时播放器缓冲播放完成后即会切换到新的码率显示。
    7. 当收到onVideoSizeChanged(...) 回调表示视频分辨率发生变化。

    播放HLS加密视频

    百度媒体云MCT服务和VOD服务支持转码成HLS加密视频。

    不同的加密方式,播放时的方法略有不同:

    • PlayerBinding加密模式 按普通视频播放即可,必须使用百度播放器(Web、 Android、 iOS)。
    • Token模式(推荐)

      Token模式是PlayerBinding模式的升级版,根据约定的token进行更加安全地播放。
      token需要您的服务器与百度智能云服务器合作来生成,您的App从您的服务器拿到token后,设置给播放器即可。 prepare之前需要先设置token:

      mMediaPlayer.setDecryptTokenForHLS(mDrmToken);

    HLS视频下载

    播放器支持对M3U8视频进行下载和管理。

    下载管理器

    下载管理器以单例的形式提供:

    globalVideoDownloadManager = VideoDownloadManager.getInstance(context, userName);

    其中userName仅用于做下载记录的区分,不要求为实际用户名,可以是实际用户名的加密串或签名串。

    下载步骤

    1. 调用globalVideoDownloadManager = VideoDownloadManager.getInstance(context, userName)获得下载管理单例。
    2. 调用globalVideoDownloadManager.startOrResumeDownloader(url, observer)启动下载任务。

      函数原型:

      public void startOrResumeDownloader(String url, DownloadObserver observer)
      public void startOrResumeDownloaderWithToken(String url, String token, DownloadObserver observer) // 下载加密视频

      此后也可调用暂停(pauseDownloader)、恢复(startOrResumeDownloader)、删除(deleteDownloader)、批量停止(stopAll)等接口对下载任务进行管理。

      其中,在启动下载时,若想实时监听下载进度及状态,可继承DownloadObserver类并实现update方法,将该类的实例传给startOrResumeDownloader即可实时监听。不想实时监听,startOrResumeDownloader方法的第二个参数可传null。

      public void update(DownloadableVideoItem downloader)
    3. 实时获取下载任务的信息

      任务下载过程中,回调update(DownloadableVideoItem downloader),实时获取下载状态。

      downloader对象可获得下述方法:

    方法 描述
    getUrl() 获取单个下载的url
    getLocalAbsolutePath() 获取下载文件的本地绝对路径
    getProgress() 获取下载进度
    getStatus() 获取下载状态(枚举类DownloadStatus)
    getErrorCode() 下载状态为Error的时候,通过该接口获取错误码
    getFailReason() 获取下载失败或中止的简单描述

    注意: 错误码如DownloadableVideoItem.ERROR_CODE_INVALID_URL等

    其中,发生错误时的错误码如下表:

    错误码 描述
    ERROR_CODE_NO_ERROR 无错误
    ERROR_CODE_INVALID_URL 地址无效
    ERROR_CODE_NETWORK_FAILED 网络问题
    ERROR_CODE_SDCARD_UNMOUNTED 本地存储问题
    ERROR_CODE_M3U8_\INVALID_FORMAT m3u8格式问题
    ERROR_CODE_M3U8_SAVE_FAILED m3u8存储问题
    ERROR_CODE_M3U8_DRM_INVALID drm保护相关key或者token无效
    ERROR_CODE_TS_SAVE_FAILED ts文件保存失败
    1. 通过url查找下载任务

      通过 downloadableVideoItem = globalVideoDownloadManager.getDownloadableVideoItemByUrl(url) 获得下载任务item,以便访问item中的信息。
      通过 globalVideoDownloadManager.getAllDownloadableVideoItems()获得所有下载单元,可以从中选择出未下载完成的任务,启动继续下载(startOrResumeDownloader(oneItem.getUrl(), null)),即可实现断点续传。

    2. 下载成功后,DownloadableVideoItem#getLocalAbsolutePath 方法拿到本地视频文件全路径,传给播放器进行本地播放即可。

    边播边缓存

    代理缓存器支持HLS、MP4视频缓存

    设置视频边播边缓存步骤

    mProxyCacheManager = ProxyCacheManager.getInstance(); 获取缓存代理管理器。 String proxyPath = mProxyCacheManager.getProxyUrl(mAppContext, path); 获取播放代理链接。 mProxyCacheManager.setCacheAvailableListener(cacheListener); 设置缓存进度监听器。 setVideoURI(proxyPath); 将代理链接设置给播放器。 mProxyCacheManager.release(); 反注册缓存监听器,释放资源。 详细代码参见demo中的BDCloudVideoView.java

    上一篇
    快速开始
    下一篇
    接口速查