投屏功能接入
更新时间:2023-03-17
接入准备
- 接入投屏功能,需要使用播放器SDK高级版,并申请高级版License。
- 在frameworks目录下有ProjectionEngine.framewok,将它导入到你的项目中,并设置到Xcode的Link Binary With Libraries选项中
功能介绍
在高级版SDK中,提供了DLNA投屏能力,可以将手机端的视频内容推送到大屏端进行播放,并且支持在手机端远程控制大屏端的媒体播放。该能力由ProjectionEngine组件提供,请确保该组件已集成到你的App中。
快速开始
1.初始化ProjectionEngine组件传入LicenseID
// 需要传入您申请的高级版证书LicenseID,ID可以在百度智能云控制台查看
[[ProjectionEngine shareManager] setLicenseID:LICENSE_ID];
2.实现设备发现回调,开始搜索投屏设备,当找到设备时,会利用回调进行通知
// 设备发现回调,可以在这里将发现到的接收端信息保存起来
#pragma mark DeviceListenerDelegate
- (void)OnAddDevice:(DeviceUpnp *) device {
NSLog(@"OnAddDevice == %@", device.friendlyName);
if (![self.dataArray containsObject:device]) {
[self.dataArray addObject:device];
}
}
- (void)OnRemoveDevice:(DeviceUpnp *) device {
if ([self.dataArray containsObject:device]) {
[self.dataArray removeObject:device];
}
}
[[ProjectionEngine shareManager] searchDeviceBegin:self];
3.选择设备并发起投屏
// 从之前保存的接收端信息中选出一个作为发起投屏的目标
DeviceUpnp *model = self.dataArray[indexPath.row];
// 分配渲染控制器, playId作为渲染控制器标识,后续的媒体播放控制都基于它完成
self.playId = [[ProjectionEngine shareManager] distributeProjectionRender:model delegate:self];
// 设置接收端要播放的媒体url
NSString *urlStr = [self.delegate getCurrentPlayerUrl];
[[ProjectionEngine shareManager] setAVTransportURL:self.playId url:urlStr];
4.控制接收端的媒体播放
// 播放
[[ProjectionEngine shareManager] play:self.playId speed:1];
// 暂停
[[ProjectionEngine shareManager] pause:self.playId];
// seek, 单位为秒
[[ProjectionEngine shareManager] seek:self.playId realTime:self.slider.value];
// 停止
[[ProjectionEngine shareManager] stop:self.playId];
5.停止搜索设备
[[ProjectionEngine shareManager] searchDeviceEnd];
6.结束投屏并释放渲染控制器
[[ProjectionEngine shareManager] stop:self.playId];
[[ProjectionEngine shareManager] releaseProjectionRender:self.playId];
在播放器SDK Demo中的PlayerControlVC类对上述流程有详细的展示,可以参考。
关于组播权限申请的说明
投屏设备的发现依赖组播消息的发送。自iOS14.5开始,苹果对APP的组播权限增加了控制,需要开发者单独向苹果申请组播权限。申请方式参考苹果官网文档,通过申请后,在APP的.entitlements配置文件中添加如下内容即可。
<key>com.apple.developer.networking.multicast</key>
<true/>
接口说明
ProjectionEngine类
接口名 | 描述 |
---|---|
+ (instancetype)shareManager | 获取投屏引擎单例 |
- (void) setLicenseID:(NSString*)licenseId | 传入LicenseID |
- (NSString*) getVersion | 获取投屏引擎版本号 |
- (void) searchDeviceBegin:(id |
开始搜索设备,鉴权失败的情况下会抛出异常 |
- (void) searchDeviceEnd | 停止搜索设备 |
- (int) distributeProjectionRender:(DeviceUpnp*) devicedelegate:(id |
分配渲染控制器,返回值作为渲染控制器标识 |
- (void)releaseProjectionRender:(int)renderIndex | 释放渲染控制器 |
- (void)setAVTransportURL:(int)renderIndexurl:(NSString*)url | 设置接收端播放的URL |
- (void)play:(int)renderIndex speed:(int)realtime | 开始接收端播放,当前speed仅支持传入1 |
- (void)pause:(int)renderIndex | 暂停接收端播放 |
- (void)stop:(int)renderIndex | 停止接收端播放 |
- (void)seek:(int)renderIndex realTime:(float)realtime | 控制接收端进度seek,单位为秒 |
- (int)getDuration:(int)renderIndex | 获取媒体流时长 |
- (int)getCurPos:(int)renderIndex | 获取当前播放位置 |
DeviceUpnp类
属性名 | 描述 |
---|---|
uuid | 获取接收端设备ID |
friendlyName | 获取接收端设备名 |
事件回调 | 含义 |
---|---|
- (void)OnAddDevice:(DeviceUpnp *) device | 发现设备 |
- (void)OnRemoveDevice:(DeviceUpnp *) device | 移除设备 |