rtc_plugins/include/MRTCEngineDefine.hpp

2357 lines
91 KiB
C++
Raw Normal View History

2025-04-09 10:34:51 +08:00
#ifndef __RTC_ENGINE_DEFINE_HPP___
#define __RTC_ENGINE_DEFINE_HPP___
#include <memory>
#include <vector>
#ifdef WIN32
#include "MRTCEnginePlatForm.hpp"
#endif
#include <string>
#include <stdarg.h>
#include <math.h>
// namespace
//////////////////////////////////////////////////////////////////////////
#define RTCENGINE_NAMESPACE_BEGIN namespace mrtc {
#define RTCENGINE_NAMESPACE mrtc
#define RTCENGINE_NAMESPACE_END }
// macro WIN32
//////////////////////////////////////////////////////////////////////////
#ifdef WIN32
#ifdef RTCENGINE_DLL
#ifdef RTCENGINE_EXPORTS
#define RTCENGINE_API __declspec(dllexport)
#define RTCENGINE_API_CPP
#else
#define RTCENGINE_API __declspec(dllimport)
#define RTCENGINE_API_CPP
#endif
#else
#define RTCENGINE_API
#define RTCENGINE_API_CPP
#endif
#elif defined(__ANDROID__)
#define RTCENGINE_API
#define RTCENGINE_API_CPP __attribute__ ((visibility ("default")))
#else
#define RTCENGINE_API
#define RTCENGINE_API_CPP
#endif
// Macos Or IOS.
//////////////////////////////////////////////////////////////////////////
#ifdef __APPLE__
#include <TargetConditionals.h>
#include <CoreVideo/CoreVideo.h>
#if TARGET_OS_OSX
/// 单元测试现在仅mac可用
#define MRTC_TEST_ABILITY_AVAILABLE 1
#endif
#ifdef __OBJC__
using PixelBufferRef = CVPixelBufferRef;
#else
using PixelBufferRef = void*;
#endif
#endif //__APPLE__
// Disable copy funciton.
#ifndef DELETE_CTOR_COPY
#define DELETE_CTOR_COPY(className) \
className(const className &) = delete; \
className &operator=(const className &) = delete
#endif
// Disable constructor and copy function.
#ifndef DELETE_COPY
#define DELETE_COPY(className) \
className() = default; \
DELETE_CTOR_COPY(className)
#endif
#ifdef WIN32
#define INLINE __forceinline
#else
#define INLINE inline
#endif
#if defined(__ANDROID__)
#include "jni.h"
#endif
RTCENGINE_NAMESPACE_BEGIN
// 回调基函数
class RTCENGINE_API RTCENGINE_API_CPP IMRTCBaseCallBack
{
public:
virtual ~IMRTCBaseCallBack() = default;
};
struct MRTCCustomDataObject final
{
std::string peerId;
uint8_t* data = nullptr;
size_t data_length = 0;
uint64_t delay_time = 0;
};
// 消息回调 引擎异步消息通知
class RTCENGINE_API RTCENGINE_API_CPP IMRTCMessageCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCMessageCallBack);
virtual ~IMRTCMessageCallBack() override = default;
virtual void onCallBackMessage(uint32_t msgId, const char* msg) = 0;
virtual void onCallBackCustomData(MRTCCustomDataObject object) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP IMRTCCallBackMessageNULL final : public IMRTCMessageCallBack
{
public:
DELETE_COPY(IMRTCCallBackMessageNULL);
virtual void onCallBackMessage(uint32_t msgId, const char* mssg) override
{
}
virtual void onCallBackCustomData(MRTCCustomDataObject object) override {
}
};
// 监听类型
enum MRTCListenerType
{
TYPE_LISTENER_ROOM = 0x00, // 房间状态
TYPE_LISTENER_PRODUCER = 0x01, // 生产者状态
TYPE_LISTENER_CONSUMER = 0x02, // 消费者状态
TYPE_LISTENER_DATA_PRODUCER = 0x03, // 数据生产者状态
TYPE_LISTENER_DATA_CONSUMER = 0x04, // 数据消费者状态
TYPE_LISTENER_REPORT_MONITOR = 0x05, // 报告监控回调消息
TYPE_LISTENER_DEVICE_MONITOR = 0x06, // 设备变动回调消息
TYPE_LISTENER_REPORT_STATISTICS = 0x07, // 回调音视频质量数据
TYPE_LISTENER_RTM_ROOM = 0x08, // RTM 房间状态
TYPE_LISTENER_REPORT_NETWORKING_STATUS = 0x09, // 回调网络状态
};
// 视频回调类型
enum MRTCVideoListenerType
{
TYPE_CAMERA_PRODUCER = 0x00, // 摄像头生产者
TYPE_SCREEN_PRODUCER, // 屏幕分享生产者
TYPE_CAMERA_CONSUMER, // 摄像头消费者
TYPE_SCREEN_CONSUMER, // 屏幕分享消费者
TYPE_FILE_VIDEO_PRODUCER, // 视频分享的视频生产者
TYPE_FILE_VIDEO_CONSUMER, // 视频分享的视频消费者
TYPE_CUSTOM_VIDEO_PRODUCER, // 自定义视频生产者
TYPE_CUSTOM_VIDEO_CONSUMER, // 自定义视频消费者
TYPE_CUSTOM_SECOND_VIDEO_PRODUCER, // 自定义第二路视频生产者
TYPE_CUSTOM_SECOND_VIDEO_CONSUMER, // 自定义第二路视频消费者
TYPE_CUSTOM_RAW_VIDEO_CONSUMER, // 自定义编码后视频消费者
};
// 视频数据格式
enum MRTCVideoDataType
{
TYPE_VIDEO_I420,
TYPE_VIDEO_ARGB,
};
enum MRTCVideoEncodedCodecType
{
TYPE_VIDEO_H264,
TYPE_VIDEO_H265
};
// 视频裸数据格式
enum MRTCVideoRawDataType
{
TYPE_VIDEO_RAW_H264,
TYPE_VIDEO_RAW_H265,
};
enum MRTCVideoEncodedFrameType
{
TYPE_VIDEO_FRAME_I,
TYPE_VIDEO_FRAME_P,
TYPE_VIDEO_FRAME_B
};
// 视频类型
enum MRTCVideoSourceType
{
TYPE_VIDEO_SOURCE_NONE = 0x00,
TYPE_VIDEO_SOURCE_CAMERA = 0x01, // 摄像头
TYPE_VIDEO_SOURCE_SCREEN = 0x02, // 屏幕分享
TYPE_VIDEO_SOURCE_VIDEO = 0x03, // 视频文件
TYPE_VIDEO_SOURCE_CUSTOM = 0x04, // 外部传入视频
TYPE_VIDEO_SOURCE_CUSTOM_SECOND = 0x05, // 外部传入第二路视频
TYPE_VIDEO_SOURCE_RAW = 0x06, // 外部传入裸视频流
};
// 音频类型
enum MRTCAudioSourceType
{
TYPE_AUDIO_SOURCE_NONE = 0x00,
TYPE_AUDIO_SOURCE_MIC = 0x01, // 麦克风
TYPE_AUDIO_SOURCE_DESKTOP = 0x02, // 桌面音频
TYPE_AUDIO_SOURCE_MUSIC = 0x03, // 背景音乐
TYPE_AUDIO_SOURCE_VIDEO = 0x04, // 视频分享
TYPE_AUDIO_SOURCE_EFFECT = 0x05, // 音频特效
TYPE_AUDIO_SOURCE_CUSTOM = 0x06, // 外部传入音频
TYPE_AUDIO_SOURCE_CUSTOM_DATA = 0x07, // dataChannel通道传入音频数据
};
// 自定义视频通道id
enum MRTCPublishChannel {
MRTCPublishChannelOne = 0x00,
MRTCPublishChannelTwo = 0x01,
};
// 视频流类型
enum MRTCVideoStreamType
{
TYPE_VIDEO_STREAM_DEFAULT = 0x00, // 默认自适应
TYPE_VIDEO_STREAM_SMALL = 0x01, // 小流
TYPE_VIDEO_STREAM_BIG = 0x02, // 大流
};
struct MRTCRoomStatus final
{
DELETE_COPY(MRTCRoomStatus);
char reason[256] = { 0 };
};
// 房间回调类型
enum MRTCRoomStatusType
{
TYPE_STATUS_ROOM_JOIN = 0x00, // 进入房间
TYPE_STATUS_ROOM_LEAVE = 0x01, // 离开房间
TYPE_STATUS_ROOM_RECONNECT_BEGIN = 0x02,// 重连开始
TYPE_STATUS_ROOM_RECONNECT_END = 0x03, // 重连结束
TYPE_STATUS_ROOM_RECONNECT_FAILED = 0x04,// 重连失败
TYPE_STATUS_ROOM_CLEAR_USER_LIST = 0x05,// 清理房间用户列表 和 视频窗口
TYPE_EVENT_ROOM_JOIN_FAILED = 0x06, // 加入房间失败
TYPE_STATUS_ROOM_REJOIN_CONNECT_BEGIN = 0x07,// ReJoin重连开始
TYPE_STATUS_ROOM_REJOIN_CONNECT_END = 0x08, // ReJoin重连结束
TYPE_STATUS_ROOM_REJOIN_CONNECT_FAILED = 0x09,// ReJoin重连失败
TYPE_STATUS_ROOM_CLOSE_CONFIRM = 0x0A, // 房间关闭
TYPE_STATUS_ROOM_USER_KICKED_OUT = 0x0B, // 用户被踢
TYPE_STATUS_ROOM_PEER_LIST = 0x0C, // 加入房间时,房间内已有有用户列表
};
// 房间回调类型
enum MRTMRoomStatusType
{
TYPE_STATUS_RTM_ROOM_JOIN = 0x00, // 进入房间
TYPE_STATUS_RTM_ROOM_LEAVE = 0x01, // 离开房间
TYPE_STATUS_RTM_ROOM_RECONNECT_BEGIN = 0x02,// 重连开始
TYPE_STATUS_RTM_ROOM_RECONNECT_END = 0x03, // 重连结束
TYPE_STATUS_RTM_ROOM_RECONNECT_FAILED = 0x04,// 重连失败
TYPE_STATUS_RTM_ROOM_CLEAR_USER_LIST = 0x05,// 清理房间用户列表 和 视频窗口
TYPE_EVENT_RTM_ROOM_JOIN_FAILED = 0x06, // 加入房间失败
TYPE_STATUS_RTM_ROOM_REJOIN_CONNECT_BEGIN = 0x07,// ReJoin重连开始
TYPE_STATUS_RTM_ROOM_REJOIN_CONNECT_END = 0x08, // ReJoin重连结束
TYPE_STATUS_RTM_ROOM_REJOIN_CONNECT_FAILED = 0x09,// ReJoin重连失败
TYPE_STATUS_RTM_ROOM_CLOSE_CONFIRM = 0x0A, // 房间关闭
TYPE_ROOM_USER_LIST_RESULT = 0x0B, // 用户列表
};
// 消费者回调类型
enum MRTCConsumerStatusType
{
// Consumer Start Or Stop
TYPE_STATUS_CONSUMER_START = 0x00, // 消费者开始 若是视频Consumer此处需注册视频显示回调窗口
TYPE_STATUS_CONSUMER_STOP, // 消费者停止
TYPE_STATUS_CONSUMER_PAUSE, // 消费者暂停状态
TYPE_STATUS_CONSUMER_RESUME, // 消费者继续状态
TYPE_STATUS_CONSUMER_LAYERS_CHANGE, // 消费者分层信息改变
TYPE_STATUS_CONSUMER_SCORE, // 消费者视频得分
TYPE_STATUS_CONSUMER_ACTIVE_SPEAKER, // 消费者麦克强度信息
// Data Consumer Start Or Stop
TYPE_STATUS_DATA_CONSUMER_START, // 数据消费者开启
TYPE_STATUS_DATA_CONSUEMR_STOP, // 数据消费者关闭
// User Join Or Leave
TYPE_STATUS_USER_JOIN, // 用户加入房间
TYPE_STATUS_USER_LEAVE, // 用户离开房间
TYPE_STATUS_USER_DISPLAYNAME_CHAGE, // DisplayName改变
};
// 生产者回调类型
enum MRTCProducerStatusType
{
TYPE_PRODUCER_STATUS_SCORE, // 生产者视频得分
TYPE_PRODUCER_STATUS_SUCCESS, // 生产者开启成功
TYPE_PRODUCER_STATUS_FAILURE, // 生产者开启失败
TYPE_PRODUCER_STATUS_FORBIDDEN, // 生产者被禁止
TYPE_PRODUCER_STATUS_RESUMED, // 生产者被回复
};
// 设备监控类型
enum MRTCDeviceMonitorType
{
TYPE_DEVICE_AUDIO_CAPTURE_CHANGED, // 音频采集设备状态改变
TYPE_DEVICE_AUDIO_RENDER_CHANGED, // 音频播放设备状态改变
TYPE_DEVICE_AUDIO_CAPTURE_ADD, // 音频采集设备新增
TYPE_DEVICE_AUDIO_CAPTURE_REMOVE, // 音频采集设备移除
TYPE_DEVICE_AUDIO_RENDER_ADD, // 音频播放设备新增
TYPE_DEVICE_AUDIO_RENDER_REMOVE, // 音频播放设备移除
TYPE_DEVICE_VIDEO_CAPTURE_CHANGED, // 视频设备状态改变
TYPE_DEVICE_VIDEO_CAPTURE_ADD, // 视频采集设备新增
TYPE_DEVICE_VIDEO_CAPTURE_REMOVE, // 视频采集设备移除
};
// 房间用户回调信息
struct MRTCRoomUserInfo final
{
//DELETE_COPY(MRTCRoomUserInfo);
char deviceFlag[256] = { 0 };
char deviceName[256] = { 0 };
char deviceVersion[256] = { 0 };
char displayName[256] = { 0 };
char userId[256] = { 0 };
char roomId[256] = { 0 };
};
struct MRTCRoomInfo final {
char roomId[256] = { 0 };
char displayName[256] = { 0 };
char userId[256] = { 0 };
// 加入类型会有此参数值
std::vector<MRTCRoomUserInfo> userInfo;
// 部分接口可能会有值
char message[256] = { 0 };
};
// 房间用户回调信息
struct MRTMRoomUserInfo final
{
//DELETE_COPY(MRTCRoomUserInfo);
char displayName[256] = { 0 };
char userId[256] = { 0 };
};
struct MRTMRoomInfo final {
char roomId[256] = { 0 };
// 部分接口可能会有值
char reason[256] = { 0 };
char displayName[256] = { 0 };
char userId[256] = { 0 };
};
// 用户角色
enum MRTCClientRole
{
TYPE_CLIENT_ROLE_ANCHOR, // 主播
TYPE_CLIENT_ROLE_AUDIENCE, // 观众
};
// 房间状态
class RTCENGINE_API RTCENGINE_API_CPP IMRTCRoomCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCRoomCallBack);
virtual ~IMRTCRoomCallBack() override = default;
virtual void onRoom(uint32_t typeId, MRTCRoomInfo& roomInfo) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCRoomNULLCallBack final : public IMRTCRoomCallBack
{
public:
DELETE_COPY(MRTCRoomNULLCallBack);
void onRoom(uint32_t typeId, MRTCRoomInfo& roomInfo) override
{
}
};
// RTM 房间状态
class RTCENGINE_API RTCENGINE_API_CPP IMRTMRoomCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTMRoomCallBack);
virtual ~IMRTMRoomCallBack() override = default;
virtual void onRTMRoom(uint32_t typeId, MRTMRoomInfo& roomInfo) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTMRoomNULLCallBack final : public IMRTMRoomCallBack
{
public:
DELETE_COPY(MRTMRoomNULLCallBack);
void onRTMRoom(uint32_t typeId, MRTMRoomInfo& roomInfo) override
{
}
};
// Producer Score
struct MRTCScoreData final
{
// DELETE_COPY(MRTCScoreData);
char rId[20] = { 0 };
int8_t score = 0;
int32_t ssrc = 0;
};
// TYPE_PRODUCER_STATUS_SCORE
struct MRTCProducerScore final
{
// DELETE_COPY(MRTCProducerScore);
size_t arrayLen = 0;
std::unique_ptr<MRTCScoreData[]> scoreData{ nullptr };
};
// Producer回调数据结构
//TYPE_STATUS_PRODUCER_INFO
struct MRTCProducerInfo final
{
// DELETE_COPY(MRTCProducerInfo);
char producerId[256] = { 0 };
char kind[50] = { 0 };
char peerId[256] = { 0 };
MRTCAudioSourceType audioSourceType = TYPE_AUDIO_SOURCE_NONE;
MRTCVideoSourceType videoSourceType = TYPE_VIDEO_SOURCE_NONE;
// 某个生产者视频得分
MRTCProducerScore score;
uint8_t channelIndex = 0;
char roomId[256] = { 0 };
char streamId[256] = { 0 };
};
// 生产者状态回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCProduerCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCProduerCallBack);
virtual ~IMRTCProduerCallBack() override = default;
virtual void onProducer(uint32_t msgId, MRTCProducerInfo& info) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCProduerNULLCallBack final : public IMRTCProduerCallBack
{
public:
DELETE_COPY(MRTCProduerNULLCallBack);
void onProducer(uint32_t msgId, MRTCProducerInfo& info) override
{
}
};
// 消费者媒体类型
enum MRTCConsumerMediaType
{
TYPE_CONSUMER_MEDIA_AUDIO = 0x00, // 音频
TYPE_CONSUMER_MEDIA_VIDEO = 0x01, // 视频
};
// Consumer 回调数据结构
//TYPE_STATUS_CONSUMER_INFO
struct MRTCConsumerInfo final
{
// DELETE_COPY(MRTCConsumerInfo);
char producerId[256] = { 0 };
char kind[50] = { 0 };
char type[50] = { 0 };
bool producerPaused;
char consumerId[256] = { 0 };
char roomId[256] = { 0 };
const char* m_customDataParam = nullptr;
const char* m_streamID = nullptr;
char displayName[256] = { 0 };
// 需要默认值,否则部分情况下解析有异常
MRTCConsumerMediaType mediaType = TYPE_CONSUMER_MEDIA_AUDIO;
MRTCAudioSourceType audioSourceType = TYPE_AUDIO_SOURCE_NONE;
MRTCVideoSourceType videoSourceType = TYPE_VIDEO_SOURCE_NONE;
// 某个消费者分层信息改变
int spatiaLayer;
int temporalLayer;
// 某个消费者视频得分
int8_t producerScore;
int8_t score;
uint8_t channelIndex = 0;
char m_extraParam[521] = { 0 };
};
// 消费者状态回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCConsumerCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCConsumerCallBack);
virtual ~IMRTCConsumerCallBack() override = default;
virtual void onConsumer(uint32_t msgId, const char* roomId, const char* peerId, MRTCConsumerInfo& consumerInfo) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCConsumerNULLCallBack final : public IMRTCConsumerCallBack
{
public:
DELETE_COPY(MRTCConsumerNULLCallBack);
void onConsumer(uint32_t msgId, const char* roomId, const char* peerId, MRTCConsumerInfo& consumerInfo) override
{
}
};
// 数据生产者回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCDataProduerCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCDataProduerCallBack);
virtual ~IMRTCDataProduerCallBack() override = default;
virtual void onDataProducer(uint32_t msgId, void* param) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCDataProduerNULLCallBack final : public IMRTCDataProduerCallBack
{
public:
DELETE_COPY(MRTCDataProduerNULLCallBack);
void onDataProducer(uint32_t msgId, void* param) override
{
}
};
// 数据消费者回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCDataConsumerCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCDataConsumerCallBack);
virtual ~IMRTCDataConsumerCallBack() override = default;
virtual void onDataConsumer(uint32_t msgId, const char* userId, void* param) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCDataConsumerNULLCallBack final : public IMRTCDataConsumerCallBack
{
public:
DELETE_COPY(MRTCDataConsumerNULLCallBack);
void onDataConsumer(uint32_t msgId, const char* userId, void* param) override
{
}
};
// 权限请求回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCRequestCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCRequestCallBack);
virtual ~IMRTCRequestCallBack() override = default;
virtual void onRequest() = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP IMRTCRequestCallBackNULL final : public IMRTCRequestCallBack
{
public:
DELETE_COPY(IMRTCRequestCallBackNULL);
void onRequest() override
{
}
};
// 音频数据帧
struct MRTCAudioFrame final
{
// DELETE_COPY(MRTCAudioFrame);
int16_t* data = nullptr;
int dataCount = 0;
int sampleRate = 48000;
int numChannels = 1;
int channelIndex = 0;
};
// 视频帧数据
struct MRTCVideoFrame final
{
// DELETE_COPY(MRTCVideoFrame);
MRTCVideoDataType dataType;
uint8_t* data = nullptr;
uint8_t* datau = nullptr;
uint8_t* datav = nullptr;
int width = 0;
int height = 0;
int rotation = 0;
void* extra = nullptr;
int64_t timestampus = 0;
char szInternalSeiInfo[2048] = {0};
char szExternalSeiInfo[2048] = { 0 };
uint8_t channelIndex = 0;
#ifdef __APPLE__
PixelBufferRef pixelBufferRef;
#endif
#ifdef __ANDROID__
jobject androidVideoFrameBuffer;
#endif
#ifdef __LINUX__
#endif
};
struct MRTCVideoEncodedFrame final
{
DELETE_COPY(MRTCVideoEncodedFrame);
MRTCVideoEncodedCodecType codecType;
uint8_t* data = nullptr; //回调返回后, data会被释放,避免指向此内存
uint32_t size = 0;
int width = 0;
int height = 0;
bool isKeyFrame = false;
int64_t timestampus = 0;
uint8_t channelIndex = 0;
};
// 视频帧数据
struct MRTCRawVideoFrame final
{
DELETE_COPY(MRTCRawVideoFrame);
MRTCVideoRawDataType dataType;
uint8_t* data = nullptr;
int len = 0;
int width = 0;
int height = 0;
int64_t timestampus = 0;
uint8_t channelIndex = 0;
};
// 渲染模式
enum MRTCRenderModeType
{
TYPE_RENDER_MODE_SCALE_ASPECTFIT = 0x00, ///< 等比缩放,可能有黑边
TYPE_RENDER_MODE_SCALE_ASPECTFILL = 0x01, ///< 等比缩放填充整View可能有部分被裁减
TYPE_RENDER_MODE_SCALE_TO_FILL = 0x02, ///< 填充整个View
};
// 视频窗口View
struct MRTCVideoView final
{
void* hWnd = nullptr; // windows窗口句柄
uint8_t channelIndex = 0;
char roomId[256] = { 0 };
MRTCRenderModeType eRenderMode = TYPE_RENDER_MODE_SCALE_ASPECTFIT; //渲染模式
};
// Video Render数据回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCVideoRenderCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCVideoRenderCallBack);
virtual ~IMRTCVideoRenderCallBack() override = default;
virtual void onRender(const char* roomId, const char* peerId, MRTCVideoSourceType sourceType, const MRTCVideoFrame& videoFrame) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCVideoRenderNULLCallBack final : public IMRTCVideoRenderCallBack
{
public:
DELETE_COPY(MRTCVideoRenderNULLCallBack);
void onRender(const char* roomId, const char* peerId, MRTCVideoSourceType sourceType, const MRTCVideoFrame& videoFrame) override
{
}
};
// 远端视频编码数据回调
class RTCENGINE_API IMRTCRemoteEncodedVideoCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCRemoteEncodedVideoCallBack);
virtual ~IMRTCRemoteEncodedVideoCallBack() override = default;
virtual void onRemoteVideoEncodedData(const char* roomId, const char* userId, MRTCVideoSourceType sourceType, const MRTCVideoEncodedFrame& videoEncodedFrame) = 0;
};
// 报告监控信息回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCReportMonitorCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCReportMonitorCallBack);
virtual ~IMRTCReportMonitorCallBack() override = default;
virtual void onReportMonitorData(const char* key, const char* value) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCReportMonitoNULLCallBack final : public IMRTCReportMonitorCallBack
{
public:
DELETE_COPY(MRTCReportMonitoNULLCallBack);
void onReportMonitorData(const char* key, const char* value) override
{
}
};
// 设备监控信息回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCDeviceMonitorCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCDeviceMonitorCallBack);
virtual ~IMRTCDeviceMonitorCallBack() override = default;
virtual void onDeviceMonitorData(MRTCDeviceMonitorType type, void* param) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCDeviceMonitorNULLCallBack final : public IMRTCDeviceMonitorCallBack
{
public:
DELETE_COPY(MRTCDeviceMonitorNULLCallBack);
virtual void onDeviceMonitorData(MRTCDeviceMonitorType type, void* param) override
{
}
};
// 音量声浪值回调
class RTCENGINE_API IMRTCReceivedAudioInfoCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCReceivedAudioInfoCallBack);
virtual ~IMRTCReceivedAudioInfoCallBack() override = default;
virtual void onSoundLevelUpdate(const char* roomId, const char* peerId, uint16_t audioSourceType,uint8_t channelIndex, uint16_t volume, int32_t vad) = 0;
virtual void onAudioProcess(const char* roomId, const char* peerId, MRTCAudioFrame& audioFrame, MRTCAudioSourceType audioSourceType) = 0;
};
class MRTCAudioReceiveNULLCallBack final : public IMRTCReceivedAudioInfoCallBack
{
public:
DELETE_COPY(MRTCAudioReceiveNULLCallBack);
virtual void onSoundLevelUpdate(const char* roomId, const char* peerId, uint16_t audioSourceType,uint8_t channelIndex, uint16_t volume, int32_t vad) override
{
}
virtual void onAudioProcess(const char* roomId, const char* peerId, MRTCAudioFrame& audioFrame, MRTCAudioSourceType audioSourceType) override
{
}
};
// 背景音乐进度回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCMusicProcessCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCMusicProcessCallBack);
virtual ~IMRTCMusicProcessCallBack() override = default;
virtual void onMusicProcess(uint64_t pos, uint64_t totalTime) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP IMRTCMusicProcessNULLCallBack final : public IMRTCMusicProcessCallBack
{
public:
DELETE_COPY(IMRTCMusicProcessNULLCallBack);
void onMusicProcess(uint64_t pos, uint64_t totalTime) override
{
}
};
// 视频分享进度回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCVideoProcessCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCVideoProcessCallBack);
virtual ~IMRTCVideoProcessCallBack() override = default;
virtual void onVideoProcess(uint64_t pos, uint64_t totalTime) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP IMRTCVideoProcessNULLCallBack final : public IMRTCVideoProcessCallBack
{
public:
DELETE_COPY(IMRTCVideoProcessNULLCallBack);
void onVideoProcess(uint64_t pos, uint64_t totalTime) override
{
}
};
// 音效播放器回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCAudioEffectCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCAudioEffectCallBack);
virtual ~IMRTCAudioEffectCallBack() override = default;
virtual void onAudioEffectProcess(int32_t audioEffectID, uint64_t pos, uint64_t totalTime) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP IMRTCAudioEffectNULLCallBack : public IMRTCAudioEffectCallBack
{
public:
DELETE_COPY(IMRTCAudioEffectNULLCallBack);
virtual ~IMRTCAudioEffectNULLCallBack() override = default;
virtual void onAudioEffectProcess(int32_t audioEffectID, uint64_t pos, uint64_t totalTime) override
{
}
};
// 音效播放器加载资源回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCAudioEffectLoadResourceCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCAudioEffectLoadResourceCallBack);
virtual ~IMRTCAudioEffectLoadResourceCallBack() override = default;
virtual void onLoadResourceProcess(int32_t audioEffectID, uint32_t process, int32_t errorCode) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP IMRTCAudioEffectLoadResourceNULLCallBack : public IMRTCAudioEffectLoadResourceCallBack
{
public:
DELETE_COPY(IMRTCAudioEffectLoadResourceNULLCallBack);
virtual ~IMRTCAudioEffectLoadResourceNULLCallBack() override = default;
virtual void onLoadResourceProcess(int32_t audioEffectID, uint32_t process, int32_t errorCode) override
{
}
};
// 数据结构
//////////////////////////////////////////////////////////////////////////
// 音效播放器配置
struct MRTCAudioEffectPlayConfig final
{
};
// 引擎配置
struct MRTCEngineConfig final
{
char applicationId[256] = { 0 };
char appSecrectKey[256] = { 0 };
char domain[256] = { 0 };
unsigned short port;
int nMaxTries = -1;
int nFactor = 2;
int nMinTimeout = 1000;
int nMaxTimeout = 8 * 1000;
};
// 登录授权
struct MRTCJoinAuthority final
{
//DELETE_COPY(MRTCJoinAuthority);
char applicationId[256] = { 0 };
char appSecretKey[256] = { 0 };
char token[256] = { 0 };
long long startTime = 0 ;
long expiredTime = 0;
// V2鉴权参数
char invokeRoomId[256] = "null";
long invokeStartTs = 0;
int invokeExpireTime = 10;
};
// 协议类型
enum MRTCProtocolType
{
TYPE_PROTOCOL_INVALID = 0x00,
TYPE_PROTOCOL_WEBSOCKET = 0x01,
TYPE_PROTOCOL_SOCKETIO = 0x02,
TYPE_PROTOCOL_DATACHANNEL = 0x03,
};
// RTC場景类型
enum MRTCSceneType
{
SCENE_MEETING = 0x00, // 会议场景
SCENE_LIVESTREAM = 0x01, // 直播场景
};
// 强制视频类型
enum MRTCForceVideoType
{
TYPE_FORCE_DEFAULT = 0x00,
TYPE_FORCE_H264 = 0x01,
};
// 登录参数配置
constexpr auto STREAM_LEVEL_DEFAULT_VALUE = 3;
struct MRTCJoinConfig final
{
int streamLeavel = STREAM_LEVEL_DEFAULT_VALUE;
MRTCForceVideoType forceType = TYPE_FORCE_DEFAULT; //废弃
MRTCProtocolType protocolType = TYPE_PROTOCOL_INVALID;
MRTCSceneType rtcScene = MRTCSceneType::SCENE_MEETING;
MRTCClientRole clientRole = MRTCClientRole::TYPE_CLIENT_ROLE_ANCHOR;
bool audioChannelsStereo = false;
bool enablePlayout = true;
char m_nUrlConnectTs[50] = { 0 };
bool enableFec = false; // 是否开启fec默认开启后会关闭大小流目前两路流不支持同时fec
bool enableRobot = false; // 是否为机器人默认为false。机器人加入房间不会被其他用户看到用于拨测、审核等特殊场景
#if defined(__APPLE__) && TARGET_OS_IPHONE
bool useMediaVolume = false; // 使用媒体音量 (默认false 使用通话音量) 【如果设置过-setAlwaysDisableMediaVolum:为true此功能失效】
bool reduceOthersVolume = false; // 是否压低其它音量 (默认true)
#endif
};
struct MRTMJoinConfig final
{
MRTCProtocolType protocolType = TYPE_PROTOCOL_INVALID;
char m_nUrlConnectTs[50] = {0};
};
enum AecFilterLength {
kNormal, //(Default) 48ms for normal environment.
kLong, //200ms for reverberant environment.
kLongest //480ms for highly reverberant environment.
};
enum AnsSuppressionMode {
kMild, //(Default) Low suppression level with only statistical ns enabled.
kModerate, //Moderate suppression level with both statistical and ai ns enabled.
kAggressive //High suppression level with both statistical and ai ns enabled.
};
enum MRTCAudioEncodeType
{
MRTCAudioEncodeAac = 0x00,
MRTCAudioEncodeOpus = 0x01,
};
// 音频参数
struct MRTCAudioOption
{
uint32_t sampleRate = 48000;
uint8_t channel = 2;
bool echoCancellation = true;
bool autoGain = true;
bool highPass = true;
bool noiseSuppression = true;
bool experAgc = true;
bool experNS = true;
bool bReconnectRecoverSharedAudio = false;
char streamID[256] = { 0 };
MRTCAudioSourceType sourceType = TYPE_AUDIO_SOURCE_NONE;
// 通道号pugc linux 在使用时channelIndex从1开始0预留给类前端外部采集封装接口
uint8_t channelIndex = 0;
// 推流房间号
char dstRoomId[256] = { 0 };
bool externalProcess = false; //使用独立的3A处理
// bool enableAudioDump = false; //打开音频文件pcm存储
// char dumpPath[512] = { 0 }; //音频文件存储路径
AecFilterLength aecOption = kNormal; //独立3A处理的回声消除参数
AnsSuppressionMode ansOption = kMild; //独立3A处理的智能降噪参数
MRTCAudioEncodeType audioEncodeType = MRTCAudioEncodeOpus;
char extraParam[256] = { 0 }; // 额外参数
};
struct MRTCSuperResolutionOption
{
char peerId[256] = { 0 };
bool enable = false;
MRTCVideoSourceType sourceType = TYPE_VIDEO_SOURCE_NONE;
};
// 硬件设备类型
enum MRTCMediaDeviceType
{
TYPE_HW_AUDIO_MICROPHONE = 0x00, // 麦克风
TYPE_HW_AUDIO_SPEAKER = 0x01, // 扬声器
TYPE_HW_VIDEO_CAMERA = 0x02, // 摄像头
};
// 屏幕分享类型
enum MRTCScreenShareType
{
TYPE_SHARE_SCREEN = 0x01, // 屏幕分享
TYPE_SHARE_WINDOW = 0x02, // 分享窗口
};
// 编码画质等级
enum MRTCVideoEncodeQuality
{
DEFAULT_VIDEO_ENCODE_QUALITY = 0x00,
LOW_VIDEO_ENCODE_QUALITY = 0x01,
MEDIUM_VIDEO_ENCODE_QUALITY = 0x02,
HIGH_VIDEO_ENCODE_QUALITY = 0x03,
};
enum MRTCSafeMode {
LIMIT_IP_FREQUENCY = 0x00,// 控制IP请求频次,一分钟两次,原来2s一次可能会降低网络监测敏感度
};
enum MRTCNetworkState
{
MRTCNetworkStateGood = 0,
MRTCNetworkStateNormal,
MRTCNetworkStateBad,
MRTCNetworkStateTerrible,
MRTCNetworkStateInvalid,
};
// 视频参数基类
struct RTCENGINE_API MRTCVideoOption
{
MRTCVideoOption(MRTCVideoSourceType type = TYPE_VIDEO_SOURCE_NONE) { sourceType = type; }
MRTCVideoSourceType sourceType = TYPE_VIDEO_SOURCE_NONE;
int16_t width = 0;
int16_t height = 0;
int16_t fps = 15;
int32_t maxVideoBW = 0;
int32_t minVideoBW = 0;
bool mirror = false;
int32_t startVideoBW = 0;
int32_t noLayersBW = 0;
mutable int16_t numSpatialLayers = 2;
// 控制自适应网络带宽变化引起的分辨率降低至的最小宽高值
int limitMinAdaptResolutionWidth = 0;
int limitMinAdaptResolutionHeight = 0;
// 编码画质等级
MRTCVideoEncodeQuality videoEncodeQuality = MEDIUM_VIDEO_ENCODE_QUALITY;
char streamID[256] = { 0 }; // 推流流ID标识
uint8_t channelIndex = 0; // 通道号
char dstRoomId[256] = { 0 }; // 推流房间号
char extraParam[256] = { 0 }; // 额外参数
int gop = -1; // GOP,单位s
int nVideoType = 0; //0 H264 1 H265
bool isAbsoluteRatio = false;
};
// 打开摄像头推流参数
struct RTCENGINE_API MRTCPublishOption : public MRTCVideoOption
{
MRTCPublishOption() : MRTCVideoOption(TYPE_VIDEO_SOURCE_CAMERA) {}
};
// 打开摄像头预览参数
struct RTCENGINE_API MRTCCameraOption : public MRTCVideoOption
{
MRTCCameraOption() : MRTCVideoOption(TYPE_VIDEO_SOURCE_CAMERA) {}
intptr_t cameraId = -1;
#if defined(__ANDROID__)
jobject pAndroidCameraProxyObj = nullptr; // android业务层代理
#endif
};
// 打开屏幕分享参数
struct RTCENGINE_API MRTCScreenOption final : public MRTCVideoOption
{
MRTCScreenOption() : MRTCVideoOption(TYPE_VIDEO_SOURCE_SCREEN) {}
intptr_t screenOrWindowId = -1;
MRTCScreenShareType type = TYPE_SHARE_SCREEN;
bool bReconnectRecoverSharedScreen = false;
bool enableHighPrecisionCapture = false;//是否开启高精度捕获
bool enableCroppingWindow = false;
bool enableBorder = false;
bool enableCursor = true;
#if defined(__ANDROID__)
jobject pAndroidCameraProxyObj = nullptr; // android业务层代理
#endif
};
// 打开视频文件分享参数
struct RTCENGINE_API MRTCVideoFileOption final : public MRTCVideoOption
{
MRTCVideoFileOption() : MRTCVideoOption(TYPE_VIDEO_SOURCE_VIDEO) {}
};
// 打开自定义视频流参数
struct RTCENGINE_API MRTCCustomVideoOption : public MRTCVideoOption
{
MRTCCustomVideoOption() : MRTCVideoOption(TYPE_VIDEO_SOURCE_CUSTOM) {}
};
// 打开自定义视频流参数
struct RTCENGINE_API MRTCCustomRawVideoOption : public MRTCVideoOption
{
MRTCCustomRawVideoOption() : MRTCVideoOption(TYPE_VIDEO_SOURCE_RAW){}
//int nVideoType = 1; //0 H264 1 V264 2 v265 3 H265
};
// 视频编码参数
struct RTCENGINE_API MRTCVideoEncodeOption : public MRTCVideoOption {
};
struct RTCENGINE_API MRTCMultiRoomOption final
{
char roomId[256] = { 0 };
char authDays[256] = { 0 };
char authCurTime[256] = { 0 };
char sign[256] = { 0 };
bool reconnect = false;
};
//
// To String 方法,使用
//
inline std::string formatString(const char* format, ...) {
va_list args;
va_start(args, format);
int iLen = vsnprintf(nullptr, 0, format, args);
va_end(args);
char* pLogBuffer;
pLogBuffer = reinterpret_cast<char *>(malloc(iLen * 4 + 4));
if (!pLogBuffer) {
return "";
}
pLogBuffer[0] = '\0';
va_start(args, format);
vsnprintf(pLogBuffer, iLen + 1, format, args);
va_end(args);
std::string result = std::string(pLogBuffer);
free(pLogBuffer);
return result;
}
// 音视频质量数据
//////////////////////////////////////////////////////////////////////////
// 本地音频质量数据
struct MRTCLocalAudioStats final
{
char userId[256] = { 0 };
char roomId[256] = { 0 };
char srcRoomId[256] = { 0 };
int audioRtt = 0;
int audioLostRate = 0;
int audioTotalLostRate = 0;
uint8_t channelIndex = 0;
int64_t audioSendbytes = 0;
int64_t audioSendBitrate = 0;
MRTCAudioSourceType audioSourceType = TYPE_AUDIO_SOURCE_NONE;
MRTCNetworkState networkState = MRTCNetworkStateInvalid;
// 20241121 视讯要求新增
double sysCpuUsage = 0;
double appCpuUsage = 0;
int32_t appMemUsage = 0;
int32_t sysMemUsage = 0;
char streamId[256] = { 0 };
std::string ToString(){
return formatString("userId:%s, roomId:%s, srcRoomId:%s, audioRtt:%d, audioLostRate:%d, audioTotalLostRate:%d, channelIndex:%d, audioSendbytes:%lld, audioSendBitrate:%lld, audioSourceType:%d",
userId, roomId, srcRoomId, audioRtt, audioLostRate, audioTotalLostRate, channelIndex, audioSendbytes, audioSendBitrate, audioSourceType);
}
};
// 本地视频质量数据
struct MRTCLocalVideoStats final
{
char userId[256] = { 0 };
char roomId[256] = { 0 };
char srcRoomId[256] = { 0 };
int frameWidth = 0;
int frameHeight = 0;
int videoInputFrameRate = 0;
int videoSendFrameRate = 0;
int videoRtt = 0;
int videoLostRate = 0;
int videoTotalLostRate = 0;
uint8_t channelIndex = 0;
int64_t videoSendbytes = 0;
int64_t videoSendBitrate = 0;
int layerIndex = 0;
MRTCVideoSourceType videoSourceType = TYPE_VIDEO_SOURCE_NONE;
MRTCNetworkState networkState = MRTCNetworkStateInvalid;
// 20241121 视讯要求新增
double_t sysCpuUsage = 0;
double_t appCpuUsage = 0;
int32_t sysMemUsage = 0;
int32_t appMemUsage = 0;
char streamId[256] = { 0 };
std::string ToString() {
return formatString(
"userId:%s, roomId:%s, srcRoomId:%s, videoRtt:%d, videoLostRate:%d, audioTotalLostRate:%d, channelIndex:%d, videoSendbytes:%lld, videoSendBitrate:%lld, videoSourceType:%d, frameWidth:%d, frameHeight:%d, videoInputFrameRate:%d, videoSendFrameRate:%d, layerIndex:%d",
userId, roomId, srcRoomId, videoRtt, videoLostRate, videoTotalLostRate, channelIndex, videoSendbytes, videoSendBitrate, videoSourceType, frameWidth, frameHeight, videoInputFrameRate,
videoSendFrameRate, layerIndex);
}
};
// 远端音频质量数据
struct MRTCRemoteAudioStats final
{
char localUserId[256] = { 0 };
char userId[256] = { 0 };
char roomId[256] = { 0 };
char srcRoomId[256] = { 0 };
int audioRtt = 0;
int audioLostRate = 0;
int audioTotalLostRate = 0;
uint8_t channelIndex = 0;
int64_t audioRecvbytes = 0;
int64_t audioRecvBitrate = 0;
MRTCAudioSourceType audioSourceType = TYPE_AUDIO_SOURCE_NONE;
MRTCNetworkState networkState = MRTCNetworkStateInvalid;
// 20241121 视讯要求新增
double sysCpuUsage = 0;
double appCpuUsage = 0;
int32_t sysMemUsage = 0;
int32_t appMemUsage = 0;
char streamId[256] = { 0 };
std::string ToString(){
return formatString("userId:%s, roomId:%s, srcRoomId:%s, audioRtt:%d, audioLostRate:%d, audioTotalLostRate:%d, channelIndex:%d, audioRecvbytes:%lld, audioRecvBitrate:%lld, audioSourceType:%d",
userId, roomId, srcRoomId, audioRtt, audioLostRate, audioTotalLostRate, channelIndex, audioRecvbytes, audioRecvBitrate, audioSourceType);
}
};
// 远端视频质量数据
struct MRTCRemoteVideoStats final
{
char localUserId[256] = { 0 };
char userId[256] = { 0 };
char roomId[256] = { 0 };
char srcRoomId[256] = { 0 };
int frameWidth = 0;
int frameHeight = 0;
int videoRecvFrameRate = 0;
int videoRtt = 0;
int videoLostRate = 0;
int videoTotalLostRate = 0;
uint8_t channelIndex = 0;
int64_t videoRecvbytes = 0;
int64_t videoRecvBitrate = 0;
long videoReceiveDelayMs = 0;
MRTCVideoSourceType videoSourceType = TYPE_VIDEO_SOURCE_NONE;
MRTCNetworkState networkState = MRTCNetworkStateInvalid;
// 20241121 视讯要求新增
double sysCpuUsage = 0;
double appCpuUsage = 0;
int32_t appMemUsage = 0;
int32_t sysMemUsage = 0;
char streamId[256] = { 0 };
std::string ToString(){
return formatString(
"userId:%s, roomId:%s, srcRoomId:%s, videoRtt:%d, videoLostRate:%d, audioTotalLostRate:%d, channelIndex:%d, videoRecvbytes:%lld, videoRecvBitrate:%lld, videoSourceType:%d, frameWidth:%d, frameHeight:%d, videoRecvFrameRate:%d, videoReceiveDelayMs:%ld",
userId, roomId, srcRoomId, videoRtt, videoLostRate, videoTotalLostRate, channelIndex, videoRecvbytes, videoRecvBitrate, videoSourceType, frameWidth, frameHeight, videoRecvFrameRate,
videoReceiveDelayMs);
}
};
// 音视频质量数据回调
class RTCENGINE_API RTCENGINE_API_CPP IMRTCStatisticsCallBack : virtual public IMRTCBaseCallBack
{
public:
DELETE_COPY(IMRTCStatisticsCallBack);
virtual ~IMRTCStatisticsCallBack() override = default;
// 本地音频质量回调
virtual void onLocalAudioStats(MRTCLocalAudioStats& stats) = 0;
// 本地视频质量回调
virtual void onLocalVideoStats(MRTCLocalVideoStats& stats) = 0;
// 远端音频质量回调
virtual void onRemoteAudioStats(MRTCRemoteAudioStats& stats) = 0;
// 远端视频质量回调
virtual void onRemoteVideoStats(MRTCRemoteVideoStats& stats) = 0;
};
class RTCENGINE_API RTCENGINE_API_CPP MRTCStatisticsNULLCallBack final : public IMRTCStatisticsCallBack
{
public:
DELETE_COPY(MRTCStatisticsNULLCallBack);
void onLocalAudioStats(MRTCLocalAudioStats& stats) override
{
}
void onLocalVideoStats(MRTCLocalVideoStats& stats) override
{
}
void onRemoteAudioStats(MRTCRemoteAudioStats& stats) override
{
}
void onRemoteVideoStats(MRTCRemoteVideoStats& stats) override
{
}
};
// 混流
//////////////////////////////////////////////////////////////////////////
enum MRTCLiveStreamTransferType
{
TYPE_RTMP = 0x01,
};
enum MRTCLiveStreamVideoEncoding {
TYPE_H264 = 0x00,
};
enum MRTCLiveStreamAudioEncoding {
TYPE_AAC = 0x00,
};
enum MRTCLiveStreamMode {
TYPE_PARTITIONING_MODE = 0x00, // 均分模式即两宫格、四宫格、九宫格等不传和userList为空时0为默认值
TYPE_SUSPENSION_MODE = 0x01, //悬浮模式,主画面全屏,小画面则横排或竖排悬浮在主画面上,横排或竖排是由输出背景的宽高关系决定的,
// 若宽大于高,为竖排,反之则为横排
TYPE_CUSTOM_MODE = 0x02, //自定义布局根据下面的UserList内容进行布局不传和userList为非空时2为默认值
};
enum MRTCLiveStreamMixType {
TYPE_MIX_ALL = 0x01, // 混所有摄像头和所有麦克风,不传时的默认值
TYPE_MIX_DESKTOP_AND_ALL_MIC = 0x02, // 混一个共享桌面,和所有麦克风
TYPE_MIX_DESKTOP_ONECAM_AND_ALL_MIC =0x03, //混一个共享桌面、一个共享者的摄像头,和所有麦克风,
// 共享桌面画面会在渲染摄影头画面之后渲染,可以制作画中画的效果。
};
enum MRTCLiveStreamLayoutScale {
TYPE_KEEP_ORIGINAL = 0x00, // 保持原长宽比例
TYPE_DO_NOT_ZOOM_EXTRA = 0x01, // 不缩放剧中剪切多出来的部分
};
enum MRTCLiveStreamRole {
INTERACTIVE_AUDIENCE = 0x00, // 互动观众
HOST = 0x01, // 主播
HOST_SHARED_SCREEN = 0x02, // 主播共享的画面
};
struct MRTCPublishAndMixEncoding final
{
int16_t transfer_type = TYPE_RTMP; //推流方式目前支持1RTMP
int16_t video = TYPE_H264; //video - 视频编码类型整型目前支持0H264
int16_t audio = TYPE_AAC; //音频编码类型整型目前支持0AAC
int16_t videoBitrate = 1500; //视频编码码率默认1500最小400最大12000
int16_t videoFramerate = 15; //视频编码帧率默认30只能设置15、20、25、30这几个帧率。
int16_t videoGop = 30; //视频编码gop长度默认和帧率一样最小10最大120。
int32_t audioSampleRate = 48000; //音频编码采样率默认48000只能设置48000、44100、32000、16000这几个采样率
int16_t audioChannels = 2; //音频编码声道数默认2只能设置1、2这两种声道数
int16_t audioBirate = 128; //音频编码码率默认128最小16最大256
};
struct MRTCPublishAndMixUserList final
{
char userId[256] = { 0 };
int8_t role;
int8_t layout_scale; //缩放模式目前支持0保持原长宽比例 1不缩放剧中剪切多出来的部分(2.0新增)
int16_t canvas_left;
int16_t canvas_top;
int16_t canvas_width;
int16_t canvas_height;
char canvas_color[256] = { 0 };
};
struct MRTCConsumerStatus final
{
char peerId[256] = { 0 };
MRTCVideoSourceType videoKind =TYPE_VIDEO_SOURCE_NONE;
MRTCAudioSourceType audioKind = TYPE_AUDIO_SOURCE_NONE;
int8_t videoMuteKind;
int8_t audioMuteKind;
bool isAudioMute = true;
bool isTopNSelected = true;
uint64_t topNSelectedChangeTs = 0;
bool isVideoMute = true;
int videoTotalData = 0;
int audioTotalData = 0;
bool isMe = false;
};
struct MRTCLiveStreamingInfo final
{
int16_t mixType = TYPE_MIX_ALL;
int16_t mode = TYPE_PARTITIONING_MODE;
int16_t outputWidth = 720; // 指定混流输出流的宽不传时的默认值为720
int16_t outputHeight = 1080; // 指定混流输出流的高不传时的默认值为1080
char streamUrl[256] = {0};
};
enum MRTCContentHint
{
kFluid = 0x00, // 流畅模式
kDetailed = 0x01, // 清晰模式
};
//////////////////////////////////////////////////////////////////////////
// 屏幕分享
//////////////////////////////////////////////////////////////////////////
struct MRTCShareSource final
{
DELETE_COPY(MRTCShareSource);
intptr_t sourceId = 0;
char title[256] = { 0 };
};
//////////////////////////////////////////////////////////////////////////
// 视频设备类型
enum MRTCAudioDeviceType
{
#ifdef WIN32 // Windows
TYPE_DEFAULT_CONNUNICATION_DEVICE = -1,
TYPE_DEFAULT_DEVICE = -2
#else
TYPE_DEFAULT_DEVICE = 0,
#endif
};
// 音频设备设置
struct MRTCAudioDeviceOption final
{
uint32_t deviceIndex; //speaker or playout device index
MRTCAudioDeviceType deviceType = TYPE_DEFAULT_DEVICE;
};
constexpr int MAX_DEVICE_NAME_SIZE = 128;
constexpr int MAX_DEVICE_GUID_SIZE = 256;
constexpr int MAX_CAP_INFO_SIZE = 20;
struct MRTCCapFormatInfo
{
uint32_t width; ///< width in pixels
uint32_t height; ///< height in pixels
uint32_t fps; ///< frames per second
};
// 摄像头能力
struct MRTCCameraCapabilities final
{
uint16_t index;
char name[MAX_DEVICE_NAME_SIZE];
char deviceUniqueId[MAX_DEVICE_GUID_SIZE];
char productUniqueId[MAX_DEVICE_GUID_SIZE];
uint16_t iFormatCount;
MRTCCapFormatInfo formatInfo[MAX_CAP_INFO_SIZE];
};
// 模式类型
enum MRTCModeType
{
TYPE_MODE_INVALID = 0x00,
TYPE_MODE_CAMERA_PREVIEW_MIRROR = 0x01, // 摄像头预览镜像
TYPE_MODE_CAMERA_PREVIEW_NORMAL = 0x02, // 摄像头预览不镜像
TYPE_MODE_CAMERA_PUBLISH_MIRROR = 0x03, // 摄像头推流镜像
TYPE_MODE_CAMERA_PUBLISH_NORMAL = 0x04, // 摄像头推流不镜像
TYPE_MODE_CAMERA_FRONT = 0x05, // 前置摄像头
TYPE_MODE_CAMERA_BACK = 0x06, // 后置摄像头
TYPE_MODE_SPEAKER_OPEN = 0x07, // 扬声器开
TYPE_MODE_SPEAKER_CLOSE = 0x08, // 扬声器关
TYPE_MODE_RESET_PLAYOUT = 0x09, // 重置播放设备
TYPE_MODE_RESET_MICROPHONE = 0x0A, // 重置麦克风
TYPE_MODE_MUTE_ALL_CONSUMER_AUDIO = 0x0B, // 静音所有音频对象
TYPE_MODE_UNMUTE_ALL_CONSUMER_AUDIO = 0x0C, // 取消静音所有对象
};
// 插件类型
enum MRTCPluginType
{
TYPE_PLUGIN_NONE = 0x00,
TYPE_PLUGIN_AUDIO_RECORD_EFFECT_RAW_BEFORE = 0x11, // 音频采集设备采集到的原始音频数据,没有分帧, 不是10毫秒为单位的数据
TYPE_PLUGIN_AUDIO_RECORD_EFFECT_BEFORE = 0x12, // 插件音效在默认音效之前处理
TYPE_PLUGIN_AUDIO_RECORD_EFFECT_AFTER = 0x13, // 插件音效在默认音效之后处理
TYPE_PLUGIN_AUDIO_PLAYOUT_EFFECT_RAW_DATA = 0x14, // 插件音效在扬声器端混音多路裸数据处理 ---- 仅支持一个注册,其他支持多个注册
TYPE_PLUGIN_AUDIO_PLAYOUT_EFFECT_BEFORE = 0x15, // 插件音效在扬声器端播放之前的数据处理
TYPE_PLUGIN_CAMERA_ENCODE_BEFORE = 0x20, // 视频特效在摄像头编码之前预处理
TYPE_PLUGIN_CAMERA_DECODE_RENDER = 0x21, // 视频特效在摄像头解码之后渲染之前
TYPE_PLUGIN_SCREEN_ENCODE_BEFORE = 0x22, // 视频特效在屏幕分享编码之前预处理
TYPE_PLUGIN_SCREEN_ENCODE_RENDER = 0x23, // 视频特效在屏幕分享编码之渲染之前
TYPE_PLUGIN_VIDEO_FRAME_SEI_MODIFIER = 0x24, // 视频帧的sei修改器类型
};
// 插件回调基函数
class RTCENGINE_API RTCENGINE_API_CPP IMRTCEffectPlugin
{
public:
DELETE_CTOR_COPY(IMRTCEffectPlugin);
IMRTCEffectPlugin() {}
virtual ~IMRTCEffectPlugin() {}
virtual int16_t onInit(void* param) = 0; // 插件初始化
virtual int16_t onDestroy() = 0; // 插件卸载
virtual int16_t onStart() = 0; // 插件开始
virtual int16_t onStop() = 0; // 插件停止
virtual int16_t onUpdate() = 0; // 插件状态变化
virtual int16_t onGetPluginInfo(const char* pName) = 0; // 插件信息 名称等
};
// sei插件
class RTCENGINE_API RTCENGINE_API_CPP IMRTCSeiPlugin : public IMRTCEffectPlugin
{
public:
IMRTCSeiPlugin() :IMRTCEffectPlugin() {}
virtual ~IMRTCSeiPlugin() override {}
//
// Audio Effect Process.
//
virtual void onSEIProcess(const char *roomId, const char *peerId, MRTCVideoSourceType sourceType,MRTCVideoFrame& videoFrame) = 0;
};
// 音频插件
class RTCENGINE_API RTCENGINE_API_CPP IMRTCAudioEffectPlugin : public IMRTCEffectPlugin
{
public:
IMRTCAudioEffectPlugin() :IMRTCEffectPlugin() {}
virtual ~IMRTCAudioEffectPlugin() override {}
//
// Audio Effect Process.
//
virtual int16_t onProcess(MRTCAudioFrame& audioFrame) = 0;
};
// 音频原始数据插件
class RTCENGINE_API RTCENGINE_API_CPP IMRTCRawAudioEffectPlugin : public IMRTCEffectPlugin
{
public:
//
// Audio Effect Process.
//
virtual int16_t onProcess(const int16_t** const srcData, const int* ssrc, int numberOfStream, int numChannels, int samplesPerChannel, int16_t* dstData, int dstNumChannels) = 0;
};
// 摄像头特效插件
class RTCENGINE_API RTCENGINE_API_CPP IMRTCCameraEffectPlugin : public IMRTCEffectPlugin
{
public:
//
// Camera Effect Process Before.
//
virtual int16_t onCameraProcessBefore(const char *roomId, const char *peerId, MRTCVideoSourceType sourceType, MRTCVideoFrame& videoFrame) = 0;
//
// Camera Effect Process Render.
//
virtual int16_t onCameraProcessRender(const char *roomId, const char *peerId, MRTCVideoSourceType sourceType, MRTCVideoFrame& videoFrame) = 0;
};
// 屏幕分享特效插件
class RTCENGINE_API RTCENGINE_API_CPP IMRTCScreenEffectPlugin : public IMRTCEffectPlugin
{
public:
//
// Screen Effect Process Before.
//
virtual int16_t onScreenProcessBefore(const char *roomId, const char *peerId, MRTCVideoSourceType sourceType, MRTCVideoFrame& videoFrame) = 0;
//
// Screen Effect Process Render.
//
virtual int16_t onScreenProcessRender(const char *roomId, const char *peerId, MRTCVideoSourceType sourceType, MRTCVideoFrame& videoFrame) = 0;
};
// Return Code.
//////////////////////////////////////////////////////////////////////////
enum RetCode : int16_t
{
ERR_NOERR = 0x00, // 没有错误
ERR_DATA_EXISTS = 0x01, // 数据已经存在
ERR_VARIABLE_EMPTY = 0x02, // 变量为空
ERR_MSG_TYPE_WRONG = 0x03, // 消息类型错误
ERR_MODULE_ID_ERROR = 0x04, // 模块ID错误
ERR_MODULE_NOT_EXISTS = 0x05, // 模块不存在
ERR_MSG_NOT_CURMODULE = 0x06, // 收到不是当前模块消息
ERR_EVENT_NOT_CURMODULE = 0x07, // 收到不是当前模块事件
ERR_ENGINE_STATUS_ERR = 0x08, // 引擎状态错误
ERR_LISTENER_TYPE_ERROR = 0x09, // 监听函数类型错误
ERR_LOAD_DEVICE_FAILED = 0x0A, // 加载设备失败
ERR_GET_CAPABILITY_FAILED = 0x0B, // 获取能力失败
ERR_WS_CREATE_SEND_TRANSPORT = 0x0C, // Websocket创建Send Transport失败。
ERR_CREATE_SENDTRANSPORT_FAILED = 0x0D, // Device 创建SendTransport失败
ERR_WS_CREATE_RECV_TRANSPORT = 0x0E, // Websocket创建Recv Transport失败。
ERR_CREATE_RECVTRANSPORT_FAILED = 0x0F, // Device 创建RecvTransport失败
ERR_GET_JOIN_ROOM_FAILED = 0x10, // 获取加入房间失败
ERR_GET_SENDTRANSPORT_PRODUCE_FAILED = 0x11, // Produce获取数据失败
ERR_GET_SENDTRANSPORT_PRODUCE_DATA_FAILED = 0x12, // ProduceData获取数据失败
ERR_GET_FROM_CONSUMERID_TO_USERID_FAILED = 0x13, // ComsumerId换换UserId失败
ERR_GET_FROM_USERID_TO_CONSUMERID_FAILD = 0x14, // UserId转换ConsumerId失败
ERR_ENGINE_REPEAT_JOIN_ROOM = 0x15, // 已经加入房间,重复加入
ERR_REPEAT_START_PREVIEW_LOCAL_CAMERA = 0x16, // 重复打开预览摄像头
ERR_REPEAT_STOP_PREVIEW_LOCAL_CAMERA = 0x17, // 重复关闭摄像头
ERR_REPEAT_OPEN_MICRO = 0x18, // 重复打开麦克风
ERR_REPEAT_CLOSE_MICRO = 0x19, // 重复关闭麦克风
ERR_CAPABILITY_CONTENT_ERROR = 0x1A, // 能力内容错误
ERR_CREATE_SENDTRANSPORT_RESPONSE_ERR = 0x1B, // 创建send transport 返回数据错误
ERR_CREATE_RECVTRANSPORT_RESPONSE_ERR = 0x1C, // 创建Recv transport 返回数据错误
ERR_NEW_CONSUMER_RESPONSE_DATA_ERR = 0x1D, // newConsumer 返回数据错误
ERR_CREATE_WEBSOCKET_FAILED = 0x1E, // websocket创建失败
ERR_RECONNECT_ROOM_DURING = 0x1F, // 重连过程中,不能进行操作
ERR_OPEN_CAMERA_FAILED = 0x20, // 打开摄像头失败
ERR_GET_CAMERA_INFO_FAILED = 0x21, // 获取摄像头信息失败
ERR_VOLUME_OUT_OF_RANGE = 0x22, // 音量范围0-1.0
ERR_CREATE_MIC_PRODUCER_FAILED = 0x23, // Mic生产者对象创建失败
ERR_CREATE_CAMERA_TRACK_FAILED = 0x24, // 摄像头VideoTrack创建失败
ERR_VARIABLE_VIDEOTRACK_INVALID = 0x25, // VideoTrack变量无效
ERR_CREATE_VIDEO_PRODUCER_FAILED = 0x26, // Video生产者创建失败
ERR_CREATE_NEW_CONSUMER_FAILED = 0x27, // Consumer创建失败
ERR_RESPONSE_SWITCH_MEDIA = 0x28, // SwitchMedia请求返回失败
ERR_RESPONSE_SET_VIDEO_LAYERS = 0x29, // SetVideoLayer请求返回失败
ERR_RESPONSE_ENABLE_CONSUMER_AUDIO = 0x2A, // EnableConsumerAudio请求返回失败
ERR_RESPONSE_ENABLE_CONSUMER_VIDEO = 0x2B, // EnableConsumerVIdeo请求返回失败
ERR_RESPONSE_ENABLE_CONSUMER_AUDIO2 = 0x2C, // EnableConsumerAudio2请求返回失败
ERR_RESPONSE_ENABLE_CONSUMER_VIDEO2 = 0x2D, // EnableConsumerVIdeo2请求返回失败
ERR_RESPONSE_CLOSE_ROOM = 0x2E, // CloseRooom请求返回失败
ERR_RESPONSE_SEND_TRANSPORT_CONNECT = 0x2F, // SendTransportConnect请求返回失败
ERR_RESPONSE_RECV_TRANSPORT_CONNECT = 0x30, // RecvTransportConnect请求返回失败
ERR_EXCEED_STREAM_LEVEL_LIMIT = 0x31, // 采集的视频尺寸超过了StreamLeave的限制
ERR_WEBSOCKET_WAS_CLOSED = 0x32, // websocket已经关闭
ERR_DEVICE_TYPE_WRONG = 0x33, // 设备类型错误
ERR_EFFECT_REGISTER_FAILED = 0x34, // 特效注册失败
ERR_AUDIO_DEVICE_IS_IN_USE = 0x35, // 音频设备正在使用
ERR_REPEAT_OPEN_SCREEN = 0x36, // 重复打开屏幕分享
ERR_REPEAT_CLOSE_SCREEN = 0x37, // 重复关闭屏幕分享
ERR_CONNECT_SERVER_FAILED = 0x38, // 连接服务器错误
ERR_DO_FAILED_FOR_WILL_LEAVE = 0x39, // 将要离开房间,操作失败
ERR_LOAD_AUDIO_MONITOR_FAILED = 0x3A, // 加载音频设备监控失败
ERR_UNLOAD_AUDIO_MONITOR_FAILED = 0x3B, // 卸载音频设备监控失败
ERR_REGISTER_AUDIO_MONITOR_FAILED = 0x3C, // 注册音频设备监控失败
ERR_REGISTER_WINDOWS_CLASS_FAILED = 0x3D, // 注册Windows窗口类失败
ERR_CREATE_WINDOWS_WINDOW_FAILED = 0x3E, // 创建windows窗口失败
ERR_REGISTER_DEVICE_NOTIFY_FAILED = 0x3F, // 注册设备Notify失败
ERR_REPEAT_START_PUBLISHING = 0x40, // 重复开始预览
ERR_REPEAT_STOP_PUBLISHING = 0x41, // 重复停止预览
ERR_REPEAT_OPEN_SCREEN_SHAREING = 0x42, // 重复打开屏幕分享
ERR_REPEAT_STOP_SCREEN_SHAREING = 0x43, // 重复关闭屏幕分享
ERR_BACKGROUND_MUSIC_NOT_PLAYING = 0x44, // 背景音乐没有在播放
ERR_BACKGROUND_MUSIC_NOT_PAUSED = 0x45, // 背景音乐不是pause状态
ERR_MUSIC_PLAYER_ALREADY_INIT = 0x46, // 背景音乐播放器已经初始化
ERR_MUSIC_PLAYER_ALREADY_UNINIT = 0x47, // 背景音乐播放器已经释放
ERR_MUSIC_PLAYER_DO_NOT_INIT = 0x48, // 背景音乐播放器还没有初始化
ERR_MUSIC_PLAYER_HAVE_STOPED = 0x49, // 背景音乐播放器已经停止
ERR_MUSIC_PLAYER_IS_PLAYING = 0x4A, // 背景音乐播放器正在播放状态
ERR_MUSIC_PLAYER_IS_PAUSED = 0x4B, // 背景音乐播放器正在暂停状态
ERR_MUSIC_PLAYER_IS_STOPED = 0x4C, // 背景音乐播放器正在停止状态
ERR_MUSIC_PLAYER_FILE_PATH_EMPTY = 0x4D, // 背景音乐播放路径不能为空
ERR_MUSIC_PLAYER_FILE_READ_FAILED = 0x4E, // 背景音乐文件不存在或者不可读
ERR_MUSIC_PLAYER_DO_NOT_PLAYING = 0x4F, // 背景音乐播放器不在播放状态
ERR_MUSIC_PLAYER_DO_NOT_PAUSED = 0x50, // 背景音乐播放器不在暂停状态
ERR_FIND_AUDIO_STREAM_FAILED = 0x51, // 查找音频流失败!
ERR_FIND_DECODE_CODEC_FAILED = 0x52, // 查找解码器失败!
ERR_FAILED_ALLOC_DECODE_CTX = 0x53, // 申请Decoder Context失败!
ERR_FAILED_COPY_PARAM_TO_DEC = 0x54, // 拷贝Decoder Param失败!
ERR_FAILED_OPEN_DECODEC = 0x55, // 打开解码器失败!
ERR_RETURN_FAILED_FIND_VIDEO_STREAM = 0x56, // 获取视频流失败!
ERR_RETURN_FAILED_FIND_AUDIO_STREAM = 0x57, // 获取音频流失败!
ERR_RETURN_FILE_CANNOT_OPEN = 0x58, // 打开媒体文件失败!
ERR_RETURN_NOT_FIND_STREAM = 0x59, // 没有发现媒体流!
ERR_RETURN_NOT_AVAILABLE = 0x5A, // 媒体文件没有获取到需要的信息.
ERR_MEDIA_FILE_CANNOT_OPEN = 0x5B, // 媒体文件无法打开
ERR_CANNOT_FIND_STREAM = 0x5C, // 查找不到媒体文件流信息
ERR_INVALID_PARAMETER = 0x5D, // 参数错误
ERR_UPLOAD_LOG_FILE_FAILED = 0x5E, // 上传日志文件失败
ERR_OPEN_ZIP_FILE_FAILED = 0x5F, // 打开Zip文件错误
ERR_OPEN_SCREEN_FAILED = 0x60, // 打开屏幕分享失败
ERR_OPEN_SHARE_AUDIO_FAILED = 0x61, // 打开音频分享失败
ERR_REPEAT_CLOSE_SHARE_AUDIO = 0x62, // 重复关闭音频分享
ERR_VIDEO_FILE_NOT_PLAYING = 0x63, // 视频文件没有在播放
ERR_VIDEO_FILE_NOT_PAUSED = 0x64, // 视频文件不是pause状态
ERR_VIDEO_PLAYER_ALREADY_INIT = 0x65, // 视频播放器已经初始化
ERR_VIDEO_PLAYER_ALREADY_UNINIT = 0x66, // 视频播放器已经释放
ERR_VIDEO_PLAYER_DO_NOT_INIT = 0x67, // 视频播放器还没有初始化
ERR_VIDEO_PLAYER_HAVE_STOPED = 0x68, // 视频播放器已经停止
ERR_VIDEO_PLAYER_IS_PLAYING = 0x69, // 视频播放器正在播放状态
ERR_VIDEO_PLAYER_IS_PAUSED = 0x6A, // 视频播放器正在暂停状态
ERR_VIDEO_PLAYER_IS_STOPED = 0x6B, // 视频播放器正在停止状态
ERR_VIDEO_PLAYER_FILE_PATH_EMPTY = 0x6C, // 视频播放路径不能为空
ERR_VIDEO_PLAYER_FILE_READ_FAILED = 0x6D, // 视频文件不存在或者不可读
ERR_VIDEO_PLAYER_DO_NOT_PLAYING = 0x6E, // 视频播放器不在播放状态
ERR_VIDEO_PLAYER_DO_NOT_PAUSED = 0x6F, // 视频播放器不在暂停状态
ERR_EXCEED_ROOM_MEMBER_LIMIT = 0x70, // 加入房间人数超过服务端最大限制
ERR_EXCEED_VIDEO_PRODUCE_NUMBER_LIMIT = 0x71, // 开启视频人数超过服务端最大限制
EER_AUDIO_DATA_REACHED_END = 0x72, // 音频数据已经到末尾
ERR_AUDIO_DATA_NOT_ENOUGH = 0x73, // 没有足够长度的音频数据
ERR_OPEN_DESKTOP_FAILED = 0x74, // 打开桌面声音分享失败
ERR_OPEN_BGMUSIC_FAILED = 0x75, // 打开背景音乐失败
ERR_REPEAT_OPEN_BGMUSIC = 0x76, // 重复打开背景音乐
ERR_REPEAT_CLOSE_BGMUSIC = 0x77, // 重复关闭背景音乐
ERR_OPEN_FILE_AUDIO_FAILED = 0x78, // 打开视频分享音频失败
ERR_OPEN_AUDIO_EFFECT_FAILED = 0x79, // 打开音效音频失败
ERR_CREATE_SCREEN_TRACK_FAILED = 0x7A, // 屏幕分享VideoTrack创建失败
ERR_CREATE_SHARE_AUDIO_PRODUCER_FAILED = 0x7B, // 创建屏幕声音分享生产者失败
ERR_CREATE_MUSIC_PRODUCER_FAILED = 0x7C, // 创建背景音乐生产者失败
ERR_CREATE_FILE_AUDIO_PRODUCER_FAILED = 0x7D, // 创建视频分享音频生产者失败
ERR_CREATE_AUDIO_EFFECT_PRODUCER_FAILED = 0x7E, // 创建音效音频生产者失败
ERR_REPEAT_OPEN_FILE_AUDIO = 0x7F, // 重复打开视频分享文件音频
ERR_REPEAT_OPEN_AUDIO_EFFECT = 0x80, // 重复打开音效文件音频
ERR_REPEAT_CLOSE_FILE_AUDIO = 0x81, // 重复关闭视频分享文件音频
ERR_REPEAT_CLOSE_AUDIO_EFFECT = 0x82, // 重复关闭音频文件音频
ERR_REPEAT_OPEN_DESKTOP = 0x83, // 重复打开桌面声音分享
ERR_REPEAT_CLOSE_DESKTOP = 0x84, // 重复关闭桌面声音分享
ERR_OPERATION_FAILED = 0x85, // 操作失败
ERR_OPEN_CUSTOM_AUDIO_FAILED = 0x86, // 打开自定义音频失败
ERR_CREATE_FILE_VIDEO_TRACK_FAILED = 0x87, // 视频分享VideoTrack创建失败
ERR_REPEAT_CLOSE_FILE_VIDEO = 0x88, // 重复关闭视频分享文件视频
ERR_CREATE_CUSTOM_VIDEO_TRACK_FAILED = 0x89, // 自定义视频VideoTrack创建失败
ERR_OPEN_CUSTOM_VIDEO_FAILED = 0x8A, // 打开自定义视频失败
ERR_OPEN_FILE_VIDEO_FAILED = 0x8B, // 打开视频分享文件视频失败
ERR_REPEAT_OPEN_CUSTOM_AUDIO = 0x8C, // 重复打开自定义音频
ERR_REPEAT_CLOSE_CUSTOM_AUDIO = 0x8D, // 重复关闭自定义音频
ERR_PRE_INSTANCE_NOT_DESTROY = 0x8E, // MRTCEngine 前一个实例没有调用destroy销毁不能同时运行多份实例
ERR_EXCEED_MIC_PRODUCE_NUMBER_LIMIT = 0x8F, // 麦克风人数超过限制
ERR_GET_RESTART_ICE_PARAMETERS_FAILED = 0x90, // 获取ReStartICE参数错误
ERR_RESTARTICE_PARAM_INVALID = 0x91, // ReStartICE参数错误
ERR_DOMAIN_CURL_REQUEST_FAILED = 0x92, // 就近接入请求CURL失败
ERR_DOMAIN_REQUEST_CODE_FAILED = 0x93, // 就近接入获取CODE错误
DOMAIN_REQUEST_CODE_READY = 0x94, // 就近接入准备就绪
DOMAIN_REQUEST_EMPTY = 0x95, // 就近接入传入地址为空
DOMAIN_REQUEST_DATA_EMPTY = 0x96, // 就近接入获取环境为空
UPLOAD_REQUEST_READY = 0x97, // 日志上传请求就绪
UPLOAD_CURL_CONNECT_FAILED = 0x98, // 日志上传CURL连接失败
UPLOAD_CURL_REQUEST_FAILED = 0x99, // 日志上传CURL请求失败
UPLOAD_CURL_REQUEST_DATA_FAILED = 0x9A, // 日志上传CURL请求数据错误
DOMAIN_REQUEST_CURL_FAILED = 0x9B, // 就近接入CURL初始化失败
DOMAIN_GET_RESPONSE_FAILED = 0x9C, // 就近接入解析response错误
ERR_AUDIO_DEVICE_START_EXCEPTION = 0x9D, // 音频设备启动异常
ERR_VIDEO_DEVICE_START_EXCEPTION = 0x9E, // 视频设备启动异常
TOKEN_REQUEST_CODE_READY = 0x9F, // 获取token准备就绪
REQUEST_TOKEN_FAILED = 0xA0, // 获取token获取失败
LIVE_STREAMING_REQUEST_CODE_READY = 0xA1, // 拉流混流准备就绪
REQUEST_LIVE_STREAMING_FAILED = 0xA2, // 请求拉流混流失败失败
LIVE_STREAMING_UPDATE_CODE_READY = 0xA3, // 更新拉流混流准备就绪
UPDATE_LIVE_STREAMING_FAILED = 0xA4, // 更新拉流混流失败失败
LIVE_STREAMING_STOP_CODE_READY = 0xA5, // 停止拉流混流准备就绪
STOP_LIVE_STREAMING_FAILED = 0xA6, // 停止拉流混流失败失败
ERR_CONNECT_SERVER_TO_FAILED = 0xA7, // 停止拉流混流失败失败
RECEIVE_CUSTOM_MESSAGE = 0xA8, // 接收到自定义信令
RECEIVE_KICKOUT_MESSAGE = 0xA9, // 接收到服务端踢人信令
RECEIVE_FORBID_RTC_PUSH = 0xAA, // 接收到禁止推流信令
RECEIVE_RESUME_RTC_PUSH = 0xAB, // 接收到恢复推流信令
RECEIVE_FORBID_RTC_PULL = 0xAD, // 接收到禁止拉流信令
RECEIVE_RESUME_RTC_PULL = 0xAE, // 接收到恢复拉流信令
MEDIA_PUBLISH_SUCCESS = 0xAF, // 音视频推流成功
MEDIA_PUBLISH_FAILED = 0xB0, // 音视频推流失败
WINDOW_CAPTURE_FAILED_MINIATURIZED = 0xB1, // 窗口缩小引起采集失败
WINDOW_CAPTURE_FAILED_CLOSED = 0xB2, // 窗口关闭引起采集失败
ERR_REPEAT_OPEN_DATACHANNEL = 0xB3, // 重复打开dataChannel
ERR_CREATE_NEW_DATA_CONSUMER_FAILED = 0xB4, // customData 能力创建失败
DATA_CHANNEL_PRODUCE_OPEN = 0xB5, // customData produce 通道开启
DATA_CHANNEL_PRODUCE_CLOSEED = 0xB6, // customData produce 通道关闭
DATA_CHANNEL_CONSUMER_OPEN = 0xB7, // customData consuemr 通道开启
DATA_CHANNEL_CONSUMER_CLOSEED = 0xB8, // customData consuemr 通道关闭
ERR_CREATE_DATA_CHANNEL_PRODUCER_FAILED = 0xB9, // 创建customData生产者失败
ERR_SATRT_SUPER_RESOLUTION_REPEAT = 0xBA, // 已经设置过此peerid对应类型的超分重复设置
ERR_STOP_SUPER_RESOLUTION_INVALID = 0xBB, // 未设置过此peerId对应类型的超分取消超分无效
RECEIVE_REPEAT_KICKOUT_MESSAGE = 0xBC, // 接收到自己在不同设备重复入会,被自己踢掉信令
ERR_CREATE_SEND_TRANSPORT_ERROR_ADD_TRACK = 0xBD, // createWebRtcTransport 信令失败导致添加音视频Track失败
ERR_REPEAT_STOP_DATACHANNEL = 0xBE, // 重复停止DataChannel
ERR_CONNECT_RTM_SERVER_TO_FAILED = 0xC0, // RTM 返回 605错误重试之后关闭
ERR_CONNECT_RTM_SERVER_FAILED = 0xC1, // 连接RTM服务器出错
ERR_EXCEED_RTM_ROOM_MEMBER_LIMIT = 0xC2, // RTM 超出上限
JOIN_MULTI_ROOM_SUCCESS = 0xC3, // 加入多房间成功
ERR_JOIN_MULTI_ROOM = 0xC4, // 加入多房间失败
LEAVE_MULTI_ROOM_SUCCESS = 0xC5, // 离开多房间成功
ERR_LEAVE_MULTI_ROOM = 0xC6, // 离开多房间失败
RECONNECT_JOIN_MULTI_ROOM_SUCCESS = 0xC7, // 重连加入多房间成功
ERR_RECONNECT_JOIN_MULTI_ROOM = 0xC8, // 重连加入多房间失败
ERR_REPEAT_JOIN_MULTI_ROOM = 0xC9, // 重复加入多房间
ERR_JOIN_MULTI_HOST_ROOM = 0xCA, // 使用主房间Id调用加入多房间接口
ERR_LEAVE_MULTI_HOST_ROOM = 0xCB, // 使用主房间Id调用离开多房间接口
ERR_REQUEST_ROOM_USER_LIST_TOO_FREQUENCY = 0xCC, // 过于频繁的调用房间人员列表接口
ERR_GET_ROOM_USERS_TOO_OFTEN = 0xCD, // 调用获取房间成员列表太频繁
ERR_ROOM_MODE_MISMATCH = 0xCE, // 房间mode不匹配
ERR_INVALID_ROOM_MODE = 0xCF, // 无效的房间mode
ERR_REQUEST_RS_BEYOND_MAX = 0xD0, // 请求RS超时
ERR_RS_EXCEPTION = 0xD1, // RS服务内部错误
ERR_JOIN_ROOM_BEYOND_MAX = 0xD2, // 加多房间超出加入房间限制
ERR_ROOM_CLOSED = 0xD3, // 房间已被关闭90s内用户无法加入
ERR_EXCESSIVE_REQUESTS = 0xD4, // 请求房间用户或房间用户数过于频繁
ERR_UNKNOWN_ROLE = 0xD5, // 无效的用户role
ERR_TRANSPORT_ERROR = 0xD6, // transport异常
ERR_REPEAT_USER = 0xD7, // 用户重复登录
ERR_REPEAT_START_CUSTOM_AUDIO = 0xD8, // 重复打开自定义音频
ERR_REPEAT_STOP_CUSTOM_AUDIO = 0xD9, // 重复关闭自定义音频
// RAW video 相关
ERR_REPEAT_OPEN_RAW_VIDEO = 0xDA, // 重复打开自定义裸视频
ERR_REPEAT_CLOSE_RAW_VIDEO = 0xDB, // 重复关闭自定义裸视频
ERR_CREATE_CUSTOM_RAW_VIDEO_TRACK_FAILED = 0xDC, // 创建视频裸流VideoTrackProduct失败
ERR_VIDEO_CHANNEL = 0xDD, // 发送视频流的通道不存在
ERR_AUDIO_CHNNAEL = 0xDE, // 发送视音流的通道不存在
ERR_VIDEO_CHNNAEL_INDEX = 0xDF, // 视频多路流通道数不在0-100区间
ERR_AUDIO_CHNNAEL_INDEX = 0xE0, // 音频多路流通道数不在0-100区间
ERR_CREATE_CUSTOM_SECOND_VIDEO_TRACK_FAILED = 0xE1, // 自定义第二路视频VideoTrack创建失败
ERR_CREATE_CUSTOM_AUDIO_PRODUCER_FAILED = 0xE2, // 创建视频自定义音频生产者失败
ERR_PUSH_MEDIA_TIMEOUT = 0xE3, // 推流超时
ERR_AUTO_UPLOAD_ENABLED_CANT_USE_API = 0xE4, // 自动上传开启上传日志API无效化
AUTO_UPLOAD_SUCCEED = 0xE5, // 自动上传成功
ERR_OPERATION_TOO_FREQUENT = 0xE6, // 操作过于频繁
CAMERA_OPEN_SUCCESS = 0xE7, // 摄像头打开成功
MIC_OPEN_SUCCESS = 0xE8, // 麦克风打开成功
ERR_ENGINE_STATUS_ERR_NOT_INITED = 0xE9, // 引擎状态错误,子码,未初始化
ERR_ENGINE_STATUS_ERR_NOT_IN_ROOM= 0xEA, // 引擎状态错误,子码,未加入房间
ERR_TRANSPORT_AUDIO_MIXER_ADD = 0xEB, // transport未创建添加混音能力失败
ERR_REPEAT_AUDIO_MIXER_ADD = 0xEC, // 重复添加混音能力
ERR_TRANSPORT_AUDIO_MIXER_DELETE = 0xED, // transport未创建删除混音能力失败
ERR_REPEAT_AUDIO_MIXER_DELETE = 0xEE, // 重复删除混音能力
ERR_VIDEO_H265_HARDWARE_ENCODE_FAILED_AND_SWITCH_TO_SOFTWARE = 0xED, // H265硬编码失败切换软编
ERR_VIDEO_H264_HARDWARE_ENCODE_FAILED_AND_SWITCH_TO_SOFTWARE = 0xEE, // H264硬编码失败切换软编
ERR_AUDIO_PUSH_AAC_ERROR = 0xEF, // 推送AAC音频失败
};
static constexpr const char* GetErrorDescription(RetCode e)
{
const char* pDescription = nullptr;
switch (e)
{
case ERR_NOERR:
pDescription = "success";
break;
case ERR_DATA_EXISTS:
pDescription = "Data already exists.";
break;
case ERR_VARIABLE_EMPTY:
pDescription = "Variable is empty.";
break;
case ERR_MSG_TYPE_WRONG:
pDescription = "Wrong message type.";
break;
case ERR_MODULE_ID_ERROR:
pDescription = "Module ID error.";
break;
case ERR_MODULE_NOT_EXISTS:
pDescription = "Module does not exist.";
break;
case ERR_MSG_NOT_CURMODULE:
pDescription = "Received a message that is not the current module";
break;
case ERR_EVENT_NOT_CURMODULE:
pDescription = "Received a event that is not the current module";
break;
case ERR_ENGINE_STATUS_ERR:
pDescription = "Engine status error.";
break;
case ERR_LISTENER_TYPE_ERROR:
pDescription = "Wrong monitoring function type.";
break;
case ERR_LOAD_DEVICE_FAILED:
pDescription = "Failed to load device.";
break;
case ERR_OPERATION_TOO_FREQUENT:
pDescription = "Operation is too frequent, please try again later.";
break;
case ERR_GET_CAPABILITY_FAILED:
pDescription = "Failed to acquire ability.";
break;
case ERR_WS_CREATE_SEND_TRANSPORT:
pDescription = "WebSocket failed to create Send Transport.";
break;
case ERR_CREATE_SENDTRANSPORT_FAILED:
pDescription = "Device failed to create SendTransport.";
break;
case ERR_WS_CREATE_RECV_TRANSPORT:
pDescription = "WebSocket failed to create Recv Transport.";
break;
case ERR_CREATE_RECVTRANSPORT_FAILED:
pDescription = "Device failed to create RecvTransport.";
break;
case ERR_GET_JOIN_ROOM_FAILED:
pDescription = "Failed to get join room.";
break;
case ERR_GET_SENDTRANSPORT_PRODUCE_FAILED:
pDescription = "SendTransport produce failed to get data.";
break;
case ERR_GET_SENDTRANSPORT_PRODUCE_DATA_FAILED:
pDescription = "SendTransport producedata failed to get data.";
break;
case ERR_GET_FROM_CONSUMERID_TO_USERID_FAILED:
pDescription = "ComsumerId change to UserId failed";
break;
case ERR_GET_FROM_USERID_TO_CONSUMERID_FAILD:
pDescription = "UserId change to ConsumerId failed";
break;
case ERR_ENGINE_REPEAT_JOIN_ROOM:
pDescription = "Already joined the room, repeat to join the room";
break;
case ERR_REPEAT_START_PREVIEW_LOCAL_CAMERA:
pDescription = "Start the camera preview repeatedly";
break;
case ERR_REPEAT_STOP_PREVIEW_LOCAL_CAMERA:
pDescription = "Stop the camera preview repeatedly";
break;
case ERR_REPEAT_START_PUBLISHING:
pDescription = "Start the camera publishing repeatedly";
break;
case ERR_REPEAT_STOP_PUBLISHING:
pDescription = "Stop the camera publishing repeatedly";
break;
case ERR_REPEAT_OPEN_MICRO:
pDescription = "Repeat to turn on the microphone";
break;
case ERR_REPEAT_CLOSE_MICRO:
pDescription = "Repeatedly turn off the microphone";
break;
case ERR_CAPABILITY_CONTENT_ERROR:
pDescription = "Ability to obtain content error";
break;
case ERR_CREATE_SENDTRANSPORT_RESPONSE_ERR:
pDescription = "create sendtransport returns data errorr";
break;
case ERR_CREATE_RECVTRANSPORT_RESPONSE_ERR:
pDescription = "create recvtransport returns data errorr";
break;
case ERR_NEW_CONSUMER_RESPONSE_DATA_ERR:
pDescription = "newConsumer returns data errorr";
break;
case ERR_CREATE_WEBSOCKET_FAILED:
pDescription = "websocket creation failed.";
break;
case ERR_RECONNECT_ROOM_DURING:
pDescription = "Cannot operate during reconnection.";
break;
case ERR_OPEN_CAMERA_FAILED:
pDescription = "Failed to open camera.";
break;
case ERR_GET_CAMERA_INFO_FAILED:
pDescription = "Failed to get camera information.";
break;
case ERR_VOLUME_OUT_OF_RANGE:
pDescription = "The volume range is out of range 0-1.0.";
break;
case ERR_CREATE_MIC_PRODUCER_FAILED:
pDescription = "Mic producer object creation failed.";
break;
case ERR_CREATE_CAMERA_TRACK_FAILED:
pDescription = "Camera videotrack creation failed.";
break;
case ERR_VARIABLE_VIDEOTRACK_INVALID:
pDescription = "The variable videotrack is not valid.";
break;
case ERR_CREATE_VIDEO_PRODUCER_FAILED:
pDescription = "Video producer object creation failed.";
break;
case ERR_CREATE_NEW_CONSUMER_FAILED:
pDescription = "Consumer creation failed.";
break;
case ERR_RESPONSE_SWITCH_MEDIA:
pDescription = "SwitchMedia request failed.";
break;
case ERR_RESPONSE_SET_VIDEO_LAYERS:
pDescription = "SetVideoLayer request failed to return.";
break;
case ERR_RESPONSE_ENABLE_CONSUMER_AUDIO:
pDescription = "EnableConsumerAudio request failed to return.";
break;
case ERR_RESPONSE_ENABLE_CONSUMER_VIDEO:
pDescription = "EnableConsumerVideo request failed to return.";
break;
case ERR_RESPONSE_ENABLE_CONSUMER_AUDIO2:
pDescription = "EnableConsumerAudio2 request failed to return.";
break;
case ERR_RESPONSE_ENABLE_CONSUMER_VIDEO2:
pDescription = "EnableConsumerVideo2 request failed to return.";
break;
case ERR_RESPONSE_CLOSE_ROOM:
pDescription = "CloseRoom request failed to return.";
break;
case ERR_RESPONSE_SEND_TRANSPORT_CONNECT:
pDescription = "SendTransportConnect request failed to return.";
break;
case ERR_RESPONSE_RECV_TRANSPORT_CONNECT:
pDescription = "RecvTransportConnect request failed to return.";
break;
case ERR_EXCEED_STREAM_LEVEL_LIMIT:
pDescription = "The size of the captured video exceeds the limit of StreamLeave";
break;
case ERR_WEBSOCKET_WAS_CLOSED:
pDescription = "WebSocket was closed.";
break;
case ERR_DEVICE_TYPE_WRONG:
pDescription = "Wrong device type.";
break;
case ERR_EFFECT_REGISTER_FAILED:
pDescription = "Special effects registration failed.";
break;
case ERR_AUDIO_DEVICE_IS_IN_USE:
pDescription = "Audio device is in use.";
break;
case ERR_REPEAT_OPEN_SCREEN:
pDescription = "Turn on the share screen repeatedly.";
break;
case ERR_REPEAT_CLOSE_SCREEN:
pDescription = "Close the share screen repeatedly.";
break;
case ERR_CONNECT_SERVER_FAILED:
pDescription = "Connect To Server Failed.";
break;
case ERR_DO_FAILED_FOR_WILL_LEAVE:
pDescription = "About to leave the room, the operation failed.";
break;
case ERR_LOAD_AUDIO_MONITOR_FAILED:
pDescription = "Failed to load audio device monitoring.";
break;
case ERR_UNLOAD_AUDIO_MONITOR_FAILED:
pDescription = "Failed to uninstall audio device monitor.";
break;
case ERR_REGISTER_AUDIO_MONITOR_FAILED:
pDescription = "Failed to register audio device monitor.";
break;
case ERR_REGISTER_WINDOWS_CLASS_FAILED:
pDescription = "Failed to register windows window class.";
break;
case ERR_CREATE_WINDOWS_WINDOW_FAILED:
pDescription = "Failed to create Windows window.";
break;
case ERR_REGISTER_DEVICE_NOTIFY_FAILED:
pDescription = "Failed to register device notification.";
break;
case ERR_REPEAT_OPEN_SCREEN_SHAREING:
pDescription = "Open the screen sharing repeatedly.";
break;
case ERR_REPEAT_STOP_SCREEN_SHAREING:
pDescription = "Stop the screen sharing repeatedly.";
break;
case ERR_BACKGROUND_MUSIC_NOT_PLAYING:
pDescription = "Background music is not playing.";
break;
case ERR_BACKGROUND_MUSIC_NOT_PAUSED:
pDescription = "The background music is not paused.";
break;
case ERR_MUSIC_PLAYER_ALREADY_INIT:
pDescription = "The background music player has been initialized.";
break;
case ERR_MUSIC_PLAYER_ALREADY_UNINIT:
pDescription = "The background music player has been released.";
break;
case ERR_MUSIC_PLAYER_DO_NOT_INIT:
pDescription = "The background music player has not been initialized.";
break;
case ERR_MUSIC_PLAYER_IS_PLAYING:
pDescription = "Background music player is playing.";
break;
case ERR_MUSIC_PLAYER_IS_PAUSED:
pDescription = "The background music player is paused.";
break;
case ERR_MUSIC_PLAYER_FILE_PATH_EMPTY:
pDescription = "The background music playback path cannot be empty.";
break;
case ERR_MUSIC_PLAYER_FILE_READ_FAILED:
pDescription = "The background music file does not exist or is unreadable.";
break;
case ERR_MUSIC_PLAYER_DO_NOT_PLAYING:
pDescription = "The background music player is not playing.";
break;
case ERR_MUSIC_PLAYER_DO_NOT_PAUSED:
pDescription = "The background music player is not paused.";
break;
case ERR_FIND_AUDIO_STREAM_FAILED:
pDescription = "Find Audio Stream Failed.";
break;
case ERR_FIND_DECODE_CODEC_FAILED:
pDescription = "Find Decode Codec Failed.";
break;
case ERR_FAILED_ALLOC_DECODE_CTX:
pDescription = "Failed to allocate the decoder context.";
break;
case ERR_FAILED_COPY_PARAM_TO_DEC:
pDescription = "Failed to copy decoder parameters to input decoder context";
break;
case ERR_FAILED_OPEN_DECODEC:
pDescription = "Failed to open decoder";
break;
case ERR_RETURN_FAILED_FIND_VIDEO_STREAM:
pDescription = "Could not find video stream.";
break;
case ERR_RETURN_FAILED_FIND_AUDIO_STREAM:
pDescription = "Could not find audio stream.";
break;
case ERR_RETURN_FILE_CANNOT_OPEN:
pDescription = "Cannot open media file.";
break;
case ERR_RETURN_NOT_FIND_STREAM:
pDescription = "Cannot find stream information.";
break;
case ERR_RETURN_NOT_AVAILABLE:
pDescription = "The current media file does not get the required information.";
break;
case ERR_MEDIA_FILE_CANNOT_OPEN:
pDescription = "Cannot open input media file.";
break;
case ERR_CANNOT_FIND_STREAM:
pDescription = "Cannot find stream information.";
break;
case ERR_INVALID_PARAMETER:
pDescription = "Parameter error.";
break;
case ERR_UPLOAD_LOG_FILE_FAILED:
pDescription = "Failed to upload log file.";
break;
case ERR_OPEN_ZIP_FILE_FAILED:
pDescription = "Failed to open zip file.";
break;
case ERR_OPEN_SCREEN_FAILED:
pDescription = "Failed to open screen sharing.";
break;
case ERR_VIDEO_FILE_NOT_PLAYING:
pDescription = "Video file is not playing.";
break;
case ERR_VIDEO_FILE_NOT_PAUSED:
pDescription = "The video player is not paused.";
break;
case ERR_VIDEO_PLAYER_ALREADY_INIT:
pDescription = "The video player has been initialized.";
break;
case ERR_VIDEO_PLAYER_ALREADY_UNINIT:
pDescription = "The video player has been released.";
break;
case ERR_VIDEO_PLAYER_DO_NOT_INIT:
pDescription = "The video player has not been initialized.";
break;
case ERR_MUSIC_PLAYER_HAVE_STOPED:
pDescription = "The background music player has stopped.";
break;
case ERR_VIDEO_PLAYER_HAVE_STOPED:
pDescription = "The video player has stopped.";
break;
case ERR_VIDEO_PLAYER_IS_PLAYING:
pDescription = "The video player is playing.";
break;
case ERR_VIDEO_PLAYER_IS_PAUSED:
pDescription = "The video player is paused.";
break;
case ERR_VIDEO_PLAYER_FILE_PATH_EMPTY:
pDescription = "The video playback path cannot be empty.";
break;
case ERR_MUSIC_PLAYER_IS_STOPED:
pDescription = "The background music player is stoped.";
break;
case ERR_VIDEO_PLAYER_IS_STOPED:
pDescription = "The video player is stoped.";
break;
case ERR_VIDEO_PLAYER_FILE_READ_FAILED:
pDescription = "The video file does not exist or is unreadable.";
break;
case ERR_VIDEO_PLAYER_DO_NOT_PLAYING:
pDescription = "The video player is not playing.";
break;
case ERR_VIDEO_PLAYER_DO_NOT_PAUSED:
pDescription = "The video player is not paused.";
break;
case ERR_EXCEED_ROOM_MEMBER_LIMIT:
pDescription = "The number of people joining the room exceeds the maximum limit of the server.";
break;
case ERR_EXCEED_VIDEO_PRODUCE_NUMBER_LIMIT:
pDescription = "The number of people who have opened the video exceeds the maximum limit of the server.";
break;
case EER_AUDIO_DATA_REACHED_END:
pDescription = "Audio data has reached the end.";
break;
case ERR_AUDIO_DATA_NOT_ENOUGH:
pDescription = "Not enough audio data.";
break;
case ERR_OPEN_DESKTOP_FAILED:
pDescription = "Failed to open desktop sound sharing.";
break;
case ERR_OPEN_BGMUSIC_FAILED:
pDescription = "Failed to open background music.";
break;
case ERR_REPEAT_OPEN_BGMUSIC:
pDescription = "Repeat to open the BGMusic";
break;
case ERR_REPEAT_CLOSE_BGMUSIC:
pDescription = "Repeat to close the BGMusic";
break;
case ERR_OPEN_FILE_AUDIO_FAILED:
pDescription = "Failed to open video sharing audio";
break;
case ERR_OPEN_AUDIO_EFFECT_FAILED:
pDescription = "Failed to open sound effect audio";
break;
case ERR_CREATE_SCREEN_TRACK_FAILED:
pDescription = "Screen sharing VideoTrack creation failed";
break;
case ERR_CREATE_FILE_VIDEO_TRACK_FAILED:
pDescription = "Video file sharing VideoTrack creation failed";
break;
case ERR_CREATE_CUSTOM_VIDEO_TRACK_FAILED:
pDescription = "Custom video sharing VideoTrack creation failed";
break;
case ERR_CREATE_CUSTOM_SECOND_VIDEO_TRACK_FAILED:
pDescription = "Custom second video sharing VideoTrack creation failed";
break;
case ERR_CREATE_SHARE_AUDIO_PRODUCER_FAILED:
pDescription = "Failed to create screen sound sharing producer";
break;
case ERR_CREATE_MUSIC_PRODUCER_FAILED:
pDescription = "Failed to create background music producer";
break;
case ERR_CREATE_FILE_AUDIO_PRODUCER_FAILED:
pDescription = "Failed to create video sharing audio producer";
break;
case ERR_CREATE_CUSTOM_AUDIO_PRODUCER_FAILED:
pDescription = "Failed to create custom audio producer";
break;
case ERR_CREATE_AUDIO_EFFECT_PRODUCER_FAILED:
pDescription = "Failed to create sound effect audio producer";
break;
case ERR_REPEAT_OPEN_FILE_AUDIO:
pDescription = "Open the video repeatedly to share the file audio";
break;
case ERR_REPEAT_OPEN_AUDIO_EFFECT:
pDescription = "Repeatedly open the sound effect file audio";
break;
case ERR_REPEAT_CLOSE_FILE_VIDEO:
pDescription = "Repeatedly open the sound effect file video";
break;
case ERR_REPEAT_CLOSE_FILE_AUDIO:
pDescription = "Close the video file audio repeatedly";
break;
case ERR_REPEAT_CLOSE_AUDIO_EFFECT:
pDescription = "Close the video file video repeatedly";
break;
case ERR_REPEAT_OPEN_DESKTOP:
pDescription = "Repeatedly open desktop sound sharing.";
break;
case ERR_REPEAT_CLOSE_DESKTOP:
pDescription = "Repeatedly close desktop sound sharing.";
break;
case ERR_OPERATION_FAILED:
pDescription = "operation failed.";
break;
case ERR_OPEN_CUSTOM_AUDIO_FAILED:
pDescription = "Failed to open custom audio.";
break;
case ERR_OPEN_CUSTOM_VIDEO_FAILED:
pDescription = "Failed to open custom video.";
break;
case ERR_OPEN_FILE_VIDEO_FAILED:
pDescription = "Failed to open video sharing file video.";
break;
case ERR_REPEAT_OPEN_CUSTOM_AUDIO:
pDescription = "Repeat to open custom audio.";
break;
case ERR_REPEAT_CLOSE_CUSTOM_AUDIO:
pDescription = "Repeat to close custom audio.";
break;
case ERR_PRE_INSTANCE_NOT_DESTROY:
pDescription = "The previous instance of MRTCEngine did not call destroy, and multiple instances cannot be run at the same time!";
break;
case ERR_GET_RESTART_ICE_PARAMETERS_FAILED:
pDescription = "Get ReStartICE parameter error.";
break;
case ERR_RESTARTICE_PARAM_INVALID:
pDescription = "ReStartICE parameter error.";
break;
case ERR_DOMAIN_REQUEST_CODE_FAILED:
pDescription = "Request signal url failed.";
break;
case DOMAIN_REQUEST_CURL_FAILED:
pDescription = "curl init failed!!";
break;
case ERR_DOMAIN_CURL_REQUEST_FAILED:
pDescription = "The nearest access request CURL failed.";
break;
case DOMAIN_REQUEST_DATA_EMPTY:
pDescription = "vec is empty in response";
break;
case DOMAIN_GET_RESPONSE_FAILED:
pDescription = "Parse response error.";
break;
case ERR_CREATE_SEND_TRANSPORT_ERROR_ADD_TRACK:
pDescription = "Add track failed, because of create send transport error.";
break;
case JOIN_MULTI_ROOM_SUCCESS:
pDescription = "join Multi Room success";
break;
case ERR_JOIN_MULTI_ROOM:
pDescription = "join Multi Room failed";
break;
case LEAVE_MULTI_ROOM_SUCCESS:
pDescription = "leave Multi Room success";
break;
case ERR_LEAVE_MULTI_ROOM:
pDescription = "leave Multi Room failed";
break;
case ERR_REPEAT_JOIN_MULTI_ROOM:
pDescription = "repeat join Multi Room";
break;
case RECONNECT_JOIN_MULTI_ROOM_SUCCESS:
pDescription = "reconnect join Multi Room success";
break;
case ERR_RECONNECT_JOIN_MULTI_ROOM:
pDescription = "reconnect join Multi Room failed";
break;
case ERR_JOIN_MULTI_HOST_ROOM:
pDescription = "join Multi Room can not used host roomId";
break;
case ERR_LEAVE_MULTI_HOST_ROOM:
pDescription = "leave Multi Room can not used host roomId";
break;
case ERR_REPEAT_OPEN_RAW_VIDEO:
pDescription = "Repeat to open custom raw video.";
break;
case ERR_REPEAT_CLOSE_RAW_VIDEO:
pDescription = "Repeat to close custom raw video.";
break;
case ERR_CREATE_CUSTOM_RAW_VIDEO_TRACK_FAILED:
pDescription = "Custom naked video VideoTrack creation failed.";
break;
case ERR_REQUEST_ROOM_USER_LIST_TOO_FREQUENCY:
pDescription = "Get Room Member List too frequent";
break;
case ERR_GET_ROOM_USERS_TOO_OFTEN:
pDescription = "Get Room Member List too frequent";
break;
case ERR_ROOM_MODE_MISMATCH:
pDescription = "Room mode mismatch";
break;
case ERR_INVALID_ROOM_MODE:
pDescription = "Invalid room mode";
break;
case ERR_REQUEST_RS_BEYOND_MAX:
pDescription = "request RS beyond max time";
break;
case ERR_RS_EXCEPTION:
pDescription = "RS exception";
break;
case ERR_JOIN_ROOM_BEYOND_MAX:
pDescription = "Join multiroom beyond max room number";
break;
case ERR_ROOM_CLOSED:
pDescription = "Room closed";
break;
case ERR_EXCESSIVE_REQUESTS:
pDescription = "Request peers or peer number too frequent";
break;
case ERR_UNKNOWN_ROLE:
pDescription = "Unknow role";
break;
case ERR_TRANSPORT_ERROR:
pDescription = "transport error";
break;
case ERR_REPEAT_USER:
pDescription = "Join multiroom Repeat";
break;
case ERR_PUSH_MEDIA_TIMEOUT:
pDescription = "push stream timeout";
break;
case ERR_AUTO_UPLOAD_ENABLED_CANT_USE_API:
pDescription = "Enable auto upload log, forbbiden to call uploadLog api";
break;
case AUTO_UPLOAD_SUCCEED:
pDescription = "Auto upload log success";
break;
case ERR_ENGINE_STATUS_ERR_NOT_INITED:
pDescription = "Engine status error: Not INITED";
break;
case ERR_ENGINE_STATUS_ERR_NOT_IN_ROOM:
pDescription = "Engine status error: Not IN ROOM";
break;
case ERR_VIDEO_H264_HARDWARE_ENCODE_FAILED_AND_SWITCH_TO_SOFTWARE:
pDescription = "h264 hard encoder fallback to soft encoder";
break;
case ERR_VIDEO_H265_HARDWARE_ENCODE_FAILED_AND_SWITCH_TO_SOFTWARE:
pDescription = "h265 hard encoder fallback to soft encoder";
break;
default:
pDescription = "Error: Error Return Code.";
break;
}
return pDescription;
}
enum EngineStatus
{
ENGINE_STATUS_IDL = -0x01, // 初始状态
ENGINE_STATUS_INIT = 0x00, // 初始化状态
ENGINE_STATUS_JOINROOMING = 0x01, // 正在加入房间
ENGINE_STATUS_JOINROOM = 0x02, // 加入房间
ENGINE_STATUS_LEAVEROOM = 0x03, // 离开房间
ENGINE_STATUS_UNINIT = 0x04, // 卸载状态
};
RTCENGINE_NAMESPACE_END
#endif // __RTC_ENGINE_DEFINE_HPP___