互动直播

8.1 创建互动直播

创建XHLiveManager对象

对象所属类需要实现ILiveListener接口
XHLiveManager::addChatroomGetListListener(this);
m_pLiveManager = new XHLiveManager(this);

8.2 回调函数说明

/**
* 有主播加入
* @param liveID 直播ID
* @param actorID 新加入的主播ID
*/
virtual void onActorJoined(string liveID, string actorID) = 0;

/**
* 有主播离开
* @param liveID 直播ID
* @param actorID 离开的主播ID
*/
virtual void onActorLeft(string liveID, string actorID) = 0;

/**
* 房主收到其他用户的连麦申请
* @param liveID
* @param applyUserID
*/
virtual void onApplyBroadcast(string liveID, string applyUserID) = 0;

/**
* 申请连麦用户收到的回复
* @param liveID
* @param result
*/
virtual void onApplyResponsed(string liveID, bool bAgree) = 0;

/**
* 普通用户收到连麦邀请
* @param liveID 直播ID
* @param applyUserID 发出邀请的人的ID(主播ID)
*/
virtual void onInviteBroadcast(string liveID, string applyUserID) = 0;

/**
* 主播收到的邀请连麦结果
* @param liveID 直播ID
* @param result 邀请结果
*/
virtual void onInviteResponsed(string liveID) = 0;

/**
* 一些异常情况引起的出错,请在收到该回调后主动断开直播
* @param liveID 直播ID
* @param error 错误信息
*/
virtual void onLiveError(string liveID, string error) = 0;

/**
* 聊天室成员数变化
* @param number
*/
virtual void onMembersUpdated(int number) = 0;

/**
* 自己被踢出聊天室
*/
virtual void onSelfKicked() = 0;

/**
* 自己被踢出聊天室
*/
virtual void onSelfMuted(int seconds) = 0;

/**
* 连麦者的连麦被强制停止
* @param liveID 直播ID
*/
virtual void onCommandToStopPlay(string liveID) = 0;

/**
* 收到消息
* @param message
*/
virtual void onReceivedMessage(CIMMessage* pMessage) = 0;

/**
* 收到私信消息
* @param message
*/
virtual void onReceivePrivateMessage(CIMMessage* pMessage) = 0;
virtual int getRealtimeData(string strUserId, uint8_t* data, int len) = 0;
/**
* 收到视频数据
* @param data
*/
virtual int getVideoRaw(string strUserId, int w, int h, uint8_t* videoData, int videoDataLen) = 0;

8.3 获取直播列表说明

无AEC使用方法

/**
* 获取直播列表
*/
void getLiveList()
{
XHLiveManager::getLiveList("", CHATROOM_LIST_TYPE_LIVE);
}
调用该方法后会相应chatroomQueryAllListOK回调函数
/*
* 保存直播
*/
string strInfo = "{\"id\":\"";
strInfo += strLiveId;
strInfo += "\",\"creator\":\"";
strInfo += m_pUserManager->m_ServiceParam.m_strUserId;
strInfo += "\",\"name\":\"";
strInfo += strName.GetBuffer(0);
strInfo += "\"}";
m_pLiveManager->saveToList(m_pUserManager->m_ServiceParam.m_strUserId, CHATROOM_LIST_TYPE_LIVE, strLiveId, strInfo);

AEC使用方法

/**
* 获取直播列表
*/
void getLiveList()
{
list<ChatroomInfo> listData;
CInterfaceUrls::demoRequestLiveList(listData, m_pUserManager);
chatroomQueryAllListOK(listData);
}
/*
* 保存直播
*/
string strInfo = "{\"id\":\"";
strInfo += strLiveId;
strInfo += "\",\"creator\":\"";
strInfo += m_pUserManager->m_ServiceParam.m_strUserId;
strInfo += "\",\"name\":\"";
strInfo += strName.GetBuffer(0);
strInfo += "\"}";
CInterfaceUrls::demoSaveToList(m_pUserManager->m_ServiceParam.m_strUserId, CHATROOM_LIST_TYPE_LIVE, strLiveId, strInfo);

8.4 XHLiveManager API 说明

/**
* 添加获取直播列表回调函数
* @param pChatroomGetListListener
*/
static void addChatroomGetListListener(IChatroomGetListListener* pChatroomGetListListener);
/**
* 获取直播列表
* @param strUserId用户ID
* @param listType 列表类型
*/
static void getLiveList(string strUserId, int listType);

