搜索
开发文档
应用开发
快应用开发
快游戏开发
开发文档/应用开发/服务能力/小米妙播/开发指南(视频)
开发指南(视频)更新时间: 2024-10-30 17:02:00

一、环境

作为系统级的视频流转能力,实现视频内容在手机/平板、电视/汽车等多设备间无缝切换,致力于为用户带来更多场景、更加闭环的观影体验

  • 小米手机/pad系统版本:Xiaomi HyperOS 1及以上
  • 电视端无线投屏版本:1.9.57及以上

接入场景介绍

小米妙播视频用于视频播放场景, 通过与妙播系统服务对接, 用户可以将视频内容便捷的投射到小米电视端, 并可以通过下拉控制中心对视频执行 快进,快退等播控指令

二、视频流转流程图

上传文件

三、SDK接入

1、业务播放在线视频,调用mediaInfoChange

   /**
* CP开始播放视屏后,需要主动通知 ; type: 0:表示当前视频的meta ;1:表示下一集的meta ;2:表示上一集的meta
*
* @param type
* @param meta
* @return
*/
public int mediaInfoChange(String urn, int type, MediaMetaData meta) {
return mMiplayClientCtl.mediaInfoChange(urn, type, meta);
}

1.1媒体属性示例

mMetaData=new MediaMetaData.Builder()
.setPlatform("com.xxx.xxx") //业务包名
.setTitle("") //媒体标题
.setDuration(0) //媒体总时长
.setArt(null) //封面
.setPosition(0) //启播位置
.setUrl("") //在线源:播放链接;本地源:传文件路径,格式 http://xx/xx/xx
.setMux("") //视频封装格式例如:flv
.setCodec("") //视频编码,音频编码 例如:h264,aac
.setReverso("") //视频宽高:宽*高
.setPropertiesInfo("") //走私有协议需要填写
.setSequel(0) //是否存在续集 ;1:有 0:无
.setMediaType(1) //音视频类型 0:表示音频 1:表示视频
.setTVId("") //meta唯一标识()
.create();

MetaData支持传在线url,也支持自定义属性。

1.2 自定义属性示例

 mPtInfo=new PropertiesInfo.Builder()
.setId("") //私有消息唯一标识
.setPrivateInfo("") //透传三方数据(json格式,长度限制1000字节)
.setPlatform("") //业务方包名
.setVersion("") //业务播放器版本号
.create();

2、业务视频播放器同时支持多种投屏方式,需要设置setCastMode

 /**
* CP方同步投屏状态
* @param urn
* @param protocolType 0:非小米妙播2.0 视频流转协议 1:小米妙播2.0 视频流转协议
* @param mode 0:未投屏 1:投屏中 ; 2:投屏成功
* @return
*/
public int setCastMode(String urn,int protocolType ,int mode){
return mMiplayClientCtl.setCastMode(urn, protocolType,mode);
}

3、业务视频播放器退出到后台,需要调用setCPState

       /**
* CP退出到后台,调用。
* @param urn
* @param deepLink 拉起爱奇艺需要的参数
* @param event 区分场景case
* @return
*/
public int setCPState(String urn,String deepLink,int event){
return mMiplayClientCtl.setCPState(urn, deepLink,event);
}

4、业务视频播放器,调用mediaInfoChange前需要调用setPlayingAdvertisement

/**
* 调用mediaInfoChange前需要调用,CP播放广告,通知小米,播放完成也需要同步
* @param urn
* @param state 0:没有广告/广播播放完成 1:正在播放广告
* @return
*/
public int setPlayingAdvertisement(String urn,int state){
return mMiplayClientCtl.setPlayingAdvertisement(urn,state);
}

四、API参考

1、接入说明

1.1创建MiPlayCastClient

    MiplayCastClient mClient=new MiplayCastClient(this);

注意:initAsync和unInit配套使用,调用unInit后,初始化需要重新创建MiplayCastClient 对象

