视频传输过程中,我们可以对采集到的视频数据进行前处理和后处理,获取想要的播放效果。
对于有自行处理视频数据需求的场景,Agora 提供原始数据功能,你可以在将数据发送给编码器前进行前处理,对捕捉到的视频帧进行修改;也可以在将数据发送给解码器后进行后处理,对接收到的视频帧进行修改。
Agora Unity SDK 通过提供 VideoRawDataManager
类,实现采集、修改原始视频数据功能。
在使用原始视频数据功能前,请确保你已在项目中完成基本的实时视频功能,详见实现视频通话或实现视频直播。
参考如下步骤,在你的项目中实现原始视频数据功能:
选择如下任意一种方式注册视频观测器:
EnableVideoObserver
注册视频观测器。此方法通常用于 SDK 采集和渲染。选择此方法后,若需注销视频观测器,确保在离开频道后调用 DisableVideoObserver
。RegisterVideoRawDataObserver
注册视频观测器。此方法通常用于自采集和渲染。选择此方法后,若需注销视频观测器,调用 UnRegisterVideoRawDataObserver
。成功注册后,根据需求调用以下方法:
SetOnCaptureVideoFrameCallback
监听 OnCaptureVideoFrameHandler
回调。SDK 会在捕捉到每个本地视频帧时通过 OnCaptureVideoFrameHandler
回调向用户发送采集到的原始视频数据。SetOnRenderVideoFrameCallback
监听 OnRenderVideoFrameHandler
回调。SDK 会在捕捉到每个远端视频帧时通过 OnRenderVideoFrameHandler
回调向用户发送接收到的原始视频数据。用户拿到原始视频数据后,根据场景需要自行处理。
选择如下任意一种方式注销视频观测器:
DisableVideoObserver
注销视频观测器。UnRegisterVideoRawDataObserver
注销视频观测器。下图展示使用原始视频数据的 API 调用时序:
你可以对照 API 时序图,参考下面的示例代码片段,在项目中实现原始视频数据功能:
void Start()
{
// 初始化 IRtcEngine 对象。
mRtcEngine = IRtcEngine.GetEngine(mVendorKey);
// 获取 VideoRawDataManager 对象。
videoRawDataManager = VideoRawDataManager.GetInstance(mRtcEngine);
// 启用视频模块。
mRtcEngine.EnableVideo();
// 启用视频观测器。
mRtcEngine.EnableVideoObserver();
// 监听 OnCaptureVideoFrameHandler delegate。
videoRawDataManager.SetOnCaptureVideoFrameCallback(OnCaptureVideoFrameHandler);
// 监听 OnRenderVideoFrameHandler delegate。
videoRawDataManager.SetOnRenderVideoFrameCallback(OnRenderVideoFrameHandler);
}
// 获取远端发送的视频数据。
void OnRenderVideoFrameHandler(uint uid, VideoFrame videoFrame)
{
Debug.Log("OnRenderVideoFrameHandler");
}
// 获取本地摄像头采集到的视频数据。
void OnCaptureVideoFrameHandler(VideoFrame videoFrame)
{
Debug.Log("OnCaptureVideoFrameHandler");
}
public enum VIDEO_FRAME_TYPE {
FRAME_TYPE_YUV420 = 0,
FRAME_TYPE_RGBA = 1,
};
public struct VideoFrame {
// 视频帧类型。仅支持 FRAME_TYPE_RGBA。
public VIDEO_FRAME_TYPE type;
// 视频像素宽度。
public int width;
// 视频像素高度。
public int height;
// YUV 数据中的 Y 缓冲区的行跨度。
public int yStride;
// RGBA 数据缓冲区。
public byte[] buffer;
// 在渲染视频前设置该帧的顺时针旋转角度,目前支持 0 度、90 度、180 度,和 270 度。
public int rotation;
// 外部音频帧的时间戳。
public long renderTimeMs;
// 预留参数。
public int avsync_type;
};
EnableVideoObserver
/DisableVideoObserver
后,SDK 会自动调用 RegisterVideoRawDataObserver
/UnRegisterVideoRawDataObserver
,无需再次调用。