# 修改原始视频数据
# 简介
原始视频数据,又称视频裸数据,是指音视频传输过程中获取到的纯视频数据。常见的原始视频数据格式为 RGB 和 YUV420。这些视频采样数据经过视频编码压缩成为视频码流,从而降低视频的数据量,便于存储和传输。
菊风提供修改原始视频数据的功能。当有自行处理视频数据的需求时,您可以在将采集到的视频数据进行处理;也可以将即将渲染的数据进行处理。
# 前提条件
在修改原始视频数据前,确保已经初始化了 JCMediaDevice 模块。
# 集成步骤
- 创建 JCVideoFrameCallbackImpl 遵守 JCVideoFrameCallback 协议。重写 onVideoCaptureFrame, onVideoRenderFrame 接口。
- 重写 onVideoCaptureFrame (opens new window) 回调函数获取采集的视频数据并处理。
- 重写 onVideoRenderFrame (opens new window) 回调函数获取渲染的视频数据并处理。
- 在开始通话前调用 registerVideoFrameCallback (opens new window) 。在该函数中实例化回调接口 JCVideoFrameCallback。
- 发起通话或者加入频道。
- 在收到 onLeave (opens new window) 或 onStop (opens new window) 或 onCallItemRemove (opens new window) 后调用 registerVideoFrameCallback (opens new window) ,传入
null
来释放语音观测器对象。
# 示例代码
// 创建 JCVideoFrameCallbackImpl 遵守 JCVideoFrameCallback 协议。
// 实现 onVideoCaptureFrame, onVideoRenderFrame 接口。
@interface JCVideoFrameCallbackImpl : NSObject <JCVideoFrameCallback>
@end
/**
* 获得采集的视频
*
* @param captureId 采集源id
* @param face 镜头朝向
* - JCMediaDeviceCameraTypeFront 前置摄像头
* - JCMediaDeviceCameraTypeBack 后置摄像头
* @param imageAngle 图像正立所需角度
* @param captureOrient 镜头固定角度
* @param width 图像宽
* @param height 图像高
* @param buf 图像数据
*/
- (void)onVideoCaptureFrame:(NSString *_Nonnull)captureId
face:(JCMediaDeviceCameraType)face
imageAngle:(int)imageAngle
captureOrient:(int)captureOrient
width:(int*_Nonnull)width
height:(int*_Nonnull)height
buf:(unsigned char *_Nonnull)buf;
/**
* 获得播放的视频
*
* @param renderId 渲染id
* @param sourceType 视频源类型
* - JCMediaDeviceVideoSourcePeer 用户
* - JCMediaDeviceVideoSourceCapture 采集设备
* - JCMediaDeviceVideoSourceFile 文件
* @param angle 图像正立所需角度
* @param mirror 镜像类型
* - JCMediaDeviceMirrorNone 不镜像
* - JCMediaDeviceMirrorHorizontal 水平方向镜像
* - JCMediaDeviceMirrorVertical 竖直方向镜像
* - JCMediaDeviceMirrorAuto 自动选择
* - JCMediaDeviceMirrorFromLeft 转场动画,从左侧翻转
* - JCMediaDeviceMirrorFromTop 转场动画,从上侧翻转
* @param width 图像宽
* @param height 图像高
* @param buf 图像数据
* @param timeStamp 渲染时间戳
*/
- (void)onVideoRenderFrame:(NSString *_Nonnull)renderId
sourceType:(JCMediaDeviceVideoSource)sourceType
angle:(int)angle
mirror:(JCMediaDeviceMirror)mirror
width:(int*_Nonnull)width
height:(int*_Nonnull)height
buf:(unsigned char *_Nonnull)buf
timeStamp:(unsigned long)timeStamp;
// 创建 JCVideoFrameCallbackImpl 实例对象
JCVideoFrameCallbackImpl *callback = [[JCVideoFrameCallbackImpl alloc] init];
// 设置视频数据监听
[_mediaDevice registerVideoFrameCallback:callback];
// 取消视频数据监听
[_mediaDevice registerVideoFrameCallback:nil];