1.2 实现MiplayCastClientCallback

   private MiplayCastClientCallback mCallback=new MiplayCastClientCallback() {
/**
* 初始化cast sdk成功
*/
@Override
public void onInitSuccess() throws RemoteException {

}
/**
* 初始化cast sdk失败
*/
@Override
public void onInitError() throws RemoteException {

}
/**
* 视频流转成功,通知CP,拉起播控面板
*
*/
@Override
public void onCastVideoSuccess() throws RemoteException {

}
/**
* 视频流转失败
* @param errorInfo 失败详情
*
*/
@Override
public void onCastVideoFail(String errorInfo) throws RemoteException {

}
/**
*视频流转断开,退出投射播控面板
*/
@Override
public void onCastVideoDisconnected() throws RemoteException {

}
/**
*妙播/remote控制,暂停视频,通知CP方
*/
@Override
public void onPaused() throws RemoteException {

}
/**
*妙播/remote控制,恢复播放,通知CP方
*/
@Override
public void onResumed() throws RemoteException {

}
/**
*remote远端设备执行seek指令成功后,通知CP方;
*/
@Override
public void onSeekToed() throws RemoteException {

}
/**
* 妙播/remote控制 音量设置,通知CP方
* @param volume
*/
@Override
public void onVolumeChange(double volume) throws RemoteException {

}
/**
* 妙播服务进程被杀,通知CP方
*/
@Override
public void onBinderDied() throws RemoteException {

}
/**
*妙播主动请求meta,CP方通过mediaInfoChange通知
*/
@Override
public void onRequestMediaInfo() throws RemoteException {

}
/**
*妙播主动请求下一集meta,CP方通过mediaInfoChange通知
*/
@Override
public void onRequestNext() throws RemoteException {

}
/**
* 妙播主动请求上一集meta,CP方通过mediaInfoChange通知
*/
@Override
public void onRequestPrev() throws RemoteException {

}
/**
* 妙播主动请求未投射状态,本机的倍速,CP方通过playRate通知
*/
@Override
public void onRequestPlayRate() throws RemoteException {

}
/**
* 妙播主动请求是否存在续集,CP方通过sequel通知
*/
@Override
public void onRequestSequel() throws RemoteException {

}
/**
* 妙播主动请求本机视频播放进度(未投射状态)。 CP方通过positionChanged通知
*/
@Override
public void onRequestPosition() throws RemoteException {

}
/**
* 通知CP方,remote端设备播方进度,间隔500毫秒更新一次
* @param position
*
*/
@Override
public void onPositionChanged(long position) throws RemoteException {

}
/**
* remote端设备,私有协议交互,通知CP方
* @param pInfo
*/
@Override
public void onNotifyPropertiesInfo(String pInfo) throws RemoteException {

}
/**
* 妙播主动请求本机的播放状态,CP方通过playState通知小米
*/
@Override
public void onRequestPlayState() throws RemoteException {

}
};

1.3 初始化Video Cast

mClient.initAsync(mCallback);

1.4 解绑Video Cast

mClient.unInit();

2、接口概述

