简介
多媒体模块为 SDK 提供音视频能力,包含实时监控、实时音视频通话、远程回放、录像、截图等功能。
播放器核心(IVPlayer)
IVPlayer 是整个多媒体模块的核心,主要负责以下流程控制:
音视频通道建立。
音视频流的推拉。
协议解析。
封装和解封装。
音视频编解码。
音视频同步。
音视频渲染。
音视频录制。
播放状态控制。
其中,音视频编解码和音视频渲染流程允许开发者自定义实现(播放器已内置实现,不推荐自定义实现)。
监控播放器(MonitorPlayer)
MonitorPlayer 是基于 IVPlayer 派生的监控播放器,主要增加以下功能:
语音对讲。
音视频通话播放器(LivePlayer)
LivePlayer 是基于 IVPlayer 派生的音视频通话播放器,主要增加以下功能:
语音对讲。
双向视频。
回放播放器(PlaybackPlayer)
PlaybackPlayer 是基于 IVPlayer 派生的回放播放器,主要增加以下功能:
暂停/恢复。
跳至指定位置播放。
播放器功能对比
功能 | 监控播放器 | 回放播放器 | 音视频通话 |
视频播放 | ✓ | ✓ | ✓ |
音频播放 | ✓ | ✓ | ✓ |
暂停/恢复 | x | ✓ | x |
跳至指定位置播放 | x | ✓ | x |
总时长 | x | ✓ | x |
当前播放进度 | x | ✓ | x |
播放器状态变更通知 | ✓ | ✓ | ✓ |
静音 | ✓ | ✓ | ✓ |
画面缩放模式设置 | ✓ | ✓ | ✓ |
播放器截图 | ✓ | ✓ | ✓ |
边播边录 | ✓ | ✓ | ✓ |
对讲 | ✓ | ✓ | ✓ |
分辨率切换 | ✓ | x | x |
双向视频 | x | x | ✓ |
使用示例
创建播放器实例
注意:
如果是多源设备(NVR),创建播放器时应指定源 ID,例如"2"*
import IoTVideo// 监控播放器let monitorPlayer = IVMonitorPlayer(deviceId: device.deviceID)//非 NVR设备let monitorPlayer = IVMonitorPlayer(deviceId: device.deviceID, sourceId: 2) //NVR 设备// 音视频通话播放器let livePlayer = IVLivePlayer(deviceId: device.deviceID)//非 NVR设备let livePlayer = IVLivePlayer(deviceId: device.deviceID, sourceId: 2) //NVR 设备// 回放播放器let playbackPlayer = IVPlaybackPlayer(deviceId: device.deviceID, playbackItem: item, seekToTime: time)//非 NVR设备let playbackPlayer = IVPlaybackPlayer(deviceId: device.deviceID, playbackItem: item, seekToTime: time, sourceId: 2) //NVR 设备
注意:
以下使用
xxxxPlayer
泛指支持该功能的播放器。设置播放器代理(回调)
xxxxPlayer.delegate = self
添加摄像头预览图层(只支持 LivePlayer)
previewView.layer.addSublayer(livePlayer.previewLayer)livePlayer.previewLayer.frame = previewView.bounds
添加播放器渲染图层
videoView.insertSubview(xxxxPlayer.videoView!, at: 0)xxxxPlayer.videoView?.frame = videoView.bounds
预连接(可选),获取流媒体头信息
xxxxPlayer.prepare() //【可选】
开始播放,启动推拉流、渲染模块
xxxxPlayer.play()
开启/关闭语音对讲(只支持 MonitorPlayer/LivePlayer)
xxxxPlayer.startTalking()xxxxPlayer.stopTalking()
开启/切换/关闭摄像头(只支持 LivePlayer)
//打开摄像头livePlayer.openCamera()//切换摄像头livePlayer.switchCamera()//关闭摄像头livePlayer.closeCamera()
指定时间播放(只支持 PlaybackPlayer)
playbackPlayer.seek(toTime: time, playbackItem: item)
暂停/恢复播放(只支持 PlaybackPlayer)
//暂停playbackPlayer.pause()//恢复playbackPlayer.resume()
停止播放,断开连接
xxxxPlayer.stop()
高级功能
注意:
音视频编解码及渲染等已默认由核心播放器实现。如无必要,无需另行实现。
自定义音视频编码、解码、渲染、采集等功能模块
播放器默认使用内置采集器、编解码器、渲染器等功能模块,但允许开发者在开始播放前对内置功能模块进行某些参数修改,也可根据对应模块的协议自定义实现并赋值给播放器以覆盖内置功能模块。
// 基础播放器可自定义模块 class IVPlayer { /// 音频解码器, 默认实现为IVAudioDecoder
open var audioDecoder: (Any & IVAudioDecodable)? /// 视频解码器, 默认实现为IVVideoDecoder
open var videoDecoder: (Any & IVVideoDecodable)? /// 音频渲染器, 默认实现为IVAudioRender
open var audioRender: (Any & IVAudioRenderable)? /// 视频渲染器, 默认实现为IVVideoRender
open var videoRender: (Any & IVVideoRenderable)? /// 音视频录制器, 默认实现为IVAVRecorder
open var avRecorder: (Any & IVAVRecordable)? } // 可对讲播放器可自定义模块 public protocol IVPlayerTalkable { /// 音频采集器, 默认实现为IVAudioCapture
open var audioCapture: (Any & IVAudioCapturable) /// 音频编码器, 默认实现为IVAudioEncoder
open var audioEncoder: (Any & IVAudioEncodable) } // 可视频播放器可自定义模块 protocol IVPlayerVideoable { /// 视频采集器, 默认实现为IVVideoCapture
open var videoCapture: (Any & IVVideoCapturable)? /// 视频编码器, 默认实现为IVVideoEncoder
open var videoEncoder: (Any & IVVideoEncodable)? }
swift 示例如下:
class MyAudioEncoder: IVAudioEncodable { ... }class MyAudioDecoder: IVAudioDecodable { ... }class MyVideoRender: IVVideoRenderable { ... }// 自定义功能模块if let player = xxxxPlayer as? IVPlayerTalkable {// player.audioEncoder.audioType = .AMR // 默认AAC// player.audioEncoder = MyAudioEncoder() // 自定义audioEncoderplayer.audioCapture.sampleRate = 16000 // 默认8000}if let player = xxxxPlayer as? IVPlayerVideoable {// player.videoEncoder.videoType = .H264 // 默认H264player.videoCapture.definition = .mid // 默认low}// player.videoRender = MyVideoRender() // 自定义videoRender// player.audioDecoder = MyAudioDecoder() // 自定义audioDecoder// ....// 开始播放xxxxPlayer.play()
更多信息见 SDK 中如下路径的内置实现及其协议:
内置实现
<IoTVideo/IVAudioDecoder.h> // AudioDecode
<IoTVideo/IVAudioEncoder.h> // AudioEncode
<IoTVideo/IVVideoDecoder.h> // VideoDecode
<IoTVideo/IVVideoEncoder.h> // VideoEncode
<IoTVideo/IVVideoCapture.h> // VideoCapture
<IoTVideo/IVAVRecorder.h> // AudioRecorder + VideoRecorder
<IoTVideo/IVVideoRender.h> // VideoRender
<IoTVideo/IVAudioUnit.h> // AudioRender + AudioCapture
相关协议
<IoTVideo/IVAVRecordable.h >
<IoTVideo/IVAudioEncodable.h>
<IoTVideo/IVVideoDecodable.h>
<IoTVideo/IVAudioCapturable.h>
<IoTVideo/IVAudioRenderable.h>
<IoTVideo/IVVideoEncodable.h>
<IoTVideo/IVAudioDecodable.h >
<IoTVideo/IVVideoCapturable.h>
<IoTVideo/IVVideoRenderable.h>
自定义数据传输
此功能允许用户在建立通道连接之后传输自定义数据,例如硬件模块开关、交互指令、额外的多媒体信息等。
发送数据
说明:
#define MAX_DATA_SIZE 64000
/// 通道连接(抽象类,不要直接实例化,请使用其派生类: IVLivePlayer / IVPlaybackPlayer / IVMonitorPlayer / IVTransmission)open class IVConnection : NSObject {/// 开始连接open func connect() -> Bool/// 断开连接open func disconnect() -> Bool/// 发送自定义数据////// 需要与设备建立专门的连接通道,适用于较大数据传输、实时性要求较高的场景,如多媒体数据传输。/// @param data 要发送的数据,data.length不能超过`MAX_PKG_BYTES`/// @return 发送是否成功open func send(_ data: Data) -> Bool}
接收数据
/// 连接代理public protocol IVConnectionDelegate : NSObjectProtocol {/// 收到数据/// @param connection 连接实例/// @param data 数据func connection(_ connection: IVConnection, didReceive data: Data)}