AOQ Client SDK 提供了完整的视频能力,覆盖视频采集、渲染显示、编码配置、帧数据回调、外部视频输入等核心场景。本文档基于 Android(Java)、iOS(Objective-C)、Ohos(ArkTS)三个平台的公开 API,对视频常用功能进行统一介绍。
1. 视频采集
1.1 功能说明
视频采集用于打开设备摄像头,将实时视频帧数据送入 SDK 编码推流管线。SDK 支持两种采集模式:
-
内部采集(默认):SDK 自动管理摄像头设备的打开、帧采集和关闭,支持前后置摄像头切换。
-
外部采集:由应用自行管理摄像头或其他视频源,采集到的帧数据通过
pushExternalVideoCapturedFrame接口输入 SDK。
1.2 采集配置参数
|
参数 |
类型 |
默认值 |
说明 |
|
width |
int |
1280 |
采集宽度(像素),外部采集时无效 |
|
height |
int |
720 |
采集高度(像素),外部采集时无效 |
|
fps |
int |
15 |
采集帧率,外部采集时由送帧节奏决定 |
|
isExternal |
bool |
false |
是否使用外部采集模式 |
|
cameraDirection |
AoqCameraDirection |
Front(0) |
摄像头方向,外部采集时无效 |
1.3 摄像头方向枚举
|
枚举值 |
数值 |
说明 |
|
AoqCameraDirectionFront |
0 |
前置摄像头 |
|
AoqCameraDirectionBack |
1 |
后置摄像头 |
1.4 API 对照
|
功能 |
Android |
iOS |
Ohos |
|
开启采集 |
startVideoCapture(config) |
startVideoCapture:config: |
startVideoCapture(config) |
|
关闭采集 |
stopVideoCapture() |
stopVideoCapture |
stopVideoCapture() |
|
切换摄像头 |
switchCamera(direction) |
switchCamera: |
switchCamera(direction) |
1.5 使用示例
Android
AoqVideoCaptureConfig config = new AoqVideoCaptureConfig();
config.width = 1280;
config.height = 720;
config.fps = 15;
config.cameraDirection = AoqCameraDirection.AoqCameraDirectionFront;
engine.startVideoCapture(config);
iOS
AoqVideoCaptureConfig *config = [[AoqVideoCaptureConfig alloc] init];
config.width = 1280;
config.height = 720;
config.fps = 15;
config.cameraDirection = AoqCameraDirectionFront;
[engine startVideoCapture:config];
Ohos
let config: AoqVideoCaptureConfig = {
width: 1280,
height: 720,
fps: 15,
cameraDirection: AoqCameraDirection.AoqCameraDirectionFront
};
engine.startVideoCapture(config);
2. 视频渲染
2.1 功能说明
视频渲染用于将本地采集或远端接收的视频帧数据显示到屏幕上。SDK 支持设置本地预览窗口和远端渲染窗口,通过 trackType 区分视频流(Video)和屏幕共享流(Screen)。
2.2 渲染模式
|
枚举值 |
数值 |
说明 |
|
AoqRenderModeAuto |
0 |
自动模式 |
|
AoqRenderModeStretch |
1 |
拉伸平铺,画面可能变形 |
|
AoqRenderModeFill |
2 |
填充黑边,画面完整显示 |
|
AoqRenderModeCrop |
3 |
裁剪模式,画面内容可能丢失 |
2.3 画布配置
|
参数 |
类型 |
默认值 |
说明 |
|
view |
平台视图 |
null |
渲染视图(Android: SurfaceView/TextureView, iOS: UIView, Ohos: XComponent) |
|
renderMode |
AoqRenderMode |
Auto(0) |
渲染显示模式 |
2.4 API 对照
|
功能 |
Android |
iOS |
Ohos |
|
设置本地预览 |
setLocalView(trackType, canvas) |
setLocalView:trackType:canvas: |
setLocalView(trackType, canvas) |
|
设置远端渲染 |
setRemoteView(trackType, canvas) |
setRemoteView:trackType:canvas: |
setRemoteView(trackType, canvas) |
平台差异:Android 使用 SurfaceView 或 TextureView 作为渲染容器;iOS 使用 UIView(内部通过 AoqRenderView 封装,支持 Metal 加速);Ohos 使用 XComponent(通过 AoqXComponentController 管理 native 渲染视图)。
3. 视频编码配置
3.1 功能说明
设置视频编码参数,包括编码格式、分辨率、帧率、码率、关键帧间隔、镜像和方向等。通过 trackType 区分视频轨道和屏幕共享轨道的编码配置。
3.2 编码配置参数
|
参数 |
类型 |
默认值 |
说明 |
|
trackType |
AoqTrackType |
Video(1) |
轨道类型:Video |
|
codecType |
AoqEncoderType |
VideoH264(3) |
编码格式 |
|
width |
int |
720 |
编码宽度 |
|
height |
int |
1280 |
编码高度 |
|
fps |
int |
5 |
编码帧率 |
|
bitrate |
int |
500000 |
目标码率(bps) |
|
minBitrate |
int |
128000 |
最小码率(bps) |
|
keyframeInterval |
int |
2 |
关键帧间隔(秒) |
|
mirrorMode |
AoqMirrorMode |
Disabled(0) |
镜像模式 |
|
orientationMode |
AoqOrientationMode |
Auto(0) |
方向模式 |
|
isExternal |
bool |
false |
外部编码模式(true 时由应用推送已编码帧) |
3.3 编码格式枚举
|
枚举值 |
数值 |
说明 |
|
AoqEncoderTypeVideoH264 |
3 |
H.264 编码 |
|
AoqEncoderTypeVideoJpeg |
4 |
JPEG 编码(用于外部编码帧) |
3.4 镜像模式
|
枚举值 |
数值 |
说明 |
|
AoqMirrorModeDisabled |
0 |
禁用镜像 |
|
AoqMirrorModeEnabled |
1 |
启用镜像 |
3.5 方向模式
|
枚举值 |
数值 |
说明 |
|
AoqOrientationModeAuto |
0 |
自动方向 |
|
AoqOrientationModePortrait |
1 |
竖屏方向 |
|
AoqOrientationModeLandscape |
2 |
横屏方向 |
3.6 API 对照
|
功能 |
Android |
iOS |
Ohos |
|
设置编码参数 |
setVideoEncoderConfig(config) |
setVideoEncoderConfig: |
setVideoEncoderConfig(config) |
4. 外部视频帧输入
4.1 功能说明
外部视频帧输入允许应用将自定义的视频帧数据推送到 SDK,用于外部采集或外部编码场景。支持两种推送方式:
-
推送原始帧:将未编码的像素数据(I420/NV12/NV21/BGRA/RGBA 等格式)推送给 SDK,由 SDK 进行编码。
-
推送已编码帧:将已编码的数据(如 JPEG)直推给 SDK,SDK 不做二次编码,直接打包发送。
通过 trackType 路由,AoqTrackTypeVideo 对应视频采集的外部帧,AoqTrackTypeScreen 对应屏幕共享的外部帧。
4.2 像素格式枚举
|
枚举值 |
数值 |
说明 |
平台支持 |
|
AoqVideoPixelFormatI420 |
1 |
I420 三平面 |
全平台 |
|
AoqVideoPixelFormatNV12 |
2 |
NV12 双平面 |
全平台 |
|
AoqVideoPixelFormatNV21 |
3 |
NV21 双平面 |
全平台 |
|
AoqVideoPixelFormatBGRA |
4 |
BGRA 打包 |
全平台 |
|
AoqVideoPixelFormatRGBA |
5 |
RGBA 打包 |
全平台 |
|
AoqVideoPixelFormatCVPixelBuffer |
6 |
Apple 零拷贝 |
仅 iOS |
|
AoqVideoPixelFormatTextureOES |
7 |
OES 纹理 |
仅 Android |
|
AoqVideoPixelFormatTexture2D |
8 |
2D 纹理 |
仅 Android |
4.3 原始视频帧数据结构 (AoqVideoFrame)
|
字段 |
类型 |
说明 |
|
format |
AoqVideoPixelFormat |
像素格式 |
|
width |
int |
宽度(像素) |
|
height |
int |
高度(像素) |
|
data |
byte[] / ArrayBuffer |
打包格式数据(NV12/NV21/BGRA/RGBA) |
|
dataY / dataU / dataV |
byte[] / ArrayBuffer |
I420 三平面数据 |
|
strideY / strideU / strideV |
int |
I420 三平面步长 |
|
textureId |
int |
纹理 ID(Android TextureOES/Texture2D 时有效) |
|
transformMatrix |
float[16] |
4x4 纹理变换矩阵(Android) |
|
eglContext |
EGLContext |
共享 EGL 上下文(Android) |
|
pixelBuffer |
CVPixelBufferRef |
Apple 零拷贝(iOS) |
|
timeStamp |
long |
时间戳(ms),0 时 SDK 用本地时钟补 |
4.4 已编码视频帧数据结构 (AoqVideoEncodedFrame)
|
字段 |
类型 |
默认值 |
说明 |
|
codec |
AoqVideoCodecType |
JPEG(0) |
编码格式 |
|
data |
byte[] / ArrayBuffer |
- |
编码后数据 |
|
width |
int |
- |
宽度(像素) |
|
height |
int |
- |
高度(像素) |
|
timeStamp |
long |
0 |
时间戳(ms) |
4.5 API 对照
|
功能 |
Android |
iOS |
Ohos |
|
推送原始帧 |
pushExternalVideoCapturedFrame(trackType, frame) |
pushExternalVideoCapturedFrame:frame: |
pushExternalVideoCapturedFrame(trackType, frame) |
|
推送已编码帧 |
pushExternalVideoEncodedFrame(trackType, frame) |
pushExternalVideoEncodedFrame:frame: |
pushExternalVideoEncodedFrame(trackType, frame) |
5. 视频帧数据回调
5.1 功能说明
视频帧回调允许开发者在视频管线的不同位置获取原始帧数据,用于视频分析、自定义处理、录制等场景。支持只读和读写两种模式,读写模式下可修改帧数据并写回 SDK。
5.2 支持的数据源位置
|
数据源 |
枚举值 |
说明 |
|
Captured |
0 |
采集后的视频数据(前处理前) |
|
PreEncode |
1 |
编码前的视频数据(前处理后) |
|
Remote |
2 |
远端解码后、渲染前的视频数据 |
5.3 回调配置参数
|
参数 |
类型 |
默认值 |
说明 |
|
format |
AoqVideoPixelFormat |
I420(1) |
期望回调的像素格式 |
|
alignment |
AoqVideoObserverAlignment |
Default(0) |
宽度对齐策略 |
|
mode |
AoqVideoObserverMode |
ReadOnly(0) |
只读(0)/读写(1) 模式 |
|
mirrorApplied |
bool |
false |
是否对回调数据应用镜像 |
5.4 宽度对齐枚举
|
枚举值 |
数值 |
说明 |
|
AoqVideoObserverAlignmentDefault |
0 |
默认对齐 |
|
AoqVideoObserverAlignmentEven |
1 |
2 字节对齐 |
|
AoqVideoObserverAlignment4 |
2 |
4 字节对齐 |
|
AoqVideoObserverAlignment8 |
3 |
8 字节对齐 |
|
AoqVideoObserverAlignment16 |
4 |
16 字节对齐 |
5.5 使用步骤
-
注册观察者:调用
setVideoFrameObserver设置视频帧回调监听器 -
启用数据源:调用
enableVideoFrameObserver选择需要监听的数据源位置,开启回调 -
处理回调数据:在回调函数中获取帧数据(仅回调期间有效,异步使用需自行拷贝)
5.6 API 对照
|
功能 |
Android |
iOS |
Ohos |
|
注册观察者 |
setVideoFrameObserver(listener) |
setVideoFrameObserver: |
setVideoFrameObserver(observer) |
|
启用回调 |
enableVideoFrameObserver(enabled, source, config) |
enableVideoFrameObserver:videoSource:config: |
enableVideoFrameObserver(enabled, source, config) |
5.7 回调方法
|
回调 |
Android |
iOS |
Ohos |
|
采集后数据 |
onCapturedVideoFrame(frame) |
onCapturedVideoFrame: |
onCapturedVideoFrame(frame) |
|
编码前数据 |
onPreEncodeVideoFrame(trackType, frame) |
onPreEncodeVideoFrame:frame: |
onPreEncodeVideoFrame(trackType, frame) |
|
远端数据 |
onRemoteVideoFrame(trackType, frame) |
onRemoteVideoFrame:frame: |
onRemoteVideoFrame(trackType, frame) |
回调方法返回 true/YES 表示数据已修改、需写回 SDK(仅 ReadWrite 模式且 I420 格式时生效)。
7. 媒体流发送控制
7.1 功能说明
控制本地媒体流的发送开关,通过 trackType 路由到不同轨道(Audio/Video/Screen)。停用发送后,采集和编码继续运行,但数据不会发送到远端。
7.2 API 对照
|
功能 |
Android |
iOS |
Ohos |
|
控制流发送 |
enableSendMediaStream(trackType, enable) |
enableSendMediaStream:enable: |
enableSendMediaStream(trackType, enable) |
7.3 轨道类型枚举
|
枚举值 |
数值 |
说明 |
|
AoqTrackTypeAudio |
0 |
音频轨道 |
|
AoqTrackTypeVideo |
1 |
视频轨道 |
|
AoqTrackTypeData |
2 |
数据轨道 |
8. 视频设备状态监控
8.1 功能说明
SDK 自动监测视频采集设备(摄像头)的状态变化,并通过 onVideoDeviceStateChanged 回调通知应用层。
8.2 设备状态码
|
状态码 |
值 |
说明 |
|
AoqVideoDeviceNone |
0 |
初始状态 |
|
AoqVideoDeviceCaptureStarting |
1 |
采集启动中 |
|
AoqVideoDeviceCaptureStarted |
2 |
采集已启动 |
|
AoqVideoDeviceCaptureStopping |
3 |
采集停止中 |
|
AoqVideoDeviceCaptureStopped |
4 |
采集已停止 |
|
AoqVideoDeviceCaptureFail |
5 |
采集失败 |
8.3 回调对照
|
回调 |
Android |
iOS |
Ohos |
|
设备状态变化 |
onVideoDeviceStateChanged(state) |
onVideoDeviceStateChanged: |
onVideoDeviceStateChanged(state) |
9. 视频错误码与警告码
9.1 视频错误码
|
错误码 |
值 |
说明 |
|
AoqErrorCodeVideo |
200 |
通用视频错误 |
|
VideoExternalBufferFull |
210 |
视频外部缓冲区已满 |
|
VideoDevice |
220 |
视频设备通用错误 |
|
CameraOpenFail |
221 |
摄像头打开失败 |
|
CameraAuthFailed |
222 |
摄像头权限被拒绝 |
|
CameraOccupied |
223 |
摄像头被占用 |
|
CameraRunningError |
224 |
摄像头运行错误 |
|
VideoCodec |
230 |
视频编解码通用错误 |
|
EncoderInitFail |
231 |
编码器初始化失败 |
|
VideoRender |
240 |
视频渲染通用错误 |
|
RenderCreateFail |
241 |
渲染器创建失败 |
|
RenderDrawError |
242 |
渲染绘制错误 |
|
Screen |
300 |
屏幕共享通用错误 |
Android 额外错误码:ScreenPermissionDenied(310) 屏幕共享权限被拒绝、ScreenForegroundServiceFailed(311) 前台服务启动失败。
9.2 视频警告码
|
警告码 |
值 |
说明 |
|
AoqWCVideo |
200 |
通用视频警告 |
|
CameraEnumerateError |
201 |
摄像头枚举错误 |
|
EncoderSwitched |
202 |
编码器切换警告 |
|
RenderDowngrade |
203 |
渲染降级警告 |
附录:完整视频 API 方法列表
|
分类 |
方法名 |
说明 |
|
采集控制 |
startVideoCapture |
打开视频采集设备 |
|
采集控制 |
stopVideoCapture |
关闭视频采集设备 |
|
采集控制 |
switchCamera |
切换前后置摄像头 |
|
渲染控制 |
setLocalView |
设置本地预览窗口 |
|
渲染控制 |
setRemoteView |
设置远端渲染窗口 |
|
编解码 |
setVideoEncoderConfig |
设置视频编码参数 |
|
外部输入 |
pushExternalVideoCapturedFrame |
推送原始视频帧 |
|
外部输入 |
pushExternalVideoEncodedFrame |
推送已编码视频帧 |
|
屏幕共享 |
startScreenCapture |
启动屏幕采集 |
|
屏幕共享 |
stopScreenCapture |
停止屏幕采集 |
|
流控制 |
enableSendMediaStream |
控制媒体流发送 |
|
帧回调 |
setVideoFrameObserver |
注册视频帧观察者 |
|
帧回调 |
enableVideoFrameObserver |
启用/禁用视频帧回调 |