网易纯直播 SDK 基本操作
1 获取可用的音视频设备列表
Nlss_GetFreeDevicesNum
获取当前摄像头/麦克风的个数。
NLSS_RET Nlss_GetFreeDevicesNum(NLSS_OUT int *iVideoDeviceNum, NLSS_OUT int *iAudioDeviceNum);
NLSS_RET Nlss_GetFreeDeviceInf(NLSS_OUT ST_NLSS_INDEVICE_INF *pstVideoDevices, int iMaxVideoDevicesNum, NLSS_OUT ST_NLSS_INDEVICE_INF* pstAudioDevices, int iMaxAudioDevicesNum);
bool LssManange::GetFreeDevicesNum(int* video_num, int* audio_num){if (NLSS_OK == NLS_SDK_GET_FUNC(Nlss_GetFreeDevicesNum)(video_num, audio_num))return true;else return false;}
void CheckDeviceInfo(ST_NLSS_INDEVICE_INF** info, int num){if (num > 0){*info = new ST_NLSS_INDEVICE_INF[num];for (int i = 0; i < num; i++){(*info)[i].paPath = new char[1024];(*info)[i].paFriendlyName = new char[1024];}}}
bool LssManange::GetFreeDeviceInf(NLSS_OUT ST_NLSS_INDEVICE_INF **pstVideoDevices, int *iMaxVideoDevicesNum, NLSS_OUT ST_NLSS_INDEVICE_INF**pstAudioDevices, int *iMaxAudioDevicesNum){GetFreeDevicesNum(iMaxVideoDevicesNum, iMaxAudioDevicesNum);if (iMaxVideoDevicesNum){CheckDeviceInfo(pstVideoDevices, *iMaxVideoDevicesNum);}if (iMaxAudioDevicesNum){CheckDeviceInfo(pstAudioDevices, *iMaxAudioDevicesNum);}if (NLSS_OK == NLS_SDK_GET_FUNC(Nlss_GetFreeDeviceInf)(*pstVideoDevices, *iMaxVideoDevicesNum, *pstAudioDevices, *iMaxAudioDevicesNum))return true;else return false;}
示例:
int32_t m_iAudioDeviceNum; //麦克风数目ST_NLSS_INDEVICE_INF * m_pAudioDevices; //麦克风设备列表int32_t m_iVideoDeviceNum; //视频设备数目ST_NLSS_INDEVICE_INF * m_pVideoDevices; //视频设备列表
nim_nls::LssManange::GetFreeDeviceInf(&m_pVideoDevices, &m_iVideoDeviceNum, &m_pAudioDevices, &m_iAudioDeviceNum);
2 遍历摄像头
std::string NLSLiveForm::GetCurCameraName(){std::string curCameraPath = GetCurCameraPath();for (int i = 0; i < m_iVideoDeviceNum;i++){if (curCameraPath==m_pVideoDevices[i].paPath){return m_pVideoDevices[i].paFriendlyName;}}return "";}
int NLSLiveForm::GetCameraIndeviceIndex(std::string accid){for (int i = 0; i < m_iVideoDeviceNum;i++){if (accid.find(m_pVideoDevices[i].paPath) != std::string::npos){return i;}}return -1;
}
std::string NLSLiveForm::GetCameraNameFromPath(std::string path){for (int i = 0; i < m_iVideoDeviceNum; i++){if (path == m_pVideoDevices[i].paPath){return m_pVideoDevices[i].paFriendlyName;}}return "";}
std::string NLSLiveForm::GetCameraPathFromName(std::string name){for (int i = 0; i < m_iVideoDeviceNum; i++){if (name == m_pVideoDevices[i].paFriendlyName){return m_pVideoDevices[i].paPath;}}return "";}
std::string vedioPath;std::string firstCameraPath;//加入第一个摄像头//默认预览第一个m_VideoSourceType = EN_NLSS_VIDEOIN_CAMERA;vedioPath = m_pVideoDevices[0].paPath;firstCameraPath = m_pVideoDevices[0].paPath;m_CameraPathList.push_back(vedioPath);pCameraWnd->SetCurCamera(GetCurCameraPath(), m_CameraCaptureQ);//处于预览中,才能添加其它视频源PreView();//加入其它摄像头for (int i = 1; i < m_iVideoDeviceNum;i++){vedioPath = m_pVideoDevices[i].paPath;m_CameraPathList.push_back(vedioPath);//设置当前摄像头所能采集的清晰度pCameraWnd->SetCurCamera(GetCurCameraPath(), m_CameraCaptureQ);AddNewVideoSource(); //每次加的设备路径 为m_CameraPathList.back() 最后末尾}
3 ACCID
std::string NLSLiveForm::GetAccidFromPath(std::string path, int nVideoType)
{std::string accid;bool bVideoExisten = false;switch (nVideoType){case EN_NLSS_VIDEOIN_FULLSCREEN:accid = "video name is fullscreen";break;case EN_NLSS_VIDEOIN_CAMERA://获取视频参数if (m_pVideoDevices != NULL){// m_VideoTypeName = L"摄像头";accid = nbase::StringPrintf("child video name is camera,path :%s", path.c_str());}else{return accid;}break;case EN_NLSS_VIDEOIN_RECTSCREEN:break;case EN_NLSS_VIDEOIN_APP: if (m_pAppWinds != NULL){accid = nbase::StringPrintf("child video name is app path :%s", path.c_str());}else{return accid;}break;case EN_NLSS_VIDEOIN_PNG:{}break;case EN_NLSS_VIDEOIN_NONE:return accid;break;default:return accid;break;}return accid;
}
std::string NLSLiveForm::GetAccidFromName(std::string name){std::string path = GetCameraPathFromName(name);if (path != ""){std::string accid = GetAccidFromPath(path);return accid;}elsereturn "";}
std::string NLSLiveForm::GetCurCameraAccid(){//m_CameraPathList.back();std::string curVideoPath = m_CameraPathList.back();return GetAccidFromPath(curVideoPath);
}
_HNLSSCHILDSERVICE
std::map<std::string, _HNLSSCHILDSERVICE > nlss_child_services_; //子窗口句柄映射std::string accid; //子窗口标识符
_HNLSSCHILDSERVICE LsSession::GetChildServiceByAccid(std::string accid){nbase::NAutoLock auto_lock(&lock_);std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end()){return iter->second;}return NULL;}
打开摄像头时,创建该摄像头句柄
bool LsSession::OnChildVideoOpen(const std::string& accid, ST_NLSS_VIDEOIN_PARAM *pVideoInParam){nbase::NAutoLock auto_lock(&lock_);bool ret = false;if (ls_client_){_HNLSSCHILDSERVICE NewLsChildClient = NLS_SDK_GET_FUNC(Nlss_ChildVideoOpen)(LsClient, pVideoInParam);if (NewLsChildClient != NULL){if (nlss_child_services_.find(accid) == nlss_child_services_.end()){std::pair< std::map< std::string, _HNLSSCHILDSERVICE>::iterator, bool > inert_ret;inert_ret = nlss_child_services_.insert(std::pair<std::string, _HNLSSCHILDSERVICE >(accid, NewLsChildClient));if (inert_ret.second)ret = true;}}}if (ret == false)m_errorLog.WriteErrorFuc("OnChildVideoOpen");return ret;}
其它的摄像头管理操作,都是通过摄像头句柄实现的
设置为背景
void LsSession::OnChildVideoSetBackLayer(const std::string& accid){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoSetBackLayer)(iter->second);}
上移图层
void LsSession::OnChildVideoSetAdjustLayer(const std::string& accid, bool bAdustUp){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoAdjustLayer)(iter->second, bAdustUp);}
设置显示区域
void LsSession::OnChildVideoSetDisplayRect(const std::string& accid, ST_NLSS_RECTSCREEN_PARAM *pstRect){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoSetDisplayRect)(iter->second, pstRect);}
关闭子窗口
void LsSession::OnChildVideoClose(const std::string& accid){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end()){NLS_SDK_GET_FUNC(Nlss_ChildVideoClose)(iter->second);nlss_child_services_.erase(iter);}}
隐藏
void LsSession::OnChildVideoSwitchDisplay(const std::string& accid, bool bHide){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoSwitchDisplay)(iter->second, bHide);}
开始采集
bool LsSession::OnChildVideoStartCapture(const std::string& accid){bool ret = false;std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end()){NLSS_RET nReturn = NLS_SDK_GET_FUNC(Nlss_ChildVideoStartCapture)(iter->second);if (NLSS_OK != nReturn)m_errorLog.WriteErrorFuc("Nlss_ChildVideoStartCapture", (int)nReturn);ret = (NLSS_OK == nReturn);}return ret;}
停止采集
void LsSession::OnChildVideoStopCapture(const std::string& accid){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoStopCapture)(iter->second);}
设置单视频回调
void LsSession::OnChildVideoSetSoloPreviewCB(const std::string& accid, PFN_NLSS_CHILD_VIDEO_SAMPLER_CB pFunVideoSamplerCB){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoSetSoloPreviewCB)(iter->second, pFunVideoSamplerCB);}
单视频回调开关
void LsSession::OnChildVideoSwitchSoloPreview(const std::string& accid, bool bOn){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoSwitchSoloPreview)(iter->second, bOn);}
暂停推流
void LsSession::OnChildVideoPauseLiveStream(const std::string& accid){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoPauseLiveStream)(iter->second);}
恢复推流
void LsSession::OnChildVideoResumeLiveStream(const std::string&accid){std::map<std::string, _HNLSSCHILDSERVICE>::const_iterator iter = nlss_child_services_.find(accid);if (iter != nlss_child_services_.end())NLS_SDK_GET_FUNC(Nlss_ChildVideoResumeLiveStream)(iter->second);}
开始推流
void LsSession::DoStartLiveStream(nim_nls::OptCallback cb){bool ret = false;if (NLSS_OK == NLS_SDK_GET_FUNC(Nlss_StartLiveStream)(LsClient)){live_streaming_ = true;ret = true;}else {ret = false;}if (cb){Post2UI(nbase::Bind(cb, ret));}}
结束推流
void LsSession::DoStopLiveStream(nim_nls::OptCallback cb){nbase::NAutoLock auto_lock(&lock_);bool ret = true;if (live_streaming_ && ls_client_){NLS_SDK_GET_FUNC(Nlss_StopLiveStream)(LsClient);{live_streaming_ = false;ret = true;}}else {ret = false;}if (cb){Post2UI(nbase::Bind(cb, ret));}}
网易纯直播 SDK 基本操作相关推荐
- 网易纯直播SDK使用 视频回调
一 合成后视频回调 1 视频回调 Nlss_SetVideoSamplerCB,接受合成后的预览的每帧图像rgb32 buffer. void LsSession::SetVideoSamplerCB ...
- 网易云信直播sdk的整体传输优化
现有市场上的主流直播在传输方面,大部分使用TCP传输,也有部分使用UDP传输(类似上行使用rtc,然后在源站或者媒体服务器转换为rtmp协议再进行推流).通常来说,udp效率更高一些,但由于自身无连接 ...
- 互动直播--梳理网易互动直播流程
互动直播整体流程 本文主要目的在于理清网易互动直播的整体逻辑,要进行互动直播,我们需要做哪些方面的准备. 思路清晰了,才好进行下一步的整合. 一.直播 直播和互动直播只差了两个字,但这两个字却使得各自 ...
- 主流的第三方直播SDK对比(腾讯云、即构、阿里云、声网、网易云信、网宿)
直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...
- 第三方直播SDK对比(腾讯云,阿里云,网易云信,七牛云,金山云,声网,即构科技)
前言:由于现在直播很火,新加入的公司打算做直播功能,之前没接触于是先去看了下主流第三方平台的SDK,想看下哪个平台的更好一些.本文没什么技术含量,仅仅是将相关官网的资料整理,做了一点对比,方便看到各平 ...
- 三方直播SDK对比(腾讯云,阿里云,网易云信,七牛云,金山云,声网,即构科技)
三方直播SDK对比(腾讯云,阿里云,网易云信,七牛云,金山云,声网,即构科技) 首先看过各个平台直播SDK后大致知道平台SDK分为有2种: 直播:传统方式,1个主播,
- 第三方直播SDK对比|直播SDK如何选型
直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...
- 云直播SDK核心功能对比|腾讯云、阿里云、声网、即构等SDK厂商对比
直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...
- iOS各平台直播SDK收费明细
一.前言 现在直播SDK相当多,有收费一条龙的,也有开源的,对于大部分非专业做直播的公司,只是项目中部分模块有直播需求,当然是希望快速开发集成直播功能,大部分会选用收费直播SDK,开发周期短,上线快, ...
最新文章
- 好想自己做个迷宫呀!
- 008 python接口 unittest
- boost::alignment_of相关的测试程序
- 离开互联网行业_如何使用互联网再也不会离开家
- python IDE比较与推荐
- 实现标题条的显示与隐藏
- Python学习心路历程
- vb net excel 剪贴板 粘贴_excel表格操作: 图形和图表编辑技巧汇总(一)
- 腾讯云一站式物联PaaS平台IOT Suite助力行业加速“物联网+”
- 经典SQL练习题(MySQL版)
- stata15中文乱码_Stata14打开13数据乱码处理办法
- STM32学习记录——SIM900A实现中英文短信发送
- 详解VB对话框InputBox和MsgBox
- dspbios设计指南_视频广告设计者指南
- 如何使用微PE工具箱制作U盘PE
- 毕业论文引用参考文献的脚注方法
- RuoYi框架首页问题
- 全网营销都有那些渠道
- 利用COCO API测试自己数据集训练的YOLOv3模型的mAP(VOC格式数据集)
- vue 微信html,vue 实现微信端网页分享