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 基本操作相关推荐

  1. 网易纯直播SDK使用 视频回调

    一 合成后视频回调 1 视频回调 Nlss_SetVideoSamplerCB,接受合成后的预览的每帧图像rgb32 buffer. void LsSession::SetVideoSamplerCB ...

  2. 网易云信直播sdk的整体传输优化

    现有市场上的主流直播在传输方面,大部分使用TCP传输,也有部分使用UDP传输(类似上行使用rtc,然后在源站或者媒体服务器转换为rtmp协议再进行推流).通常来说,udp效率更高一些,但由于自身无连接 ...

  3. 互动直播--梳理网易互动直播流程

    互动直播整体流程 本文主要目的在于理清网易互动直播的整体逻辑,要进行互动直播,我们需要做哪些方面的准备. 思路清晰了,才好进行下一步的整合. 一.直播 直播和互动直播只差了两个字,但这两个字却使得各自 ...

  4. 主流的第三方直播SDK对比(腾讯云、即构、阿里云、声网、网易云信、网宿)

    直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...

  5. 第三方直播SDK对比(腾讯云,阿里云,网易云信,七牛云,金山云,声网,即构科技)

    前言:由于现在直播很火,新加入的公司打算做直播功能,之前没接触于是先去看了下主流第三方平台的SDK,想看下哪个平台的更好一些.本文没什么技术含量,仅仅是将相关官网的资料整理,做了一点对比,方便看到各平 ...

  6. 三方直播SDK对比(腾讯云,阿里云,网易云信,七牛云,金山云,声网,即构科技)

    三方直播SDK对比(腾讯云,阿里云,网易云信,七牛云,金山云,声网,即构科技) 首先看过各个平台直播SDK后大致知道平台SDK分为有2种: 直播:传统方式,1个主播,

  7. 第三方直播SDK对比|直播SDK如何选型

    直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...

  8. 云直播SDK核心功能对比|腾讯云、阿里云、声网、即构等SDK厂商对比

    直播业务概述 大家所熟知的直播平台虎牙.斗鱼.快手.抖音.B站,直播功能看似普遍,但从零到一开发却不简单.直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技术,学好 ...

  9. iOS各平台直播SDK收费明细

    一.前言 现在直播SDK相当多,有收费一条龙的,也有开源的,对于大部分非专业做直播的公司,只是项目中部分模块有直播需求,当然是希望快速开发集成直播功能,大部分会选用收费直播SDK,开发周期短,上线快, ...

最新文章

  1. 好想自己做个迷宫呀!
  2. 008 python接口 unittest
  3. boost::alignment_of相关的测试程序
  4. 离开互联网行业_如何使用互联网再也不会离开家
  5. python IDE比较与推荐
  6. 实现标题条的显示与隐藏
  7. Python学习心路历程
  8. vb net excel 剪贴板 粘贴_excel表格操作: 图形和图表编辑技巧汇总(一)
  9. 腾讯云一站式物联PaaS平台IOT Suite助力行业加速“物联网+”
  10. 经典SQL练习题(MySQL版)
  11. stata15中文乱码_Stata14打开13数据乱码处理办法
  12. STM32学习记录——SIM900A实现中英文短信发送
  13. 详解VB对话框InputBox和MsgBox
  14. dspbios设计指南_视频广告设计者指南
  15. 如何使用微PE工具箱制作U盘PE
  16. 毕业论文引用参考文献的脚注方法
  17. RuoYi框架首页问题
  18. 全网营销都有那些渠道
  19. 利用COCO API测试自己数据集训练的YOLOv3模型的mAP(VOC格式数据集)
  20. vue 微信html,vue 实现微信端网页分享

热门文章

  1. Linux系统应用 Centos7共享服务samba设置
  2. python绘制优势率
  3. 楼盘vr实景线上虚拟展示功能及特点
  4. 2021年软件技术部Linux培训
  5. 推荐几个免费dns服务器
  6. 分享一个微信小程序UI案例,好看的小程序UI
  7. 数据结构4——linuxC(二叉树和排序算法)
  8. hp-unix 11i v3 中文牛X资料
  9. CANoe UDS测试环境搭建
  10. 国庆贺礼 - 10.1