public class MiplayCastClient {

private MiplayClientCtl mMiplayClientCtl;

public MiplayCastClient(Context context) {
mMiplayClientCtl = new MiplayClientCtl(context);
}

/**
* 初始化
*
* @param callback
* @return
*/
public boolean initAsync(MiplayCastClientCallback callback,String urn) {
return mMiplayClientCtl.initAsync(callback,urn);
}

/**
* 注销
*/
public void unInit(String urn) {
mMiplayClientCtl.unInit(urn);
}

/**
* 结束流转
*
* @param id cp包名
* @return
*/
public int stop(String urn) {
return mMiplayClientCtl.stop(urn);
}

/**
* 暂停播放
*
* @param id
* @return
*/
public int pause(String urn) {
return mMiplayClientCtl.pause(urn);
}

/**
* 恢复播放
*
* @param id
* @return
*/
public int resume(String urn) {
return mMiplayClientCtl.resume(urn);
}

/**
* 快进,快退
*
* @param id
* @param pos
* @return
*/
public int seekTo(String urn, long pos) {
return mMiplayClientCtl.seekTo(urn, pos);
}

/**
* 设置音量,0-100
*
* @param id
* @param volume
* @return
*/
public int setVolume(String urn, double volume) {
return mMiplayClientCtl.setVolume(urn, volume);
}

/**
* 获取播放进度,返回值 为当前进度
*
* @param id
* @return
*/
public int getPosition(String urn) {
return mMiplayClientCtl.getPosition(urn);
}

/**
* 获取remote端设备音量
*
* @param id
* @return
*/
public int getVolume(String urn) {
return mMiplayClientCtl.getVolume(urn);
}

/**
* 获取remote端设备名称
*
* @param id
* @return
*/
public String getSourceName(String urn) {
return mMiplayClientCtl.getSourceName(urn);
}


/**
* CP开始播放视屏后,需要主动通知 ; type: 0:表示当前视频的meta ;1:表示下一集的meta ;2:表示上一集的meta
*
* @param type
* @param meta
* @return
*/
public int mediaInfoChange(String urn, int type, MediaMetaData meta) {
return mMiplayClientCtl.mediaInfoChange(urn, type, meta);
}

/**
* CP方收到 onRequestPlayRate()后,需要主动调用playRate通知妙播
*
* @param id
* @param playRate 1.0f ;1.25f ; 1.5f ; 2.0f
* @return
*/
public int playRate(String urn, float playRate) {
return mMiplayClientCtl.playRate(urn, playRate);
}

/**
* CP方收到onRequesSequel 后,需要主动调用sequel 通知妙播
*
* @param id
* @param isExist
* @return
*/
public int sequel(String urn, boolean isExist) {
return mMiplayClientCtl.sequel(urn, isExist);
}

/**
* CP方收到onRequesPosition 后,需要调用positionChanged 通知妙播
*
* @param id
* @param pos
* @return
*/
public int positionChanged(String urn, long pos) {
return mMiplayClientCtl.positionChanged(urn, pos);
}

/**
* 私有协议,json格式,自定义
*
* @param id
* @param pInfo
* @return
*/
public int sendPropertiesInfo(String urn, PropertiesInfo pInfo) {
return mMiplayClientCtl.sendPropertiesInfo(urn, pInfo);
}
/**
* CP方同步投屏状态
* @param urn
* @param protocolType 0:非小米妙播2.0 视频流转协议 1:小米妙播2.0 视频流转协议
* @param mode 0:未投屏 1:投屏中 ; 2:投屏成功
* @return
*/
public int setCastMode(String urn,int protocolType ,int mode){
return mMiplayClientCtl.setCastMode(urn, protocolType,mode);
}

/**
* CP退出到后台,调用。
* @param urn
* @param deepLink 拉起爱奇艺需要的参数
* @param event 区分场景case
* @return
*/
public int setCPState(String urn,String deepLink,int event){
return mMiplayClientCtl.setCPState(urn, deepLink,event);
}

/**
* 调用mediaInfoChange前需要调用,CP播放广告,通知小米,播放完成也需要同步
* @param urn
* @param state 0:没有广告/广播播放完成 1:正在播放广告
* @return
*/
public int setPlayingAdvertisement(String urn,int state){
return mMiplayClientCtl.setPlayingAdvertisement(urn,state);
}

/**
* 小米妙播主动调用onRequestPlayState,爱奇艺通过playState 返回当前的播放状态;
* @param urn
* @param state STATE_IDLED = 0; STATE_PLAYED = 2; STATE_PAUSED = 3 STATE_BUFFERING = 6
* @return
*/
public int playState(String urn,int state){
return mMiplayClientCtl.playState(urn,state);
}

}

上一篇:业务介绍(视频)
下一篇:业务介绍
文档内容是否有帮助?
有帮助
无帮助