本节主要为Link Visual iOS版本的音视频模块使用说明,包含视频播放、语音对讲的功能。
依赖SDK |
概述 |
API 通道 |
提供API通道能力 |
长连通道 |
P2P需要长连接通道 |
配置工程
- 在podfile中添加引用源。
source 'https://github.com/aliyun/aliyun-specs.git'
- 添加库依赖。
//如遇IMS***版本冲突,请按照pod提示修改podfile对应sdk版本
//如podfile中没有的sdk库,请查看podfile.lock对应修改podfile
pod 'IMSLinkVisualMedia', '1.5.15'
- 执行pod update,则库安装完毕。
更多版本发布信息请看Link Visual SDK更新记录。
播放器说明
播放器按功能分为三种,提供了以下功能。
功能 |
直播播放器 |
TF卡点播播放器 |
云端HLS播放器 |
视频播放 |
✓ |
✓ |
✓ |
音频播放 |
✓ |
✓ |
✓ |
暂停/恢复 |
x |
✓ |
✓ |
跳至指定位置播放 |
X |
✓ |
✓ |
总时长 |
x |
✓ |
✓ |
当前播放进度 |
x |
✓ |
✓ |
播放器状态变更通知 |
✓ |
✓ |
✓ |
静音 |
✓ |
✓ |
✓ |
变速播放 |
x |
✓ |
✓ |
画面缩放模式设置 |
✓ |
✓ |
✓ |
播放器截图 |
✓ |
✓ |
✓ |
边播边录 |
✓ |
✓ |
✓ |
提供YUV数据 |
✓ |
✓ |
✓ |
提供SEI数据 |
✓ |
✓ |
✓ |
播放器使用指南
- 引入框架。
//框架引入
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
- 设置播放器日志。
//打开播放器日志 建议为IMSLinkVisualMediaLogInfo
[IMSLinkVisualPlayerViewController setLogLevel:IMSLinkVisualMediaLogInfo];
- 创建播放器。
//创建播放器
IMSLinkVisualPlayerViewController *player = [[IMSLinkVisualPlayerViewController alloc] init];
//因为播放器为viewController,所以addChildViewController
[self addChildViewController:player];
//设置播放器frame
player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
player.view.frame = self.view.bounds;
//添加播放器view到指定位置
[self.view insertSubview:player.view atIndex:0];
//播放器代理
player.delegate = self;
- 设置播放源。
- 直播播放器
//设置参数 iotId
[player setDataSource:self.iotId
streamType:IMSLinkVisualPlayerLiveStreamTypeMain
cacheDurationInMs:3000];
//设置参数 rtmpPath rtmp地址
//needEncrypt false 不需要加密,参数iv和key都传nil
/*
注:直播切到手机后台后会自动调用stop方法,如果再次回到直播界面需要重新设置rtmpPath地址,并调用start方法
rtmpPath具有时效性,如果rtmpPath已过期,需要重新获取rtmpPath地址
TF卡点播和HLS播放不需要以上操作,请忽略
*/
[player setDataSource_Live:rtmpPath
needEncrypt:needEncrypt
iv:iv
key:key];
- TF卡点播播放器
//设置参数(时间)
//时间接口中vodStartTime为当天0点时间戳,vodEndTime为当天23点59秒时间戳,seekTime为本次播放的起始时间(秒)
[player setDataSource:iotId
vodStartTime:timestamp
vodEndTime:timestamp + dayOfSecond seekTime:time];
//设置参数(文件)
[player setDataSource:iotId
vodFileName:vodFileName];
//设置参数 rtmpPath rtmp地址
//needEncrypt false 不需要加密,参数iv和key都传nil
[player setDataSource_Vod:rtmpPath
needEncrypt:needEncrypt
iv:iv
key:key];
- 云端HLS播放器
设置云端HLS
//设置参数 (文件)
[player setDataSource:iotId
hlsFileName:file.fileName
seekTime:seekTime];
//设置参数 HLSPath http***.m3u8 seekTime的单位:秒
[player setDataSource_HLS:hlsPath
seekTime:seekTime];
- 设置并使用播放器功能。
- 开始播放
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
// 开始播放
[self.player start];
- 静音播放器
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
//播放器静音,对讲不播放接收到的声音通过mute实现
self.player.mute = true;
- 停止播放
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
// 停止播放,结束播放器
[self.player stop];
- 直播重连
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
///自动重连 默认 0 次。 自动重连只支持直播
self.player.reconnect = 10;
- 变声设置
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
/*
变声处理 0:不变声 1:大叔声
目前仅支持 0 1
默认为 0
如需要实现自定义变声,设置0,处理对讲声音回调即可
**/
self.player.voiceChangeType = 0;
- 设置
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
// 停止播放,结束播放器
[self.player stop];
- 暂停播放(仅录播)
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
// 暂停播放
[self.player pause];
- 暂停播放(仅录播)
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
// 暂停播放
[self.player pause];
- 恢复播放(仅录播)
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
// 恢复播放
[self.player restore];
- 倍速播放(仅录播)
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
// 倍速播放
self.player.playSpeed = PlaySpeed_NORMAL;
- 视频截图
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
//获取视频截图
UIImage *image = [self.player videoSnapshot];
- 视频截图
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
//获取视频截图
UIImage *image = [self.player videoSnapshot];
- 边录边播
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
- (IBAction)recordVideoButtonClick:(UIButton *)sender {
sender.selected = !sender.selected;
NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp.mp4"];
if (sender.selected) {
[self.player startRecordVideoWithfilePath:tmpPath];
} else {
[self.player stopRecordVideo];
}
}
- 设置播放器缓存
#import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
/**
//设置播放器缓存(缓存越大,延迟越高),默认为5帧
@param buffer 缓存大小 0 -- 50
*/
[self.player setDisplayBuffer:10];
- 设置播放器渲染模式
/// 播放器渲染模式
typedef NS_ENUM(NSUInteger, IMSLinkVisualPlayerDisplayMode){
/// 客户对YUV数据不可见,完全由SDK处理和渲染,默认使用这个模式
IMSLinkVisualPlayerDisplayMode_SDK,
/// 允许客户对YUV数据进行二次加工,然后再还给SDK渲染
IMSLinkVisualPlayerDisplayMode_Client_SDK,
/// YUV数据完全交由客户处理和渲染
IMSLinkVisualPlayerDisplayMode_Client
};
/// 设置播放器渲染模式,默认 IMSLinkVisualPlayerDisplayMode_SDK 模式
@property (assign, nonatomic) IMSLinkVisualPlayerDisplayMode lvDisplayMode;
/**
直播、点播的共用代理接口
视频帧YUV数据回调,同步接口,帧数据的内存和SDK是共用的,如外部需要缓存数据,必须把数据拷贝出去
@see IMSLinkVisualPlayerViewController
@param frame 视频帧YUV数据
*/
- (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player withFrame:(IMSPlayerVideoFrame *_Nullable)frame;
- 查看播放器状态。
/// 播放器状态
typedef NS_ENUM(NSUInteger,IMSLinkVisualPlayerState){
/// 空闲
IMSLinkVisualPlayerStateIdle = 0,
/// 缓冲中
IMSLinkVisualPlayerStateBuffering = 2,
/// 开始播放
IMSLinkVisualPlayerStateStartPlay = 4,
/// 暂停播放
IMSLinkVisualPlayerStatePausePlay = 8,
/// 切换到后台
IMSLinkVisualPlayerStateBackground = 16,
};
- 监听回调结果。
@protocol IMSLinkVisualDelegate <NSObject>
/*------------------直播、点播共用代理接口---------------------*/
/**
直播、点播 共用接口
连接成功
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualConnect:(IMSLinkVisualPlayerViewController *_Nullable)player;
/**
直播、点播 共用接口
准备完成进入播放状态
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualReady:(IMSLinkVisualPlayerViewController *_Nullable)player;
/**
直播、点播 共用接口
播放成功停止(正常停止)
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualStop:(IMSLinkVisualPlayerViewController *_Nullable)player;
/**
直播、点播 共用接口
连接错误回调 (所有直播点播错误,都通过这个代理回调)
@see IMSLinkVisualPlayerViewController
@param error 错误信息 IMSLinkVisualPlayerError枚举 对应 error.code
*/
- (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player errorOccurred:(NSError *_Nullable)error;
/**
直播、点播 共用接口
视频帧YUV数据回调,同步接口,帧数据的内存和SDK是共用的,如外部需要缓存数据,必须把数据拷贝出去
@see IMSLinkVisualPlayerViewController
@param frame 视频帧YUV数据
*/
- (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player withFrame:(IMSPlayerVideoFrame *_Nullable)frame;
/**
直播、点播 共用接口
初次获取画面与分辨率发生变化时回调
注:会触发停止录像
EVENT_RESOLUTION_CHANGE
@see IMSLinkVisualPlayerViewController
@param width 宽
@param height 高
*/
- (void)linkVisualResolutionChange:(IMSLinkVisualPlayerViewController *_Nullable)player width:(NSInteger)width height:(NSInteger)height;
/*---------------------点播独占代理接口-----------------------*/
/**
点播
seek成功完成
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualReplaySeekReady:(IMSLinkVisualPlayerViewController *_Nullable)player;
/**
点播
恢复播放成功完成
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualRestore:(IMSLinkVisualPlayerViewController *_Nullable)player;
/**
点播
暂停播放成功完成
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualPause:(IMSLinkVisualPlayerViewController *_Nullable)player;
/**
点播
播放到结尾的回调
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualPlayEnd:(IMSLinkVisualPlayerViewController *_Nullable)player;
/**
点播
当前时间回调
@see IMSLinkVisualPlayerViewController
*/
- (void)linkVisualReplay:(IMSLinkVisualPlayerViewController *_Nullable)player
currentTime:(NSInteger)currentTime;
/// SEI回调接口
/// @param player 播放器
/// @param data 回调二进制数据 data.length为数据长度
/// @param timeStamp 时间戳
- (void)linkVisualReplay:(IMSLinkVisualPlayerViewController *_Nullable)player
buffer:(NSData*_Nullable)data
timeStamp:(NSInteger)timeStamp;
@end
播放器错误列表
错误主码(PlayerMainError) |
描述 |
子码(解析userInfo中subCode获取) |
描述 |
ErrorSource |
数据源相关错误 |
IMSLinkVisualPlayerErrorConnect |
建立连接失败 |
IMSLinkVisualPlayerErrorEncrypt |
无效的解密密钥 |
IMSLinkVisualPlayerErrorUrl |
无效的播放地址 |
IMSLinkVisualPlayerErrorDataSource |
数据源错误或未设置 |
IMSLinkVisualPlayerErrorGetURL |
获取链接失败 |
IMSLinkVisualPlayerErrorStop |
关闭失败 |
IMSLinkVisualPlayerErrorStart |
启动失败 |
ErrorRender |
渲染相关错误 |
IMSLinkVisualPlayerErrorDecode |
解码错误 |
ErrorUnexpected |
不符合预期错误 |
IMSLinkVisualPlayerErrorStream |
接收数据流失败 |
语音对讲介绍
提供App和IPC设备之间端到端的双向实时音频传输能力。
单讲:App端采集并发送音频数据到设备端进行播放,App端采集音频期间手机保持声音静默
双讲:App端和设备端都需要同时做采音和放音,设备端必须支持AEC。
支持的音频格式 |
编码 |
解码 |
AAC_LC |
✓ |
✓ |
G711A |
✓ |
✓ |
G711U |
✓ |
✓ |
语音对讲使用指南
- 创建语音对讲编码参数
参数为录制语音数据的参数,用来与设备端对齐。
//常用对讲模式为以下参数,不建议更改,支持8K和16K
//sampleRate 8000 或 16000 以设备支持为准
IMSLinkVisualAudioParams *intercomEncodeParams = [[IMSLinkVisualAudioParams alloc] init];
intercomEncodeParams.sampleRate = 8000;
intercomEncodeParams.channel = 1;
intercomEncodeParams.bitsPerSample = 16;
intercomEncodeParams.format = IMSLinkVisualAudioFormatG711a;
- 设置语音对讲参数
创建编码器用于编码语音数据。
//player 为播放器实例 IMSLinkVisualPlayerViewController
player.intercomEncodeParams = intercomEncodeParams;
- 设置语音对讲回调代理
用于语音对讲开始与结束流程的消息回调代理,开始对讲前,先增加语音对讲状态回调方法。
player.intercomDelegate = self;
- 设置对讲数据源
用于不能通过设备ID发起对讲,需要单独设置数据源
/** 设置对讲业务数据源
@param rtmpPath rtmp地址
@param needEncrypt 是否加密 对讲都为加密,需要填true
@param iv 解密向量,16 byte 如需 base64转码、请查阅文档
@param key 解密密钥,16 byte 如需 base64转码、请查阅文档
NSData* iv = [[NSData alloc] initWithBase64EncodedString:ivString options:NSDataBase64DecodingIgnoreUnknownCharacters];
@return 是否成功设置数据源
*/
- (BOOL)setDataSource_Intercom:(NSString *_Nullable)rtmpPath needEncrypt:(BOOL)needEncrypt iv:(NSData *_Nullable)iv key:(NSData *_Nullable)key;
- 开语音对讲
设置播放器为对讲模式并开启对讲功能。
[player startIntercom:IMSLinkVisualIntercomAudioModeIntercom];
- 停止语音对讲
[player stopIntercom];
语音对讲状态回调方法与触发规则如下。
#pragma mark - IMSLinkVisualIntercomDelegate
#pragma mark 语音对讲连接服务器
- (void)linkVisualIntercomConnect:(IMSLinkVisualPlayerViewController *)player {
//语音对讲连接服务器成功
//连接成功不代表可以立即发送语音
}#pragma mark 语音对讲ready
//当对讲连接于服务端连接建立后,若对端已就绪,会告知本端事件talk ready. 此时向对端发送音频数据都会被对端收到并处理.
- (void)linkVisualIntercomReady:(IMSLinkVisualPlayerViewController * _Nullable)player {
}
#pragma mark 对讲接收到设备端音频参数
//当语音对讲通道建立后,若对端支持录音,会先收到对端发送过来的音频参数信息,
//后续对端发送的音频数据按照此音频参数来做解码. 该事件是语音对讲通道建立成功的标志.
//可以在此时构建音频播放器实例用于对端采集音频的实时播放.
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)player audioParams:(IMSLinkVisualAudioParams *)params {
}
#pragma mark 对讲接收到设备端音频数据
//若对端支持录音,语音对讲中会持续不断的收到对端发送过来的音频数据.
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)intercom audioData:(NSData *)data {
//无特殊需求可以不收集数据
if (data) {
//playBuffers为自定义可变数组收集数据
[self.playBuffers addObject:data];
}
}
#pragma mark 录音数据完成回调
//语音对讲开始后,会收集不断收到mic采集的数据,根据对讲的状态开始发送的数据
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)intercom recordData:(NSData *)data{
if (data) {
//发送录音数据 audioBuffers为自定义可变数组收集数据
[player sendAudioData:audioData];
}
}
#pragma mark 语音对讲停止
- (void)linkVisualIntercomStop:(IMSLinkVisualPlayerViewController *)player {
}
#pragma mark 语音对讲出错
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)player
errorOccurred:(NSError *)error {
//处理对讲出错的错误信息
//error.code 与 IMSLinkVisualIntercomError 对应
}
对讲错误列表
语音对讲错误状态码 |
描述 |
IMSLinkVisualIntercomErrorGetURL |
获取链接失败 |
IMSLinkVisualIntercomErrorParams |
对讲参数错误 |
IMSLinkVisualIntercomErrorStart |
启动对讲失败 |
IMSLinkVisualIntercomErrorConnect |
语音流建立失败 |
IMSLinkVisualIntercomErrorRecorder |
录音失败 |
IMSLinkVisualIntercomErrorStream |
接收数据流失败 |
IMSLinkVisualIntercomErrorDecode |
解码错误 |
IMSLinkVisualIntercomErrorSendData |
发送语音对讲数据失败 |
IMSLinkVisualIntercomErrorStop |
关闭失败 |