//
|
// ARMediaIO.h
|
// ARtcKit
|
//
|
// Created by 余生丶 on 2020/6/15.
|
// Copyright © 2020 zjq. All rights reserved.
|
//
|
|
#import <Foundation/Foundation.h>
|
#import <AVFoundation/AVFoundation.h>
|
#import "AREnumerates.h"
|
|
/** 视频像素格式
|
|
关于 YVU 图像格式的描述,请参考:
|
FourCC YUV 格式说明
|
Recommended 8-Bit YUV Formats for Video Rendering
|
*/
|
typedef NS_ENUM(NSUInteger, ARVideoPixelFormat) {
|
/** I420 */
|
ARVideoPixelFormatI420 = 1,
|
/** BGRA */
|
ARVideoPixelFormatBGRA = 2,
|
/** NV12 */
|
ARVideoPixelFormatNV12 = 8,
|
};
|
|
/** 视频的顺时针旋转角度
|
|
如果设置为其他数字,系统会自动忽略
|
*/
|
typedef NS_ENUM(NSInteger, ARVideoRotation) {
|
/** 顺时针旋转 0 度 */
|
ARVideoRotationNone = 0,
|
/** 顺时针旋转 90 度*/
|
ARVideoRotation90 = 1,
|
/** 顺时针旋转 180 度 */
|
ARVideoRotation180 = 2,
|
/** 顺时针旋转 270 度 */
|
ARVideoRotation270 = 3,
|
};
|
|
/**
|
ARVideoFrameConsumer 支持接收两种 Buffer 类型的视频帧数据:PixelBuffer 和裸数据。 自定义视频源时,开发者需要通过 bufferType 来指定一种 Buffer 类型,并在自定义视频源中只使用与其对应的方法来传递视频帧数据。
|
*/
|
@protocol ARVideoFrameConsumer <NSObject>
|
|
/** PixelBuffer 类型
|
|
@param pixelBuffer PixelBuffer 类型的视频 Buffer
|
@param timestamp 传入的视频帧的时间戳,开发者必须为每一个视频帧设置一个时间戳。
|
@param rotation 视频的顺时针旋转角度, 详见 ARVideoRotation
|
*/
|
- (void)consumePixelBuffer:(CVPixelBufferRef _Nonnull)pixelBuffer
|
withTimestamp:(CMTime)timestamp
|
rotation:(ARVideoRotation)rotation;
|
|
/** RawData 类型
|
|
@param rawData RawData 类型的视频 Buffer
|
@param timestamp 传入的视频帧的时间戳,以毫秒为单位。
|
@param format ARVideoPixelFormat
|
@param size 视频裸数据的尺寸
|
@param rotation 视频的顺时针旋转角度, 详见 ARVideoRotation
|
*/
|
- (void)consumeRawData:(void * _Nonnull)rawData
|
withTimestamp:(CMTime)timestamp
|
format:(ARVideoPixelFormat)format
|
size:(CGSize)size
|
rotation:(ARVideoRotation)rotation;
|
|
|
@end
|
|
|
/** ARVideoSourceProtocol 协议
|
|
ARVideoSourceProtocol 定义了一套协议,开发者通过实现该接口,来创建自定义的视频源,并设置给 sdk 底层的 Media Engine
|
|
实时通讯过程中,SDK 通常会启动默认的视频输入设备,即内置的摄像头,进行视频推流。 使用 ARVideoSourceProtocol 接口可以自定义视频源。通过调用 设置视频源 setVideoSource 接口,可以改变并控制默认的视频输入设备,再将自定义的视频源发送给 Media Engine,让 Media Engine 进行其它视频处理,如过滤视频、将视频发布到 RTC 链接等。
|
|
*/
|
@protocol ARVideoSourceProtocol <NSObject>
|
@required
|
/** ARVideoFrameConsumer 协议,详见 ARVideoFrameConsumer */
|
@property (strong) id<ARVideoFrameConsumer> _Nullable consumer;
|
/** 初始化视频源
|
|
Media Engine 在初始化视频源的时候会回调此方法。开发者可以在这个方法中做一些准备工作,例如打开 Camera,或者初始化视频源,并通过返回值告诉 Media Engine,自定义的视频源是否已经准备好。
|
|
**Note**
|
|
初始化视频源过程中,开发者需要在 bufferType 中指定一种 Buffer 类型,并在自定义视频源中只使用与其对应的方法来传递视频帧数据。
|
|
在初始化视频源过程中,Media Engine 会传递给开发者的一个 ARVideoFrameConsumer 对象。开发者需要保存该对象,并在视频源启动后,通过这个对象把视频帧输入给 Media Engine。
|
|
开发者需要手动输入 YES 或 NO,以告诉 Media Engine 自定义视频源是否已准备好。
|
|
@return 初始化状态:
|
* YES: 自定义的视频源已经完成了初始化工作
|
* NO: 自定义的视频源设备没准备好或者初始化失败,Media Engine 会停下来并上报错误
|
*/
|
- (BOOL)shouldInitialize;
|
|
/** 启动视频源
|
|
Media Engine 在启动视频源时会回调这个方法。开发者可以在该方法中启动视频帧捕捉。开发者需要通过返回值告诉告知 Media Engine 自定义的视频源是否开启成功。
|
|
开发者需要手动输入 YES 或 NO,以告诉 Media Engine 自定义视频源是否开启:
|
|
* YES:自定义的视频源已成功开启,接下来会打开 ARVideoFrameConsumer 的开关,接收开发者传输的视频帧
|
* NO:自定义的视频源设备启动失败,Media Engine 会停下来并上报错误
|
*/
|
- (void)shouldStart;
|
|
/** 停止视频源
|
|
Media Engine 在停止视频源的时候会回调这个方法。开发者可以在这个方法中停止视频的采集。Media Engine 通过这个回调通知开发者,ARVideoFrameConsumer 的帧输入开关即将关闭,之后输入的视频帧都会被丢弃。
|
*/
|
- (void)shouldStop;
|
|
/** 释放视频源
|
|
Media Engine 通知开发者视频源即将失效,开发者可以在这个方法中关闭视频源设备。引擎会销毁 ARVideoFrameConsumer 对象,开发者需要确保在此回调之后不再使用它。
|
*/
|
- (void)shouldDispose;
|
|
/** 获取 Buffer 类型
|
|
Media Engine 在初始化的时候,会调用这个方法来查询该视频源所使用的 Buffer 类型。开发者必须指定且只能指定一种 Buffer 类型并通过返回值告诉 Media Engine
|
|
@return ARVideoBufferType
|
*/
|
- (ARVideoBufferType)bufferType;
|
|
@end
|
|
/** ARVideoSinkProtocol 协议
|
|
ARVideoSinkProtocol 定义了一套协议,开发者通过实现该接口,来创建自定义的视频渲染器,并设置给底层的 Media Engine。
|
|
实时通讯过程中,SDK 通常会启动默认的视频渲染器进行视频渲染。 ARVideoSinkProtocol 可以自定义视频渲染器,再通过调用 设置本地视频渲染器 setLocalVideoRenderer 和 设置远端视频渲染器 setRemoteVideoRenderer 接口,改变并控制默认的视频渲染器。
|
|
ARVideoSinkProtocol 由以下方法组成:
|
|
- 初始化渲染器(shouldInitialize)
|
- 启动渲染器 (shouldStart)
|
- 停止渲染器 (shouldStop)
|
- 释放渲染器 (shouldDispose)
|
- 获取 Buffer 类型 (AgoraVideoBufferType)
|
- 获取像素格式 (AgoraVideoPixelFormat)
|
- (可选) 输出视频像素 Buffer (renderPixelBuffer)
|
- (可选) 输出视频裸数据 (renderRawData)
|
Note: ARVideoSinkProtocol 接口中定义的所有方法都是回调方法,Media Engine 内部维护着状态机,并使用这些方法将自定义视频源及渲染器的状态传给 Media Engine。因此请避免直接在 App 中直接调用这些接口。 下面这个例子给出了自定义 video sink 的步骤:
|
|
- 调用 bufferType 和 AgoraVideoPixelFormat 方法设置视频帧的 Buffer 类型和像素格式。
|
- 实现 shouldInitialize、shouldStart、shouldStop 和 shouldDispose 管理自定义的 Video Sink。
|
- 根据 ARVideoFrameConsumer 实现 buffer 类型和像素格式。
|
- 创建 ARVideoFrameConsumer 自定义的 Video Sink 对象。
|
- 调用 setLocalVideoRenderer 和 setRemoteVideoRenderer 方法设置本地和远端视频渲染器。
|
- Media Engine 会根据内部状态调用 ARVideoSinkProtocol 接口中的方法。
|
*/
|
@protocol ARVideoSinkProtocol <NSObject>
|
@required
|
/** 初始化渲染器
|
|
Media Engine 初始化渲染器的时候调用这个方法。开发者可以在这个方法中做渲染器的初始化工作。如果是耗时操作,也可以提前初始化好,然后在这个方法中通过返回值告知 Media Engine 自定义渲染器已初始化好。 该方法需要开发者手动输入 YES 或 NO,告知 Media Engine 自定义渲染器的状态。
|
|
@return - YES: Media Engine 会认为自定义的渲染器已经初始化好
|
- NO: Media Engine 会认为自定义的渲染器初始化失败,不继续往下运行
|
*/
|
- (BOOL)shouldInitialize;
|
|
/** 启动渲染器
|
|
Media Engine 在开启渲染功能的时候会回调这个方法。开发者可以在这个方法中启动渲染器。 该方法需要开发者手动输入 YES 或 NO,Media Engine 会根据输入值做对应的动作:
|
|
- YES: Media Engine 继续进行渲染
|
- NO:Media Engine 认为出错而停止渲染器的功能
|
*/
|
- (void)shouldStart;
|
|
/** 停止渲染器
|
|
Media Engine 在停止渲染功能的时候会回调这个方法。开发者可以在这个方法中停止渲染。
|
*/
|
- (void)shouldStop;
|
|
/** 释放渲染器
|
|
Media Engine 通知开发者渲染器即将被废弃。在 shouldDispose 返回之后,开发者就可以释放掉资源了。
|
*/
|
- (void)shouldDispose;
|
|
/** 获取 Buffer 类型
|
|
用于在自定义渲染器的时候,需要指定 Buffer 类型,通过返回值告知引擎。Media Engine 会调用这个方法并检查返回值类型。
|
|
@return Buffer 类型
|
*/
|
- (ARVideoBufferType)bufferType;
|
|
/** 获取像素格式
|
|
@return 用于自定义渲染器的时候,还需要指定视频数据的像素格式。
|
*/
|
- (ARVideoPixelFormat)pixelFormat;
|
|
@optional
|
/** (可选)输出视频的 PixelBuffer
|
|
@param pixelBuffer 视频的 PixelBuffer
|
@param rotation 视频像素的顺时针旋转角度, ARVideoRotation
|
*/
|
- (void)renderPixelBuffer:(CVPixelBufferRef _Nonnull)pixelBuffer rotation:(ARVideoRotation)rotation;
|
|
/** 输出视频裸数据
|
|
@param rawData RawData 格式的视频
|
@param size 视频的尺寸
|
@param rotation 视频的顺时针旋转角度, ARVideoRotation
|
*/
|
- (void)renderRawData:(void * _Nonnull)rawData size:(CGSize)size rotation:(ARVideoRotation)rotation;
|
@end
|