/**
* 设置媒体类型,音频和视频可以都打开,也可以单独打开一个。
* @param mediaTypeEnum
*/
void setRtcMediaType(LIVE_MEDIA_TYPE mediaTypeEnum);

/**
* 创建直播
*/
string createLive(string strName, int chatroomType, int channelType);

/**
* 主播开始直播
* @param liveID 直播ID
*/
bool startLive(string liveID);

/**
* 观众观看直播
* @param liveID 直播ID
*/
bool watchLive(string liveID);

/**
* 观众申请连麦
* @param toID 主播的ID
*/
void applyToBroadcaster(string toID);

/**
* 房主同意连麦
* @param toID 申请连麦者的ID
*/
void agreeApplyToBroadcaster(string toID);

/**
* 房主拒绝连麦
* @param toID 申请连麦者的ID
*/
void refuseApplyToBroadcaster(string toID);

/**
* 主播邀請连麦
* @param toID 被邀请人的ID
*/
void inviteToBroadcaster(string toID);

/**
* 观众同意连麦
* @param toID 主播的ID
*/
void agreeInviteToBroadcaster(string toID);

/**
* 观众拒绝连麦
* @param toID 主播的ID
*/
void refuseInviteToBroadcaster(string toID);

/**
* 命令连麦者下麦
* @param toID 连麦者ID
*/
void commandToAudience(string toID);

/**
* 离开直播
* @param callback 结果回调
*/
void leaveLive();

/**
* 切换成大图
* @param userID 切换成大图的主播ID
*/
void changeToBig(string userID);

/**
* 切换成小图
* @param userID 切换成小图的主播ID
*/
void changeToSmall(string userID);

/**
* 动态开关音频,直播过程中可随时开关音频,直播结束后状态自动重置。
*/
void setAudioEnable(bool bEnable);

/**
* 动态开关视频,直播过程中可随时开关视频,直播结束后状态自动重置。
*/
void setVideoEnable(bool bEnable);

/**
* 发送会议消息
* @param message 发送的消息内容
* @param callback 结果回调
* @return 返回发送的消息对象
*/
CIMMessage* sendMessage(string strMessage);

/**
* 发送会议私密消息
* 私密消息只有目标用户可以收到
* @param toID 目标用户ID
* @param message 发送的消息内容
* @return 返回发送的消息对象
*/
CIMMessage* sendPrivateMessage(string toID, string strMessage);

/**
* 对会议中的某人禁言
* @param meetingID 会议ID
* @param memberID 被禁言者ID
* @param muteSeconds 禁言时间
* @param callback 结果回调
*/
bool muteMember(string liveId, string memberID, int muteSeconds);

/**
* 解除会议中某人的禁言
* @param meetingID 会议ID
* @param memberID 被禁言者ID
*/
bool unMuteMember(string liveId, string memberID);

/**
* 从会议室踢出用户
* @param meetingID 会议ID
* @param memberID 被踢者ID
*/
bool kickMember(string liveId, string memberID);

/**
* 保存到列表
* @param userId
* @param type
* @param liveId
* @param data
*/
bool saveToList(string userId, int type, string liveId, string data);

/**
* 从列表删除
* @param userId 用户ID
* @param type 类型
* @param liveId liveID
*/
void deleteFromList(string userId, int type, string liveId);

/**
* 推送RTMP流
* @param rtmpurl 推送地址
*/
void pushRtmp(string rtmpurl);

/**
* 停止推送RTMP流
*/
void stopPushRtmp();
/**
* 插入音频数据
* @param audioData
* @param dataLen
*/
void insertAudioRaw(uint8_t* audioData, int dataLen);
/**
* 插入视频数据
* @param videoData
* @param dataLen
* @param isBig
*/
void insertVideoRaw(uint8_t* videoData, int dataLen, int isBig);
/**
* 裁剪视频数据
*/
int cropVideoRawNV12(int w, int h, uint8_t* videoData, int dataLen, int yuvProcessPlan, int rotation, int needMirror, uint8_t* outVideoDataBig, uint8_t* outVideoDataSmall);
/**
* 查询音频数据
*/
void querySoundData(uint8_t** pData, int* nLength);