注意
由于声网视频流每秒回调15次。会触发很多的临时变量生成,为了防止内存爆增,为解码代码添加@autoreleasepool.
视频数据接收处
onCaptureVideoFrame 方法为视频回调原始视频数据
// 获取采集的视频
virtual bool onCaptureVideoFrame(VideoFrame& videoFrame) override
{
std::lock_guard<std::mutex> autolock(m_mtx);
m_mapVideoTick[0] = get_timestamp();
if (!mediaDataPlugin) return true;
@autoreleasepool {
// ScreenShot
AgoraVideoRawData *data = getVideoRawDataWithVideoFrame(videoFrame);
[mediaDataPlugin yuvToUIImageWithVideoRawData:data];
}
return true;
}
其中AgoraVideoRawData是一个YUV的OC对象
@interface AgoraVideoRawData : NSObject
@property (nonatomic, assign) int type;
@property (nonatomic, assign) int width; //width of video frame
@property (nonatomic, assign) int height; //height of video frame
@property (nonatomic, assign) int yStride; //stride of Y data buffer
@property (nonatomic, assign) int uStride; //stride of U data buffer
@property (nonatomic, assign) int vStride; //stride of V data buffer
@property (nonatomic, assign) int rotation; // rotation of this frame (0, 90, 180, 270)
@property (nonatomic, assign) int64_t renderTimeMs; // timestamp
@property (nonatomic, assign) char* yBuffer; //Y da