CLiveViodeProc.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. #include "CLiveViodeProc.h"
  2. #include <QDebug>
  3. #include "CAppInfo.h"
  4. #include "logproc.h"
  5. std::shared_ptr<CLiveViodeProc> g_clientVideoProcPtr = nullptr;
  6. CVideoRenderCallBack::CVideoRenderCallBack()
  7. {
  8. m_nLastFrameTime = 0;
  9. }
  10. void CVideoRenderCallBack::onRenderVideoFrame(const char* userId, TRTCVideoStreamType streamType, TRTCVideoFrame* frame)
  11. {
  12. // if(g_inProcessFaceVerify && streamType == TRTCVideoStreamTypeBig)
  13. // {
  14. // __int64 curTime = g_appInfoPtr->serverMTime();
  15. // if(curTime - m_nLastFrameTime >= g_appInfoPtr->m_vFaceMoudleInfo.ipfc.nFaceDetectIntervalSeconds)
  16. // {
  17. // cv::Mat matImg;
  18. // cv::cvtColor(cv::Mat(frame->height, frame->width, CV_8UC4, frame->data), matImg, CV_RGBA2RGB);
  19. // IMAGE_INFO imgInfo;
  20. // imgInfo.matImage = matImg.clone();
  21. // g_inProcessFaceVerify->addImage(imgInfo);
  22. // m_nLastFrameTime = curTime;
  23. // }
  24. // }
  25. }
  26. CLiveViodeProc::CLiveViodeProc()
  27. {
  28. m_hwnd = nullptr;
  29. m_nLiveType = lt_unknown;
  30. m_bEnableLocalAudo = false;
  31. m_bPlay = false;
  32. m_nCameraCount = 0;
  33. m_sCameraStreamName = "";
  34. m_sCameraStreamRecordId = "";
  35. m_sScreenStreamName = "";
  36. m_sScreenStreamRecordId = "";
  37. m_bIsCameraTest = false;
  38. // 创建 TRTCCloud 实例
  39. m_pTRTCSDK = getTRTCShareInstance();
  40. // 注册 SDK 回调事件
  41. m_pTRTCSDK->addCallback(this);
  42. m_pVideoRenderCallBack = new CVideoRenderCallBack;
  43. // m_pVideoRenderCallBack->setCallBack([this](cv::Mat frame)
  44. // {
  45. // emit videoFrame(frame);
  46. // });
  47. }
  48. CLiveViodeProc::~CLiveViodeProc()
  49. {
  50. exitRoom();
  51. // 取消监听 SDK 事件
  52. if(m_pTRTCSDK)
  53. {
  54. m_pTRTCSDK->removeCallback(this);
  55. }
  56. // 释放 TRTCCloud 实例
  57. if(m_pTRTCSDK != nullptr)
  58. {
  59. destroyTRTCShareInstance();
  60. m_pTRTCSDK = nullptr;
  61. }
  62. if(m_pVideoRenderCallBack != nullptr)
  63. {
  64. delete m_pVideoRenderCallBack;
  65. }
  66. }
  67. void CLiveViodeProc::startTest(HWND hwnd)
  68. {
  69. // m_pTRTCSDK->getDeviceManager()->setCurrentDevice(TXMediaDeviceTypeCamera, 0);
  70. m_pTRTCSDK->getDeviceManager()->startCameraDeviceTest(hwnd);
  71. m_bIsCameraTest = true;
  72. }
  73. int CLiveViodeProc::getCameraCount()
  74. {
  75. // if(m_nCameraCount == 0)
  76. {
  77. m_nCameraCount = m_pTRTCSDK->getDeviceManager()->getDevicesList(TXMediaDeviceTypeCamera)->getCount();
  78. }
  79. return m_nCameraCount;
  80. }
  81. QString CLiveViodeProc::setCurrentCamera(int nIndex)
  82. {
  83. if(nIndex < m_nCameraCount)
  84. {
  85. const char *pid = m_pTRTCSDK->getDeviceManager()->getDevicesList(TXMediaDeviceTypeCamera)->getDevicePID(nIndex);
  86. m_pTRTCSDK->getDeviceManager()->setCurrentDevice(TXMediaDeviceTypeCamera, pid);
  87. return pid;
  88. }
  89. }
  90. QString CLiveViodeProc::getCurrentCamera()
  91. {
  92. const char *pid = m_pTRTCSDK->getDeviceManager()->getCurrentDevice(TXMediaDeviceTypeCamera)->getDevicePID();
  93. return pid;
  94. }
  95. void CLiveViodeProc::startTest(ITRTCVideoRenderCallback *pCallBack, bool bHighDpi)
  96. {
  97. if(!bHighDpi)
  98. {
  99. m_pTRTCSDK->getDeviceManager()->startCameraDeviceTest(pCallBack);
  100. }
  101. else
  102. {
  103. qDebug()<<"TRTCVideoEncParam";
  104. TRTCVideoEncParam params;
  105. params.resMode = TRTCVideoResolutionModeLandscape;
  106. params.videoFps = 10;
  107. params.videoBitrate = 600;
  108. params.videoResolution = TRTCVideoResolution_960_720;
  109. m_pTRTCSDK->setVideoEncoderParam(params);
  110. TRTCRenderParams renderParams;
  111. renderParams.fillMode = TRTCVideoFillMode_Fit;
  112. m_pTRTCSDK->setLocalRenderParams(renderParams);
  113. m_pTRTCSDK->startLocalPreview(nullptr);
  114. m_pTRTCSDK->setLocalVideoRenderCallback(TRTCVideoPixelFormat_BGRA32, TRTCVideoBufferType_Buffer, pCallBack);
  115. }
  116. m_bIsCameraTest = true;
  117. }
  118. void CLiveViodeProc::stopTest(bool bHighDpi)
  119. {
  120. if(m_bIsCameraTest)
  121. {
  122. m_bIsCameraTest = false;
  123. if(!bHighDpi)
  124. {
  125. m_pTRTCSDK->getDeviceManager()->stopCameraDeviceTest();
  126. }
  127. else
  128. {
  129. m_pTRTCSDK->stopLocalPreview();
  130. m_pTRTCSDK->setLocalVideoRenderCallback(TRTCVideoPixelFormat_BGRA32, TRTCVideoBufferType_Buffer, nullptr);
  131. }
  132. }
  133. }
  134. bool CLiveViodeProc::isCameraTest()
  135. {
  136. return m_bIsCameraTest;
  137. }
  138. void CLiveViodeProc::setHandle(HWND hwnd)
  139. {
  140. if(hwnd != nullptr && m_hwnd == nullptr)
  141. {
  142. m_pTRTCSDK->startLocalPreview(hwnd);
  143. myDebug()<<"startLocalPreview";
  144. }
  145. else if(hwnd == nullptr)
  146. {
  147. m_pTRTCSDK->stopLocalPreview();
  148. myDebug()<<"stopLocalPreview";
  149. }
  150. else
  151. {
  152. m_pTRTCSDK->updateLocalView(hwnd);
  153. myDebug()<<"updateLocalView";
  154. }
  155. m_hwnd = hwnd;
  156. }
  157. void CLiveViodeProc::enableFrameCallBack(bool bEnable)
  158. {
  159. m_bFrameCallBack = bEnable;
  160. }
  161. void CLiveViodeProc::enableLoaclAudio(bool bEnable)
  162. {
  163. m_bEnableLocalAudo = bEnable;
  164. }
  165. void CLiveViodeProc::startPlayAudio()
  166. {
  167. m_bPlay = true;
  168. }
  169. void CLiveViodeProc::initParam(int nLiveType, uint32_t nSdkAppId, std::string sUserId, std::string sUserSig,
  170. std::string sRoomId, std::string sCameraStreamName, std::string sCameraStreamRecordId,
  171. std::string sScreenStreamName, std::string sScreenStreamRecordId)
  172. {
  173. m_nSdkAppId = nSdkAppId;
  174. m_sUserId = sUserId;
  175. m_sUserSig = sUserSig;
  176. m_sRoomId = sRoomId;
  177. m_nLiveType = nLiveType;
  178. m_sCameraStreamName = sCameraStreamName;
  179. m_sScreenStreamName = sScreenStreamName;
  180. m_sCameraStreamRecordId = sCameraStreamRecordId;
  181. m_sScreenStreamRecordId = sScreenStreamRecordId;
  182. }
  183. void CLiveViodeProc::EnterRoom()
  184. {
  185. try
  186. {
  187. TRTCParams params;
  188. params.sdkAppId = m_nSdkAppId;//1400411036;
  189. params.userId = m_sUserId.c_str();//"s03";
  190. params.userSig = m_sUserSig.c_str();//"eJwtzFELgjAUhuH-suuQczanJnQRFCwygjLLy2ArDmXZJiZF-z2ZXn7PB**X5dk*aI1lKeMBsInfpM2joQt5diBGdvp2rmvSLMUQIEQEEQ2P6WqypncpJQeAQRuqvE1jjsijZKzQta9WC7ni7qV0gUeH78OpzNyuEE*Z2Gb70bEK712r5vl6uZmx3x9ryDAN";
  191. params.roomId = 0; // 输入您想进入的房间
  192. params.strRoomId = m_sRoomId.c_str();
  193. params.role = TRTCRoleAnchor; //主播
  194. std::string streamId = "";
  195. std::string recordId = "";
  196. streamId = m_sCameraStreamName;//QString("oe_%1_client_camera").arg(params.roomId).toStdString();
  197. recordId = m_sCameraStreamRecordId;
  198. if(m_nLiveType == lt_client_screen)
  199. {
  200. streamId = m_sScreenStreamName;//QString("oe_%1_client_screen").arg(params.roomId).toStdString();
  201. recordId = m_sScreenStreamRecordId;
  202. }
  203. params.streamId = streamId.c_str();
  204. if(recordId != "")
  205. {
  206. params.userDefineRecordId = recordId.c_str();
  207. }
  208. myDebug()<<params.streamId;
  209. if(m_pTRTCSDK)
  210. {
  211. m_pTRTCSDK->setDefaultStreamRecvMode(false, false);
  212. m_pTRTCSDK->enterRoom(params, TRTCAppSceneLIVE);
  213. }
  214. }
  215. catch(std::exception &e)
  216. {
  217. myDebug()<<e.what();
  218. }
  219. }
  220. void CLiveViodeProc::exitRoom()
  221. {
  222. if(m_pTRTCSDK)
  223. {
  224. m_pTRTCSDK->exitRoom();
  225. if(m_nLiveType == lt_client_camera)
  226. {
  227. m_pTRTCSDK->stopLocalPreview();
  228. m_pTRTCSDK->stopLocalAudio();
  229. }
  230. else if(m_nLiveType == lt_client_screen)
  231. {
  232. m_pTRTCSDK->stopScreenCapture();
  233. }
  234. else if(m_nLiveType == lt_client_camera_screen)
  235. {
  236. m_pTRTCSDK->stopLocalPreview();
  237. m_pTRTCSDK->stopLocalAudio();
  238. m_pTRTCSDK->stopScreenCapture();
  239. }
  240. }
  241. }
  242. void CLiveViodeProc::onError(TXLiteAVError errCode, const char* errMsg, void* arg)
  243. {
  244. QString sErrorStr = QString::fromLocal8Bit("errMsg:%1,errCode:%2").arg(errMsg).arg(errCode);
  245. qDebug() << "errCode:" << errCode << "errMsg:" << errMsg;
  246. if (errCode == ERR_ROOM_ENTER_FAIL)
  247. {
  248. emit videoErrorMsg(sErrorStr);
  249. exitRoom();
  250. }
  251. else if(errCode == ERR_CAMERA_START_FAIL ||
  252. errCode == ERR_CAMERA_NOT_AUTHORIZED ||
  253. errCode == ERR_CAMERA_SET_PARAM_FAIL ||
  254. errCode == ERR_CAMERA_OCCUPY)
  255. {
  256. emit cameraUseFailed();
  257. }
  258. }
  259. void CLiveViodeProc::onWarning(TXLiteAVWarning warningCode, const char* warningMsg, void* arg)
  260. {
  261. qDebug() << "warningCode:" << warningCode << "warningMsg:" << warningMsg;
  262. if(warningCode == WARNING_CAMERA_DEVICE_EMPTY ||
  263. warningCode == WARNING_CAMERA_NOT_AUTHORIZED)
  264. {
  265. emit cameraUseFailed();
  266. }
  267. }
  268. void CLiveViodeProc::onEnterRoom(int result)
  269. {
  270. try
  271. {
  272. if(result < 0)
  273. {
  274. emit videoErrorMsg(QString::fromLocal8Bit("开启推流失败,错误代码:").arg(result));
  275. return;
  276. }
  277. myDebug()<<"onEnterRoom";
  278. // 获取渲染窗口的句柄。
  279. if(m_pTRTCSDK)
  280. {
  281. // 调用 SDK 接口设置渲染模式和渲染窗口。
  282. if(m_nLiveType == lt_client_camera)
  283. {
  284. TRTCVideoEncParam params;
  285. params.resMode = TRTCVideoResolutionModeLandscape;
  286. params.videoFps = 15;
  287. params.videoResolution = TRTCVideoResolution_640_480;
  288. m_pTRTCSDK->setVideoEncoderParam(params);
  289. TRTCRenderParams renderParams;
  290. renderParams.fillMode = TRTCVideoFillMode_Fit;
  291. m_pTRTCSDK->setLocalRenderParams(renderParams);
  292. // m_pTRTCSDK->setLocalViewFillMode(TRTCVideoFillMode_Fit);
  293. m_pTRTCSDK->startLocalPreview(m_hwnd);
  294. if(m_bFrameCallBack)
  295. {
  296. m_pTRTCSDK->setLocalVideoRenderCallback(TRTCVideoPixelFormat_BGRA32, TRTCVideoBufferType_Buffer, m_pVideoRenderCallBack);
  297. }
  298. }
  299. else if(m_nLiveType == lt_client_screen)
  300. {
  301. TRTCScreenCaptureSourceInfo source;
  302. source.type = TRTCScreenCaptureSourceTypeScreen;
  303. RECT rt = { 0, 0, 0, 0 };
  304. TRTCScreenCaptureProperty captureProperty;
  305. captureProperty.enableHighLight = false;
  306. m_pTRTCSDK->selectScreenCaptureTarget(source, rt, captureProperty);
  307. TRTCVideoEncParam params;
  308. params.resMode = TRTCVideoResolutionModeLandscape;
  309. params.videoFps = 15;
  310. params.videoResolution = TRTCVideoResolution_640_480;
  311. m_pTRTCSDK->startScreenCapture(nullptr, TRTCVideoStreamTypeBig, &params);
  312. }
  313. else
  314. {
  315. TRTCVideoEncParam params;
  316. params.resMode = TRTCVideoResolutionModeLandscape;
  317. params.videoFps = 15;
  318. params.videoResolution = TRTCVideoResolution_640_480;
  319. m_pTRTCSDK->setVideoEncoderParam(params);
  320. TRTCRenderParams renderParams;
  321. renderParams.fillMode = TRTCVideoFillMode_Fit;
  322. m_pTRTCSDK->setLocalRenderParams(renderParams);
  323. m_pTRTCSDK->startLocalPreview(m_hwnd);
  324. if(m_bFrameCallBack)
  325. {
  326. m_pTRTCSDK->setLocalVideoRenderCallback(TRTCVideoPixelFormat_BGRA32, TRTCVideoBufferType_Buffer, m_pVideoRenderCallBack);
  327. }
  328. TRTCScreenCaptureSourceInfo source;
  329. source.type = TRTCScreenCaptureSourceTypeScreen;
  330. RECT rt = { 0, 0, 0, 0 };
  331. TRTCScreenCaptureProperty captureProperty;
  332. captureProperty.enableHighLight = false;
  333. m_pTRTCSDK->selectScreenCaptureTarget(source, rt, captureProperty);
  334. TRTCVideoEncParam paramsScreen;
  335. paramsScreen.resMode = TRTCVideoResolutionModeLandscape;
  336. paramsScreen.videoFps = 15;
  337. paramsScreen.videoResolution = TRTCVideoResolution_640_480;
  338. m_pTRTCSDK->startScreenCapture(nullptr, TRTCVideoStreamTypeSub, &paramsScreen);
  339. std::string streamId = m_sScreenStreamName;//QString("oe_%1_client_screen").arg(m_nRoomId).toStdString();
  340. m_pTRTCSDK->startPublishing(streamId.c_str(), TRTCVideoStreamTypeSub);
  341. }
  342. if(m_bEnableLocalAudo)
  343. {
  344. m_pTRTCSDK->enableAudioVolumeEvaluation(300);
  345. m_pTRTCSDK->setAudioCaptureVolume(100);
  346. // m_pTRTCSDK->setAudioQuality(TRTCAudioQualitySpeech);
  347. m_pTRTCSDK->startLocalAudio(TRTCAudioQualitySpeech);
  348. }
  349. emit enterRoomSucceed();
  350. }
  351. }
  352. catch(std::exception &e)
  353. {
  354. myDebug()<<e.what();
  355. }
  356. }
  357. void CLiveViodeProc::onExitRoom(int reason)
  358. {
  359. }
  360. void CLiveViodeProc::onRemoteUserEnterRoom(const char* userId)
  361. {
  362. QString sUserId = userId;
  363. if(sUserId.startsWith("m_"))
  364. {
  365. emit invigilatorEnterRoom();
  366. myDebug()<<"invigilatorEnterRoom";
  367. }
  368. }
  369. void CLiveViodeProc::onRemoteUserLeaveRoom(const char* userId, int reason)
  370. {
  371. QString sUserId = userId;
  372. if(sUserId.startsWith("m_"))
  373. {
  374. emit invigilatorLeaveRoom();
  375. myDebug()<<"invigilatorLeaveRoom";
  376. }
  377. }
  378. void CLiveViodeProc::onUserVideoAvailable(const char* userId, bool available)
  379. {
  380. // if(available)
  381. // {
  382. // qDebug()<<userId;
  383. // if(m_pTRTCSDK)
  384. // {
  385. // m_pTRTCSDK->startRemoteView(userId, m_hwnd);
  386. // }
  387. // }
  388. // else
  389. // {
  390. // if(m_pTRTCSDK)
  391. // {
  392. // m_pTRTCSDK->stopRemoteView(userId);
  393. // }
  394. // }
  395. }
  396. void CLiveViodeProc::onUserAudioAvailable(const char* userId, bool available)
  397. {
  398. QString sUserId = userId;
  399. if(sUserId.startsWith("m_"))
  400. {
  401. if(available)
  402. {
  403. if(/*m_bPlay && */m_pTRTCSDK)
  404. {
  405. m_pTRTCSDK->muteRemoteAudio(userId, false);
  406. }
  407. }
  408. else
  409. {
  410. m_bPlay = false;
  411. if(m_pTRTCSDK)
  412. {
  413. m_pTRTCSDK->muteRemoteAudio(userId, true);
  414. }
  415. }
  416. }
  417. }
  418. void CLiveViodeProc::onUserVoiceVolume(TRTCVolumeInfo* userVolumes, uint32_t userVolumesCount, uint32_t totalVolume)
  419. {
  420. TRTCVolumeInfo *pVolumeInfo = userVolumes;
  421. for(int i = 0; i < userVolumesCount; i++)
  422. {
  423. QString sUserId = pVolumeInfo->userId;
  424. if(sUserId.startsWith("m_"))
  425. {
  426. emit invigilatorVolume(pVolumeInfo->volume);
  427. }
  428. pVolumeInfo++;
  429. }
  430. }
  431. void CLiveViodeProc::onConnectionLost()
  432. {
  433. emit videoConnectionLost();
  434. }
  435. void CLiveViodeProc::onConnectionRecovery()
  436. {
  437. emit videoConnectionRecovery();
  438. }