EasyGBD_DemoDlg.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. 
  2. // EasyGBD_DemoDlg.cpp: 实现文件
  3. //
  4. #include "pch.h"
  5. #include "framework.h"
  6. #include "EasyGBD_Demo.h"
  7. #include "EasyGBD_DemoDlg.h"
  8. #include "afxdialogex.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #endif
  12. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  13. class CAboutDlg : public CDialogEx
  14. {
  15. public:
  16. CAboutDlg();
  17. // 对话框数据
  18. #ifdef AFX_DESIGN_TIME
  19. enum { IDD = IDD_ABOUTBOX };
  20. #endif
  21. protected:
  22. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  23. // 实现
  24. protected:
  25. DECLARE_MESSAGE_MAP()
  26. };
  27. CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
  28. {
  29. }
  30. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CDialogEx::DoDataExchange(pDX);
  33. }
  34. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  35. END_MESSAGE_MAP()
  36. // CEasyGBDDemoDlg 对话框
  37. CEasyGBDDemoDlg::CEasyGBDDemoDlg(CWnd* pParent /*=nullptr*/)
  38. : CDialogEx(IDD_EASYGBD_DEMO_DIALOG, pParent)
  39. {
  40. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  41. InitMutex(&mLogMutex);
  42. memset(&mGB28181Device, 0x00, sizeof(GB28181_DEVICE_T));
  43. }
  44. void CEasyGBDDemoDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46. CDialogEx::DoDataExchange(pDX);
  47. }
  48. BEGIN_MESSAGE_MAP(CEasyGBDDemoDlg, CDialogEx)
  49. ON_WM_SYSCOMMAND()
  50. ON_WM_PAINT()
  51. ON_WM_QUERYDRAGICON()
  52. ON_BN_CLICKED(IDC_BUTTON_STARTUP, &CEasyGBDDemoDlg::OnBnClickedButtonStart)
  53. ON_WM_DESTROY()
  54. ON_BN_CLICKED(IDC_BUTTON_SHUTDOWN, &CEasyGBDDemoDlg::OnBnClickedButtonShutdown)
  55. ON_BN_CLICKED(IDC_BUTTON_BROWSE, &CEasyGBDDemoDlg::OnBnClickedButtonBrowse)
  56. ON_MESSAGE(WM_UPDATE_LOG, OnUpdateLog)
  57. END_MESSAGE_MAP()
  58. // CEasyGBDDemoDlg 消息处理程序
  59. BOOL CEasyGBDDemoDlg::OnInitDialog()
  60. {
  61. CDialogEx::OnInitDialog();
  62. // 将“关于...”菜单项添加到系统菜单中。
  63. // IDM_ABOUTBOX 必须在系统命令范围内。
  64. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  65. ASSERT(IDM_ABOUTBOX < 0xF000);
  66. CMenu* pSysMenu = GetSystemMenu(FALSE);
  67. if (pSysMenu != nullptr)
  68. {
  69. BOOL bNameValid;
  70. CString strAboutMenu;
  71. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  72. ASSERT(bNameValid);
  73. if (!strAboutMenu.IsEmpty())
  74. {
  75. pSysMenu->AppendMenu(MF_SEPARATOR);
  76. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  77. }
  78. }
  79. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
  80. // 执行此操作
  81. SetIcon(m_hIcon, TRUE); // 设置大图标
  82. SetIcon(m_hIcon, FALSE); // 设置小图标
  83. // TODO: 在此添加额外的初始化代码
  84. SetWindowText(TEXT("EasyGBD_Win(Powered by EasyDarwin)"));
  85. pEdtServerSipID = (CEdit*)GetDlgItem(IDC_EDIT_SERVER_SIPID);
  86. pEdtServerIP = (CEdit*)GetDlgItem(IDC_EDIT_SERVER_IP);
  87. pEdtServerPort = (CEdit*)GetDlgItem(IDC_EDIT_SERVER_PORT);
  88. pEdtRegExpire = (CEdit*)GetDlgItem(IDC_EDIT_REG_EXPIRE);
  89. pEdtHeartbeatCount = (CEdit*)GetDlgItem(IDC_EDIT_HEARTBEAT_COUNT);
  90. pEdtHeartbeatInterval = (CEdit*)GetDlgItem(IDC_EDIT_HEARTBEAT_INTERVAL);
  91. pComboxProtocol = (CComboBox*)GetDlgItem(IDC_COMBO_PROTOCOL);
  92. pEdtPassword = (CEdit*)GetDlgItem(IDC_EDIT_PASSWORD);
  93. pEdtLocalSipID = (CEdit*)GetDlgItem(IDC_EDIT_LOCAL_SIPID);
  94. pEdtLocalPort = (CEdit*)GetDlgItem(IDC_EDIT_LOCAL_PORT);
  95. pEdtSourceURL = (CEdit*)GetDlgItem(IDC_EDIT_SOURCE_URL);
  96. pBtnStartup = (CButton*)GetDlgItem(IDC_BUTTON_STARTUP);
  97. pBtnShutdown = (CButton*)GetDlgItem(IDC_BUTTON_SHUTDOWN);
  98. pRichEditLog = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT2_LOG);
  99. pEdtServerSipID->SetWindowTextW(TEXT("11010100032008000001"));
  100. pEdtServerIP->SetWindowTextW(TEXT("192.168.0.106"));
  101. pEdtServerPort->SetWindowTextW(TEXT("5060"));
  102. pEdtRegExpire->SetWindowTextW(TEXT("3600"));
  103. pEdtHeartbeatCount->SetWindowTextW(TEXT("3"));
  104. pEdtHeartbeatInterval->SetWindowTextW(TEXT("60"));
  105. pComboxProtocol->AddString(TEXT("UDP"));
  106. pComboxProtocol->AddString(TEXT("TCP"));
  107. pComboxProtocol->SetCurSel(0);
  108. pEdtPassword->SetWindowTextW(TEXT("12345678"));
  109. pEdtLocalSipID->SetWindowTextW(TEXT("34020000001320000911"));
  110. pEdtLocalPort->SetWindowTextW(TEXT("15090"));
  111. pEdtSourceURL->SetWindowTextW(TEXT("视频源或者文件URL,例如:\"rtsp://...\",\"D:\\video\\gb.mp4\",\"http://...\""));
  112. OnBnClickedButtonShutdown();
  113. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  114. }
  115. void CEasyGBDDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
  116. {
  117. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  118. {
  119. CAboutDlg dlgAbout;
  120. dlgAbout.DoModal();
  121. }
  122. else
  123. {
  124. CDialogEx::OnSysCommand(nID, lParam);
  125. }
  126. }
  127. // 如果向对话框添加最小化按钮,则需要下面的代码
  128. // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
  129. // 这将由框架自动完成。
  130. void CEasyGBDDemoDlg::OnPaint()
  131. {
  132. if (IsIconic())
  133. {
  134. CPaintDC dc(this); // 用于绘制的设备上下文
  135. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  136. // 使图标在工作区矩形中居中
  137. int cxIcon = GetSystemMetrics(SM_CXICON);
  138. int cyIcon = GetSystemMetrics(SM_CYICON);
  139. CRect rect;
  140. GetClientRect(&rect);
  141. int x = (rect.Width() - cxIcon + 1) / 2;
  142. int y = (rect.Height() - cyIcon + 1) / 2;
  143. // 绘制图标
  144. dc.DrawIcon(x, y, m_hIcon);
  145. }
  146. else
  147. {
  148. CDialogEx::OnPaint();
  149. }
  150. }
  151. //当用户拖动最小化窗口时系统调用此函数取得光标
  152. //显示。
  153. HCURSOR CEasyGBDDemoDlg::OnQueryDragIcon()
  154. {
  155. return static_cast<HCURSOR>(m_hIcon);
  156. }
  157. bool MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
  158. {
  159. // Get the required size of the buffer that receives the Unicode
  160. // string.
  161. DWORD dwMinSize;
  162. dwMinSize = MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, NULL, 0);
  163. if (dwSize < dwMinSize)
  164. {
  165. return false;
  166. }
  167. // Convert headers from ASCII to Unicode.
  168. MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
  169. return true;
  170. }
  171. bool WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
  172. {
  173. DWORD dwMinSize;
  174. dwMinSize = WideCharToMultiByte(CP_UTF8, NULL, lpcwszStr, -1, NULL, 0, NULL, FALSE);
  175. if (dwSize < dwMinSize)
  176. {
  177. return false;
  178. }
  179. WideCharToMultiByte(CP_UTF8, NULL, lpcwszStr, -1, lpszStr, dwSize, NULL, FALSE);
  180. return true;
  181. }
  182. void CEasyGBDDemoDlg::OnBnClickedButtonStart()
  183. {
  184. // TODO: 在此添加控件通知处理程序代码
  185. wchar_t wszServerSipId[32] = { 0 };
  186. char szServerSipId[32] = { 0 };
  187. pEdtServerSipID->GetWindowTextW(wszServerSipId, sizeof(wszServerSipId));
  188. WCharToMByte(wszServerSipId, szServerSipId, sizeof(szServerSipId) / sizeof(szServerSipId[0]));
  189. wchar_t wszServerIP[32] = { 0 };
  190. char szServerIP[32] = { 0 };
  191. pEdtServerIP->GetWindowTextW(wszServerIP, sizeof(wszServerIP));
  192. WCharToMByte(wszServerIP, szServerIP, sizeof(szServerIP) / sizeof(szServerIP[0]));
  193. wchar_t wszServerPort[16] = { 0 };
  194. char szServerPort[16] = { 0 };
  195. pEdtServerPort->GetWindowTextW(wszServerPort, sizeof(wszServerPort));
  196. WCharToMByte(wszServerPort, szServerPort, sizeof(szServerPort) / sizeof(szServerPort[0]));
  197. wchar_t wszRegExpire[16] = { 0 };
  198. char szRegExpire[16] = { 0 };
  199. pEdtRegExpire->GetWindowTextW(wszRegExpire, sizeof(wszRegExpire));
  200. WCharToMByte(wszRegExpire, szRegExpire, sizeof(szRegExpire) / sizeof(szRegExpire[0]));
  201. wchar_t wszHeartbeatCount[16] = { 0 };
  202. char szHeartbeatCount[16] = { 0 };
  203. pEdtHeartbeatCount->GetWindowTextW(wszHeartbeatCount, sizeof(wszHeartbeatCount));
  204. WCharToMByte(wszHeartbeatCount, szHeartbeatCount, sizeof(szHeartbeatCount) / sizeof(szHeartbeatCount[0]));
  205. wchar_t wszHeartbeatInterval[16] = { 0 };
  206. char szHeartbeatInterval[16] = { 0 };
  207. pEdtHeartbeatInterval->GetWindowTextW(wszHeartbeatInterval, sizeof(wszHeartbeatInterval));
  208. WCharToMByte(wszHeartbeatInterval, szHeartbeatInterval, sizeof(szHeartbeatInterval) / sizeof(szHeartbeatInterval[0]));
  209. int protocol = pComboxProtocol->GetCurSel();
  210. wchar_t wszPassword[32] = { 0 };
  211. char szPassword[32] = { 0 };
  212. pEdtPassword->GetWindowTextW(wszPassword, sizeof(wszPassword));
  213. WCharToMByte(wszPassword, szPassword, sizeof(szPassword) / sizeof(szPassword[0]));
  214. wchar_t wszLocalSipID[32] = { 0 };
  215. char szLocalSipID[32] = { 0 };
  216. pEdtLocalSipID->GetWindowTextW(wszLocalSipID, sizeof(wszLocalSipID));
  217. WCharToMByte(wszLocalSipID, szLocalSipID, sizeof(szLocalSipID) / sizeof(szLocalSipID[0]));
  218. wchar_t wszLocalPort[16] = { 0 };
  219. char szLocalPort[16] = { 0 };
  220. pEdtLocalPort->GetWindowTextW(wszLocalPort, sizeof(wszLocalPort));
  221. WCharToMByte(wszLocalPort, szLocalPort, sizeof(szLocalPort) / sizeof(szLocalPort[0]));
  222. wchar_t wszSourceURL[1024] = { 0 };
  223. char szSourceURL[1024] = { 0 };
  224. pEdtSourceURL->GetWindowTextW(wszSourceURL, sizeof(wszSourceURL));
  225. WCharToMByte(wszSourceURL, szSourceURL, sizeof(szSourceURL) / sizeof(szSourceURL[0]));
  226. Startup(szServerSipId, szServerIP, atoi(szServerPort), atoi(szRegExpire), atoi(szHeartbeatCount), atoi(szHeartbeatInterval),
  227. protocol, szPassword, szLocalSipID, atoi(szLocalPort), szSourceURL);
  228. pBtnStartup->EnableWindow(FALSE);
  229. pBtnShutdown->EnableWindow(TRUE);
  230. }
  231. void CEasyGBDDemoDlg::OnBnClickedButtonShutdown()
  232. {
  233. Shutdown();
  234. pBtnStartup->EnableWindow(TRUE);
  235. pBtnShutdown->EnableWindow(FALSE);
  236. }
  237. int CEasyGBDDemoDlg::OutputLog(char* szFormat, ...)
  238. {
  239. char pbuf[1024] = { 0 };
  240. va_list args;
  241. va_start(args, szFormat);
  242. vsnprintf(pbuf, sizeof(pbuf) - 1, szFormat, args);
  243. va_end(args);
  244. LockLogMutex();
  245. mLogVector.push_back(pbuf);
  246. UnlockLogMutex();
  247. PostMessage(WM_UPDATE_LOG);
  248. return 0;
  249. }
  250. LRESULT CEasyGBDDemoDlg::OnUpdateLog(WPARAM, LPARAM)
  251. {
  252. OutputLog2UI();
  253. return 0;
  254. }
  255. void CEasyGBDDemoDlg::OutputLog2UI()
  256. {
  257. LockLogMutex();
  258. LOG_VECTOR::iterator it = mLogVector.begin();
  259. while (it != mLogVector.end())
  260. {
  261. wchar_t wszBuf[1024] = { 0 };
  262. MByteToWChar(it->data(), wszBuf, sizeof(wszBuf) / sizeof(wszBuf[0]));
  263. pRichEditLog->SetSel(-1, -1);
  264. pRichEditLog->ReplaceSel(wszBuf);
  265. mLogVector.erase(it);
  266. it = mLogVector.begin();
  267. if (it == mLogVector.end()) break;
  268. }
  269. UnlockLogMutex();
  270. }
  271. int CALLBACK __GB28181DeviceCALLBACK(void* userPtr, int channelId, int eventType, char* eventParams, int paramLength)
  272. {
  273. GB28181_DEVICE_T* pGB28181Device = (GB28181_DEVICE_T*)userPtr;
  274. GB28181_CHANNEL_T* pChannel = &pGB28181Device->pChannel[channelId];
  275. if (NULL == pChannel) return 0;
  276. CEasyGBDDemoDlg* pThis = (CEasyGBDDemoDlg*)pChannel->userptr;
  277. if (GB28181_DEVICE_EVENT_CONNECTING == eventType)
  278. {
  279. pThis->OutputLog("GB/T28181服务连接中... %s\n", eventParams);
  280. }
  281. else if (GB28181_DEVICE_EVENT_REGISTER_ING == eventType)
  282. {
  283. pThis->OutputLog("GB/T28181 注册中....\n");
  284. }
  285. if (GB28181_DEVICE_EVENT_REGISTER_OK == eventType)
  286. {
  287. pThis->OutputLog("GB/T28181 注册成功.\n");
  288. }
  289. else if (GB28181_DEVICE_EVENT_REGISTER_AUTH_FAIL == eventType)
  290. {
  291. pThis->OutputLog("GB/T28181 鉴权失败.\n");
  292. }
  293. else if (GB28181_DEVICE_EVENT_START_AUDIO_VIDEO == eventType)
  294. {
  295. pThis->OutputLog("GB/T28181 请求视频. ID: %s\n", eventParams);
  296. pChannel->sendStatus = 1;
  297. }
  298. else if (GB28181_DEVICE_EVENT_STOP_AUDIO_VIDEO == eventType)
  299. {
  300. pThis->OutputLog("GB/T28181 停止视频. ID: %s\n", eventParams);
  301. pChannel->sendStatus = 0;
  302. }
  303. else if (GB28181_DEVICE_EVENT_TALK_AUDIO_DATA == eventType)
  304. {
  305. //pThis->OutputLog("GB/T28181 音频对讲数据...\n");
  306. }
  307. return 0;
  308. }
  309. int Easy_APICALL __EasyStreamClientCallBack(void* _channelPtr, int _frameType, void* pBuf, EASY_FRAME_INFO* _frameInfo)
  310. {
  311. GB28181_CHANNEL_T* pChannel = (GB28181_CHANNEL_T*)_channelPtr;
  312. CEasyGBDDemoDlg* pThis = (CEasyGBDDemoDlg*)pChannel->userptr;
  313. if (_frameType == EASY_SDK_VIDEO_FRAME_FLAG)
  314. {
  315. if (pChannel->videoCodec < 1)
  316. {
  317. pThis->OutputLog("设置视频编码格式: %s\n", _frameInfo->codec == EASY_SDK_VIDEO_CODEC_H264 ? "H264" : "H265");
  318. libGB28181Device_SetVideoFormat(pChannel->id, _frameInfo->codec, 0, 0, 0);
  319. libGB28181Device_SetAudioFormat(pChannel->id, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1, 16);
  320. pChannel->videoCodec = _frameInfo->codec;
  321. }
  322. if (pChannel->sendStatus == 1)
  323. {
  324. if (_frameInfo->type == 0x01)
  325. {
  326. char* buf = (char*)pBuf;
  327. pThis->OutputLog("推送关键帧: %d Bytes: %02X %02X %02X %02X %02X %02X %02X %02X\n", _frameInfo->length,
  328. (unsigned char)buf[0], (unsigned char)buf[1], (unsigned char)buf[2], (unsigned char)buf[3],
  329. (unsigned char)buf[4], (unsigned char)buf[5], (unsigned char)buf[6], (unsigned char)buf[7]);
  330. }
  331. libGB28181Device_AddVideoData(pChannel->id, (char*)pBuf, _frameInfo->length, _frameInfo->type);
  332. }
  333. }
  334. else if (_frameType == EASY_SDK_AUDIO_FRAME_FLAG)
  335. {
  336. if (pChannel->sendStatus == 1)
  337. {
  338. libGB28181Device_AddAudioData(pChannel->id, _frameInfo->codec, (char*)pBuf, _frameInfo->length, _frameInfo->length);
  339. }
  340. //if (pChannel->sendStatus == 1)
  341. //{
  342. // if (NULL == pChannel->atcHandle)
  343. // {
  344. // ATC_Init(&pChannel->atcHandle, pChannel->audioOutputFormat,//TRANSCODE_AUDIO_TYPE_AAC,
  345. // //pChannel->srcAudioCodec, frameinfo->sample_rate, 1, frameinfo->bitsPerSample);
  346. // pChannel->srcAudioCodec, _frameInfo->sample_rate, _frameInfo->channels, _frameInfo->bits_per_sample);
  347. // }
  348. // if (pChannel->atcHandle)
  349. // {
  350. // unsigned char* dstBuf = NULL;
  351. // int dstBufSize = 0;
  352. // if (0 == ATC_Transcode(pChannel->atcHandle, &dstBuf, &dstBufSize, (unsigned char*)pBuf, _frameInfo->length))
  353. // {
  354. // //printf("Audio frame length: %d --> %d\n", frameinfo->length, dstBufSize);
  355. // //if (NULL != pChannel->pDSPlayer)
  356. // //{
  357. // // pChannel->pDSPlayer->Write((char*)dstBuf, dstBufSize);
  358. // //}
  359. // if (pChannel->sendStatus == 1)
  360. // {
  361. // libGB28181Device_AddAudioData(pChannel->id, pChannel->audioOutputFormat, (char*)dstBuf, dstBufSize, dstBufSize);// dstBufSize);
  362. // //libGB28181Device_AddAudioData(7, (char*)dstBuf, dstBufSize, dstBufSize);// dstBufSize);
  363. // }
  364. // //if (NULL == pChannel->fDat)
  365. // //{
  366. // // //pGB28181Device->fDat = fopen("1.aac", "wb");
  367. // // pChannel->fDat = fopen("1.711u", "wb");
  368. // //}
  369. // //if (NULL != pChannel->fDat)
  370. // //{
  371. // // fwrite(pBuf, 1, _frameInfo->length, pChannel->fDat);
  372. // //}
  373. // }
  374. // }
  375. // //libGB28181Device_AddAudioData(pChannel->id, _frameInfo->codec, (char*)pBuf, _frameInfo->length, _frameInfo->length);
  376. //}
  377. }
  378. else if (_frameType == EASY_SDK_EVENT_FRAME_FLAG)
  379. {
  380. if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_DISCONNECTED)
  381. {
  382. pThis->OutputLog("当前视频源已断开!\n");
  383. }
  384. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECTED)
  385. {
  386. pThis->OutputLog("当前视频源连接成功!\n");
  387. }
  388. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_EXIT)
  389. {
  390. pThis->OutputLog("当前视频源已正常断开连接!\n");
  391. }
  392. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECT_FAILED)
  393. {
  394. pThis->OutputLog("当前视频源连接失败!\n");
  395. }
  396. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECTING)
  397. {
  398. pThis->OutputLog("当前视频源连接中...\n");
  399. }
  400. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECTED)
  401. {
  402. pThis->OutputLog("当前视频源连接成功.\n");
  403. }
  404. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECT_ABORT)
  405. {
  406. pThis->OutputLog("当前视频源连接异常中断.\n");
  407. }
  408. }
  409. return 0;
  410. }
  411. int CEasyGBDDemoDlg::Startup(const char* serverSIPId, const char* serverIP, const int serverPort,
  412. const int reg_expires, const int heartbeatCount, const int heartbeatInterval,
  413. const int protocol, const char* password, const char* localSIPId, const int localPort, const char* sourceURL)
  414. {
  415. int ret = 0;
  416. if (NULL == mGB28181Device.pChannel)
  417. {
  418. OutputLog("启动中...\n");
  419. mGB28181Device.pChannel = new GB28181_CHANNEL_T[MAX_GB28181_CHANNEL_NUM];
  420. if (mGB28181Device.pChannel)
  421. {
  422. memset(mGB28181Device.pChannel, 0x00, sizeof(GB28181_CHANNEL_T) * MAX_GB28181_CHANNEL_NUM);
  423. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  424. {
  425. mGB28181Device.pChannel[i].id = i;
  426. mGB28181Device.pChannel[i].userptr = this;
  427. strcpy(mGB28181Device.pChannel[i].sourceURL, sourceURL);// "rtsp://admin:admin12345@192.168.6.41");
  428. }
  429. GB28181_DEVICE_INFO_T gb28181DeviceInfo;
  430. memset(&gb28181DeviceInfo, 0x00, sizeof(GB28181_DEVICE_INFO_T));
  431. strcpy(gb28181DeviceInfo.server_id, serverSIPId);
  432. memcpy(gb28181DeviceInfo.server_domain, gb28181DeviceInfo.server_id, 10);
  433. strcpy(gb28181DeviceInfo.server_ip, serverIP);
  434. gb28181DeviceInfo.server_port = serverPort;
  435. gb28181DeviceInfo.reg_expires = reg_expires;
  436. gb28181DeviceInfo.heartbeat_count = heartbeatCount;
  437. gb28181DeviceInfo.heartbeat_interval = heartbeatInterval;
  438. gb28181DeviceInfo.protocol = protocol; //0 - udp; 1 - tcp
  439. strcpy(gb28181DeviceInfo.password, password);
  440. gb28181DeviceInfo.log_enable = 1; // log enable flag
  441. gb28181DeviceInfo.log_level = 0; // log level(0:TRACE,1:DEBUG,2:INFO,3:WARNING,4:ERROR,5:FATAL)
  442. strcpy(gb28181DeviceInfo.device_id, localSIPId);
  443. gb28181DeviceInfo.localSipPort = localPort;
  444. gb28181DeviceInfo.channel_nums = MAX_GB28181_CHANNEL_NUM;
  445. for (int i = 0; i < gb28181DeviceInfo.channel_nums; i++)
  446. {
  447. sprintf(gb28181DeviceInfo.channel[i].id, "%s1310%06d", gb28181DeviceInfo.server_domain, i + 1);
  448. sprintf(gb28181DeviceInfo.channel[i].name, "ch %02d", i + 1);
  449. strcpy(gb28181DeviceInfo.channel[i].model, "IPCamera");
  450. sprintf(gb28181DeviceInfo.channel[i].owner, "Owner %02d", i + 1);
  451. strcpy(gb28181DeviceInfo.channel[i].manufacturer, "Easy");
  452. gb28181DeviceInfo.channel[i].longitude = (double)i + 100;
  453. gb28181DeviceInfo.channel[i].latitude = (double)i + 10;
  454. }
  455. libGB28181Device_Create(&gb28181DeviceInfo/*为NULL则表示从当前目录下读取config.xml*/, __GB28181DeviceCALLBACK, (void*)&mGB28181Device);
  456. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  457. {
  458. if (0 == strcmp(mGB28181Device.pChannel[i].sourceURL, "\0")) continue;
  459. EasyStreamClient_Init(&mGB28181Device.pChannel[i].streamClientHandle, 0);
  460. EasyStreamClient_SetCallback(mGB28181Device.pChannel[i].streamClientHandle, __EasyStreamClientCallBack);
  461. EasyStreamClient_OpenStream(mGB28181Device.pChannel[i].streamClientHandle,
  462. mGB28181Device.pChannel[i].sourceURL, EASY_RTP_OVER_TCP, &mGB28181Device.pChannel[i], 1, 5, 1);
  463. EasyStreamClient_SetAudioEnable(mGB28181Device.pChannel[i].streamClientHandle, 1);
  464. //mGB28181Device.pChannel[i].audioOutputFormat = TRANSCODE_AUDIO_TYPE_G711U;// TRANSCODE_AUDIO_TYPE_G711U;
  465. //libGB28181Device_SetVideoFormat(i, EASY_SDK_VIDEO_CODEC_H265, 0, 0, 0);
  466. //libGB28181Device_SetAudioFormat(i, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1, 16);
  467. }
  468. OutputLog("已启动..\n");
  469. }
  470. else
  471. {
  472. OutputLog("启动失败...\n");
  473. ret = -1000;
  474. return ret;
  475. }
  476. }
  477. return ret;
  478. }
  479. void CEasyGBDDemoDlg::Shutdown()
  480. {
  481. if (NULL == mGB28181Device.pChannel) return;
  482. OutputLog("停止中...\n");
  483. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  484. {
  485. if (0 == strcmp(mGB28181Device.pChannel[i].sourceURL, "\0")) continue;
  486. mGB28181Device.pChannel[i].sendStatus = 0;
  487. EasyStreamClient_Deinit(mGB28181Device.pChannel[i].streamClientHandle);
  488. mGB28181Device.pChannel[i].streamClientHandle = NULL;
  489. //ATC_Deinit(&mGB28181Device.pChannel[i].atcHandle);
  490. if (NULL != mGB28181Device.pChannel[i].fDat)
  491. {
  492. fclose(mGB28181Device.pChannel[i].fDat);
  493. mGB28181Device.pChannel[i].fDat = NULL;
  494. }
  495. }
  496. delete[]mGB28181Device.pChannel;
  497. mGB28181Device.pChannel = NULL;
  498. libGB28181Device_Release();
  499. OutputLog("已停止.\n");
  500. }
  501. void CEasyGBDDemoDlg::OnDestroy()
  502. {
  503. CDialogEx::OnDestroy();
  504. Shutdown();
  505. DeinitMutex(&mLogMutex);
  506. }
  507. void CEasyGBDDemoDlg::OnBnClickedButtonBrowse()
  508. {
  509. //wchar_t szDefaultOpenPath[MAX_PATH] = { 0 };
  510. //MByteToWChar(globalRecordingPath, szDefaultOpenPath, sizeof(szDefaultOpenPath) / sizeof(szDefaultOpenPath[0]));
  511. CFileDialog file(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"媒体文件(*.*)|*.*||");
  512. //file.m_ofn.lpstrInitialDir = szDefaultOpenPath;
  513. if (file.DoModal() != IDOK) return;
  514. //获取文件名称
  515. file.GetFileName();
  516. //获取文件路径,此处只想说明下file.GetPathName()的返回值类型。
  517. CString filePath = file.GetPathName();
  518. pEdtSourceURL->SetWindowTextW(filePath);
  519. }