投屏功能接入
更新时间:2023-03-17
接入准备
接入投屏功能,需要使用播放器SDK高级版,并申请高级版License。
功能介绍
在高级版SDK中,提供了DLNA投屏能力,可以将手机端的视频内容推送到大屏端进行播放,并且支持在手机端远程控制大屏端的媒体播放,该能力由ProjectionWrapper组件提供,请确保该组件已集成到你的App中。
快速开始
1.初始化ProjectionEngine组件,传入LicenseID和设备发现回调
Java
1// 需要传入您申请的高级版证书LicenseID,ID可以在百度智能云控制台查看
2ProjectionEngine.setLicenseID(BaseApp.APP_ID);
3// 设备发现回调,可以在这里将发现到的接收端信息保存起来
4private ArrayList<DeviceUpnp> mCastReceivers = new ArrayList<>();
5private DeviceUpnp.Devicelistener upnpListenerImp = new DeviceUpnp.Devicelistener() {
6
7 @Override
8 public void OnAddDevice(DeviceUpnp device) {
9 Log.d(TAG, "onAddDevice " + device.getUuid());
10 mCastReceivers.add(device);
11 }
12
13 @Override
14 public void OnRemoveDevice(DeviceUpnp device) {
15
16 }
17};
18ProjectionEngine.getInstance().setUpnpDeviceServerListener(getContext(), upnpListenerImp);
2.开始搜索投屏设备,当找到设备时,会利用上面的回调进行通知
Java
1ProjectionEngine.getInstance().searchDeviceBegin();
3.选择设备并发起投屏
Java
1// 创建渲染控制器回调,当投屏开始后,会通知接收端的状态变化
2private ProjectionRenderListenerImp projectionRenderListenerImp = new ProjectionRenderListenerImp();
3class ProjectionRenderListenerImp implements ProjectionRender.ProjectionRenderListener {
4 @Override
5 public void onSetAVTransportURI(int renderId, boolean result) {
6 Log.i(TAG, "ProjectionRender onSetAVTransportURI " + renderId + ", result: " + result);
7 }
8
9 @Override
10 public void onPaused(int renderId, boolean result) {
11 Log.i(TAG, "ProjectionRender onPaused " + renderId + ", result " + result);
12 }
13
14 public ProjectionRenderListenerImp() {
15 }
16
17 @Override
18 public void onDuration(int renderId, final Integer duration) {
19 Log.i(TAG, "ProjectionRender onDuration " + renderId + ", duration " + duration);
20 }
21
22 @Override
23 public void onCurrent(int renderId, final Integer current) {
24 Log.i(TAG, "ProjectionRender onCurrentPosition " + renderId + ", position " + current);
25 }
26
27 @Override
28 public void onPlayed(int renderId, boolean result) {
29 Log.i(TAG, "ProjectionRender onPlayed " + renderId + ", result " + result);
30 }
31
32 @Override
33 public void onStoped(int renderId, boolean result) {
34 Log.i(TAG, "ProjectionRender onStoped " + renderId + ", result " + result);
35 }
36}
37// 从之前保存的接收端信息中选出一个作为发起投屏的目标
38DeviceUpnp device = mCastReceivers.get(position);
39private int mCastReceiverIdx = -1;
40if (null != device) {
41 // 分配渲染控制器, mCastReceiverIdx作为渲染控制器标识,后续的媒体播放控制都基于它完成
42 mCastReceiverIdx = ProjectionEngine.getInstance().distributeProjectionRender(device, projectionRenderListenerImp);
43 // 设置接收端要播放的媒体url
44 ProjectionEngine.getInstance().setAVTransportURL(mCastReceiverIdx, url);
45 // 开始播放
46 ProjectionEngine.getInstance().play(mCastReceiverIdx, 1);
47}
4.控制接收端的媒体播放
Java
1// 播放
2ProjectionEngine.getInstance().play(mCastReceiverIdx, 1);
3// 暂停
4ProjectionEngine.getInstance().pause(mCastReceiverIdx);
5// seek, 单位为秒
6ProjectionEngine.getInstance().seek(mCastReceiverIdx, 30);
7// 停止
8ProjectionEngine.getInstance().stop(mCastReceiverIdx);
5.停止搜索设备
Java
1ProjectionEngine.getInstance().searchDeviceEnd();
6.结束投屏并释放渲染控制器
Java
1ProjectionEngine.getInstance().stop(mCastReceiverIdx);
2ProjectionEngine.getInstance().releaseProjectionRender(mCastReceiverIdx);
在播放器SDK Demo中的AdvancedMediaController类对上述流程有详细的展示,可以参考。
接口说明
ProjectionEngine类
接口名 | 描述 |
---|---|
ProjectionEngine getInstance() | 获取投屏引擎单例 |
void setLicenseID(String id) | 传入LicenseID |
String getVersion() | 获取投屏引擎版本号 |
void setUpnpDeviceServerListener(Context context, DeviceUpnp.Devicelistener upnpListener) | 设置设备发现回调 |
void searchDeviceBegin() | 开始搜索设备,鉴权失败的情况下会抛出异常 |
void searchDeviceEnd() | 停止搜索设备 |
int distributeProjectionRender(DeviceUpnp device, ProjectionRender.ProjectionRenderListener renderListener) | 分配渲染控制器,返回值作为渲染控制器标识 |
void releaseProjectionRender(Integer renderIndex) | 释放渲染控制器 |
void setAVTransportURL(Integer renderIndex, String url) | 设置接收端播放的URL |
void play(Integer renderIndex, Integer speed) | 开始接收端播放,当前speed仅支持传入1 |
void pause(Integer renderIndex) | 暂停接收端播放 |
void stop(Integer renderIndex) | 停止接收端播放 |
void seek(Integer renderIndex, Integer realTime) | 控制接收端进度seek,单位为秒 |
Integer getDuration(Integer renderIndex) | 获取媒体流时长 |
Integer getCurPos(Integer renderIndex) | 获取当前播放位置 |
DeviceUpnp类
接口名 | 描述 |
---|---|
String getUuid() | 获取接收端设备ID |
String getFriendlName() | 获取接收端设备名 |
事件回调 | 含义 |
---|---|
void OnAddDevice(DeviceUpnp device) | 发现设备 |
void OnRemoveDevice(DeviceUpnp device) | 移除设备 |