EasyGBD_DemoDlg.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  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. memset(&mGB28181DeviceList, 0x00, sizeof(GB28181_DEVICE_LIST_T));
  44. }
  45. void CEasyGBDDemoDlg::DoDataExchange(CDataExchange* pDX)
  46. {
  47. CDialogEx::DoDataExchange(pDX);
  48. }
  49. BEGIN_MESSAGE_MAP(CEasyGBDDemoDlg, CDialogEx)
  50. ON_WM_SYSCOMMAND()
  51. ON_WM_PAINT()
  52. ON_WM_QUERYDRAGICON()
  53. ON_BN_CLICKED(IDC_BUTTON_STARTUP, &CEasyGBDDemoDlg::OnBnClickedButtonStart)
  54. ON_WM_DESTROY()
  55. ON_BN_CLICKED(IDC_BUTTON_SHUTDOWN, &CEasyGBDDemoDlg::OnBnClickedButtonShutdown)
  56. ON_BN_CLICKED(IDC_BUTTON_BROWSE, &CEasyGBDDemoDlg::OnBnClickedButtonBrowse)
  57. ON_MESSAGE(WM_UPDATE_LOG, OnUpdateLog)
  58. END_MESSAGE_MAP()
  59. // CEasyGBDDemoDlg 消息处理程序
  60. BOOL CEasyGBDDemoDlg::OnInitDialog()
  61. {
  62. CDialogEx::OnInitDialog();
  63. // 将“关于...”菜单项添加到系统菜单中。
  64. // IDM_ABOUTBOX 必须在系统命令范围内。
  65. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  66. ASSERT(IDM_ABOUTBOX < 0xF000);
  67. CMenu* pSysMenu = GetSystemMenu(FALSE);
  68. if (pSysMenu != nullptr)
  69. {
  70. BOOL bNameValid;
  71. CString strAboutMenu;
  72. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  73. ASSERT(bNameValid);
  74. if (!strAboutMenu.IsEmpty())
  75. {
  76. pSysMenu->AppendMenu(MF_SEPARATOR);
  77. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  78. }
  79. }
  80. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
  81. // 执行此操作
  82. SetIcon(m_hIcon, TRUE); // 设置大图标
  83. SetIcon(m_hIcon, FALSE); // 设置小图标
  84. // TODO: 在此添加额外的初始化代码
  85. SetWindowText(TEXT("EasyGBD_Demo"));
  86. pEdtServerSipID = (CEdit*)GetDlgItem(IDC_EDIT_SERVER_SIPID);
  87. pEdtServerIP = (CEdit*)GetDlgItem(IDC_EDIT_SERVER_IP);
  88. pEdtServerPort = (CEdit*)GetDlgItem(IDC_EDIT_SERVER_PORT);
  89. pEdtRegExpire = (CEdit*)GetDlgItem(IDC_EDIT_REG_EXPIRE);
  90. pEdtHeartbeatCount = (CEdit*)GetDlgItem(IDC_EDIT_HEARTBEAT_COUNT);
  91. pEdtHeartbeatInterval = (CEdit*)GetDlgItem(IDC_EDIT_HEARTBEAT_INTERVAL);
  92. pComboxProtocol = (CComboBox*)GetDlgItem(IDC_COMBO_PROTOCOL);
  93. pEdtPassword = (CEdit*)GetDlgItem(IDC_EDIT_PASSWORD);
  94. pEdtLocalSipID = (CEdit*)GetDlgItem(IDC_EDIT_LOCAL_SIPID);
  95. pEdtLocalPort = (CEdit*)GetDlgItem(IDC_EDIT_LOCAL_PORT);
  96. pEdtDeviceName = (CEdit*)GetDlgItem(IDC_EDIT_DEVICE_NAME);
  97. pEdtSourceURL = (CEdit*)GetDlgItem(IDC_EDIT_SOURCE_URL);
  98. pBtnStartup = (CButton*)GetDlgItem(IDC_BUTTON_STARTUP);
  99. pBtnShutdown = (CButton*)GetDlgItem(IDC_BUTTON_SHUTDOWN);
  100. pRichEditLog = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT2_LOG);
  101. pEdtServerSipID->SetWindowTextW(TEXT("34020000002000000001"));
  102. pEdtServerIP->SetWindowTextW(TEXT("demo.easygbs.com"));
  103. //pEdtServerIP->SetWindowTextW(TEXT("192.168.0.77"));
  104. //
  105. wchar_t wszDeviceName[32] = { 0 };
  106. time_t currentTime = time(NULL);
  107. unsigned int randValue = currentTime & 0xFFFFF;
  108. wchar_t wszRandSipID[32] = { 0 };
  109. wsprintf(wszRandSipID, TEXT("34020000001110%06d"), randValue);
  110. wsprintf(wszDeviceName, TEXT("EasyGBD-%06d"), randValue);
  111. int sipIdLen = (int)wcslen(wszRandSipID);
  112. for (int i = sipIdLen; i > 20; i--)
  113. {
  114. wszRandSipID[i - 1] = TEXT('\0');
  115. }
  116. pEdtServerPort->SetWindowTextW(TEXT("15060"));
  117. pEdtRegExpire->SetWindowTextW(TEXT("3600"));
  118. pEdtHeartbeatCount->SetWindowTextW(TEXT("3"));
  119. pEdtHeartbeatInterval->SetWindowTextW(TEXT("60"));
  120. pComboxProtocol->AddString(TEXT("UDP"));
  121. pComboxProtocol->AddString(TEXT("TCP"));
  122. pComboxProtocol->SetCurSel(0);
  123. pEdtPassword->SetWindowTextW(TEXT("12345678"));
  124. pEdtLocalSipID->SetWindowTextW(wszRandSipID);// TEXT("34020000001110000009"));
  125. pEdtLocalPort->SetWindowTextW(TEXT("15090"));
  126. pEdtDeviceName->SetWindowTextW(wszDeviceName);
  127. pEdtSourceURL->SetWindowTextW(TEXT("G:/VideoSamples/Alizee_La_Isla_Bonita_Mixiran_Arash.avi"));
  128. wchar_t wszPath[128] = { 0 };
  129. GetModuleFileName(NULL, wszPath, sizeof(wszPath));
  130. int nSize = (int)wcslen(wszPath);
  131. int i = nSize;
  132. for (i = nSize; i > 0; i--)
  133. {
  134. if ((unsigned char)wszPath[i] == '\\')
  135. {
  136. //wszPath[i] = '\0';
  137. break;
  138. }
  139. wszPath[i] = '\0';
  140. }
  141. wcscat(wszPath, TEXT("EasyDarwin.mp4"));
  142. pEdtSourceURL->SetWindowTextW(wszPath);
  143. OnBnClickedButtonShutdown();
  144. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  145. }
  146. void CEasyGBDDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
  147. {
  148. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  149. {
  150. CAboutDlg dlgAbout;
  151. dlgAbout.DoModal();
  152. }
  153. else
  154. {
  155. CDialogEx::OnSysCommand(nID, lParam);
  156. }
  157. }
  158. // 如果向对话框添加最小化按钮,则需要下面的代码
  159. // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
  160. // 这将由框架自动完成。
  161. void CEasyGBDDemoDlg::OnPaint()
  162. {
  163. if (IsIconic())
  164. {
  165. CPaintDC dc(this); // 用于绘制的设备上下文
  166. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  167. // 使图标在工作区矩形中居中
  168. int cxIcon = GetSystemMetrics(SM_CXICON);
  169. int cyIcon = GetSystemMetrics(SM_CYICON);
  170. CRect rect;
  171. GetClientRect(&rect);
  172. int x = (rect.Width() - cxIcon + 1) / 2;
  173. int y = (rect.Height() - cyIcon + 1) / 2;
  174. // 绘制图标
  175. dc.DrawIcon(x, y, m_hIcon);
  176. }
  177. else
  178. {
  179. CDialogEx::OnPaint();
  180. }
  181. }
  182. //当用户拖动最小化窗口时系统调用此函数取得光标
  183. //显示。
  184. HCURSOR CEasyGBDDemoDlg::OnQueryDragIcon()
  185. {
  186. return static_cast<HCURSOR>(m_hIcon);
  187. }
  188. bool MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
  189. {
  190. // Get the required size of the buffer that receives the Unicode
  191. // string.
  192. DWORD dwMinSize;
  193. dwMinSize = MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, NULL, 0);
  194. if (dwSize < dwMinSize)
  195. {
  196. return false;
  197. }
  198. // Convert headers from ASCII to Unicode.
  199. MultiByteToWideChar(CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
  200. return true;
  201. }
  202. bool WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
  203. {
  204. DWORD dwMinSize;
  205. dwMinSize = WideCharToMultiByte(CP_UTF8, NULL, lpcwszStr, -1, NULL, 0, NULL, FALSE);
  206. if (dwSize < dwMinSize)
  207. {
  208. return false;
  209. }
  210. WideCharToMultiByte(CP_UTF8, NULL, lpcwszStr, -1, lpszStr, dwSize, NULL, FALSE);
  211. return true;
  212. }
  213. void CEasyGBDDemoDlg::OnBnClickedButtonStart()
  214. {
  215. // TODO: 在此添加控件通知处理程序代码
  216. wchar_t wszServerSipId[32] = { 0 };
  217. char szServerSipId[32] = { 0 };
  218. pEdtServerSipID->GetWindowTextW(wszServerSipId, sizeof(wszServerSipId));
  219. WCharToMByte(wszServerSipId, szServerSipId, sizeof(szServerSipId) / sizeof(szServerSipId[0]));
  220. wchar_t wszServerIP[32] = { 0 };
  221. char szServerIP[32] = { 0 };
  222. pEdtServerIP->GetWindowTextW(wszServerIP, sizeof(wszServerIP));
  223. WCharToMByte(wszServerIP, szServerIP, sizeof(szServerIP) / sizeof(szServerIP[0]));
  224. wchar_t wszServerPort[16] = { 0 };
  225. char szServerPort[16] = { 0 };
  226. pEdtServerPort->GetWindowTextW(wszServerPort, sizeof(wszServerPort));
  227. WCharToMByte(wszServerPort, szServerPort, sizeof(szServerPort) / sizeof(szServerPort[0]));
  228. wchar_t wszRegExpire[16] = { 0 };
  229. char szRegExpire[16] = { 0 };
  230. pEdtRegExpire->GetWindowTextW(wszRegExpire, sizeof(wszRegExpire));
  231. WCharToMByte(wszRegExpire, szRegExpire, sizeof(szRegExpire) / sizeof(szRegExpire[0]));
  232. wchar_t wszHeartbeatCount[16] = { 0 };
  233. char szHeartbeatCount[16] = { 0 };
  234. pEdtHeartbeatCount->GetWindowTextW(wszHeartbeatCount, sizeof(wszHeartbeatCount));
  235. WCharToMByte(wszHeartbeatCount, szHeartbeatCount, sizeof(szHeartbeatCount) / sizeof(szHeartbeatCount[0]));
  236. wchar_t wszHeartbeatInterval[16] = { 0 };
  237. char szHeartbeatInterval[16] = { 0 };
  238. pEdtHeartbeatInterval->GetWindowTextW(wszHeartbeatInterval, sizeof(wszHeartbeatInterval));
  239. WCharToMByte(wszHeartbeatInterval, szHeartbeatInterval, sizeof(szHeartbeatInterval) / sizeof(szHeartbeatInterval[0]));
  240. int protocol = pComboxProtocol->GetCurSel();
  241. wchar_t wszPassword[32] = { 0 };
  242. char szPassword[32] = { 0 };
  243. pEdtPassword->GetWindowTextW(wszPassword, sizeof(wszPassword));
  244. WCharToMByte(wszPassword, szPassword, sizeof(szPassword) / sizeof(szPassword[0]));
  245. wchar_t wszLocalSipID[32] = { 0 };
  246. char szLocalSipID[32] = { 0 };
  247. pEdtLocalSipID->GetWindowTextW(wszLocalSipID, sizeof(wszLocalSipID));
  248. WCharToMByte(wszLocalSipID, szLocalSipID, sizeof(szLocalSipID) / sizeof(szLocalSipID[0]));
  249. wchar_t wszLocalPort[16] = { 0 };
  250. char szLocalPort[16] = { 0 };
  251. pEdtLocalPort->GetWindowTextW(wszLocalPort, sizeof(wszLocalPort));
  252. WCharToMByte(wszLocalPort, szLocalPort, sizeof(szLocalPort) / sizeof(szLocalPort[0]));
  253. wchar_t wszDeviceName[128] = { 0 };
  254. char szDeviceName[128] = { 0 };
  255. pEdtDeviceName->GetWindowTextW(wszDeviceName, sizeof(wszDeviceName));
  256. WCharToMByte(wszDeviceName, szDeviceName, sizeof(szDeviceName) / sizeof(szDeviceName[0]));
  257. wchar_t wszSourceURL[1024] = { 0 };
  258. char szSourceURL[1024] = { 0 };
  259. pEdtSourceURL->GetWindowTextW(wszSourceURL, sizeof(wszSourceURL));
  260. WCharToMByte(wszSourceURL, szSourceURL, sizeof(szSourceURL) / sizeof(szSourceURL[0]));
  261. Startup(szServerSipId, szServerIP, atoi(szServerPort), atoi(szRegExpire), atoi(szHeartbeatCount), atoi(szHeartbeatInterval),
  262. protocol, szPassword, 1, szLocalSipID, atoi(szLocalPort), szDeviceName, szSourceURL);
  263. pBtnStartup->EnableWindow(FALSE);
  264. pBtnShutdown->EnableWindow(TRUE);
  265. }
  266. void CEasyGBDDemoDlg::OnBnClickedButtonShutdown()
  267. {
  268. Shutdown();
  269. pBtnStartup->EnableWindow(TRUE);
  270. pBtnShutdown->EnableWindow(FALSE);
  271. }
  272. int CEasyGBDDemoDlg::OutputLog(char* szFormat, ...)
  273. {
  274. char pbuf[1024] = { 0 };
  275. va_list args;
  276. va_start(args, szFormat);
  277. vsnprintf(pbuf, sizeof(pbuf) - 1, szFormat, args);
  278. va_end(args);
  279. LockLogMutex();
  280. mLogVector.push_back(pbuf);
  281. UnlockLogMutex();
  282. PostMessage(WM_UPDATE_LOG);
  283. return 0;
  284. }
  285. LRESULT CEasyGBDDemoDlg::OnUpdateLog(WPARAM, LPARAM)
  286. {
  287. OutputLog2UI();
  288. return 0;
  289. }
  290. void CEasyGBDDemoDlg::OutputLog2UI()
  291. {
  292. LockLogMutex();
  293. LOG_VECTOR::iterator it = mLogVector.begin();
  294. while (it != mLogVector.end())
  295. {
  296. wchar_t wszBuf[1024] = { 0 };
  297. MByteToWChar(it->data(), wszBuf, sizeof(wszBuf) / sizeof(wszBuf[0]));
  298. pRichEditLog->SetSel(-1, -1);
  299. pRichEditLog->ReplaceSel(wszBuf);
  300. mLogVector.erase(it);
  301. it = mLogVector.begin();
  302. if (it == mLogVector.end()) break;
  303. }
  304. UnlockLogMutex();
  305. }
  306. int CALLBACK __GB28181DeviceCALLBACK(void* userPtr, int channelId, int eventType, char* eventParams, int paramLength)
  307. {
  308. GB28181_DEVICE_T* pGB28181Device = (GB28181_DEVICE_T*)userPtr;
  309. GB28181_CHANNEL_T* pChannel = &pGB28181Device->pChannel[channelId];
  310. if (NULL == pChannel) return 0;
  311. CEasyGBDDemoDlg* pThis = (CEasyGBDDemoDlg*)pChannel->userptr;
  312. if (GB28181_DEVICE_EVENT_CONNECTING == eventType)
  313. {
  314. pThis->OutputLog("GB/T28181服务连接中... %s\n", eventParams);
  315. }
  316. else if (GB28181_DEVICE_EVENT_REGISTER_ING == eventType)
  317. {
  318. pThis->OutputLog("GB/T28181 注册中....\n");
  319. }
  320. if (GB28181_DEVICE_EVENT_REGISTER_OK == eventType)
  321. {
  322. pThis->OutputLog("GB/T28181 注册成功.\n");
  323. }
  324. else if (GB28181_DEVICE_EVENT_REGISTER_AUTH_FAIL == eventType)
  325. {
  326. pThis->OutputLog("GB/T28181 鉴权失败.\n");
  327. }
  328. else if (GB28181_DEVICE_EVENT_START_AUDIO_VIDEO == eventType)
  329. {
  330. pThis->OutputLog("GB/T28181 请求视频. ID: %s\n", eventParams);
  331. pChannel->sendStatus = 1;
  332. }
  333. else if (GB28181_DEVICE_EVENT_STOP_AUDIO_VIDEO == eventType)
  334. {
  335. pThis->OutputLog("GB/T28181 停止视频. ID: %s\n", eventParams);
  336. pChannel->sendStatus = 0;
  337. }
  338. else if (GB28181_DEVICE_EVENT_TALK_AUDIO_DATA == eventType)
  339. {
  340. pThis->OutputLog("GB/T28181 音频对讲数据...\n");
  341. static FILE* f = fopen("1_talk.pcm", "wb");
  342. if (f)
  343. {
  344. fwrite(eventParams, 1, paramLength, f);
  345. }
  346. }
  347. else if (GB28181_DEVICE_EVENT_SUBSCRIBE_ALARM == eventType)
  348. {
  349. pThis->OutputLog("GB/T28181 订阅报警:%d.\n", paramLength);
  350. }
  351. else if (GB28181_DEVICE_EVENT_SUBSCRIBE_CATALOG == eventType)
  352. {
  353. pThis->OutputLog("GB/T28181 订阅目录:%d.\n", paramLength);
  354. }
  355. else if (GB28181_DEVICE_EVENT_SUBSCRIBE_MOBILEPOSITION == eventType)
  356. {
  357. pThis->OutputLog("GB/T28181 订阅位置:%d.\n", paramLength);
  358. }
  359. //
  360. return 0;
  361. }
  362. int Easy_APICALL __EasyStreamClientCallBack(void* _channelPtr, int _frameType, void* pBuf, EASY_FRAME_INFO* _frameInfo)
  363. {
  364. GB28181_CHANNEL_T* pChannel = (GB28181_CHANNEL_T*)_channelPtr;
  365. CEasyGBDDemoDlg* pThis = (CEasyGBDDemoDlg*)pChannel->userptr;
  366. if (_frameType == EASY_SDK_VIDEO_FRAME_FLAG)
  367. {
  368. if (pChannel->videoCodec < 1 && (pChannel->mediaInfo.u32AudioCodec>0 || pChannel->videoFrameNum>25))
  369. {
  370. pThis->OutputLog("设置视频编码格式: %s\n", _frameInfo->codec == EASY_SDK_VIDEO_CODEC_H264 ? "H264" : "H265");
  371. libGB28181Device_SetVideoFormat(pChannel->id, _frameInfo->codec, 0, 0, 0);
  372. libGB28181Device_SetAudioFormat(pChannel->id, pChannel->mediaInfo.u32AudioCodec,
  373. pChannel->mediaInfo.u32AudioSamplerate,
  374. pChannel->mediaInfo.u32AudioChannel > 2 ? 2 : pChannel->mediaInfo.u32AudioChannel,
  375. pChannel->mediaInfo.u32AudioBitsPerSample);
  376. //libGB28181Device_SetAudioFormat(pChannel->id, EASY_SDK_AUDIO_CODEC_AAC,//EASY_SDK_AUDIO_CODEC_G711U,
  377. // pChannel->mediaInfo.u32AudioSamplerate,
  378. // pChannel->mediaInfo.u32AudioChannel > 2 ? 2 : pChannel->mediaInfo.u32AudioChannel,
  379. // pChannel->mediaInfo.u32AudioBitsPerSample);
  380. pChannel->videoCodec = _frameInfo->codec;
  381. }
  382. pChannel->videoFrameNum++;
  383. if (pChannel->sendStatus == 1)
  384. {
  385. if (_frameInfo->type == 0x01)
  386. {
  387. char* buf = (char*)pBuf;
  388. pThis->OutputLog("推送关键帧: %d Bytes: %02X %02X %02X %02X %02X %02X %02X %02X\n", _frameInfo->length,
  389. (unsigned char)buf[0], (unsigned char)buf[1], (unsigned char)buf[2], (unsigned char)buf[3],
  390. (unsigned char)buf[4], (unsigned char)buf[5], (unsigned char)buf[6], (unsigned char)buf[7]);
  391. pChannel->longitude += 0.1;
  392. pChannel->latitude += 0.001;
  393. libGB28181Device_SetLotLat(pChannel->id, pChannel->longitude, pChannel->latitude);
  394. }
  395. libGB28181Device_AddVideoData(pChannel->id, (char*)pBuf, _frameInfo->length, _frameInfo->type);
  396. }
  397. //Sleep(33);
  398. }
  399. else if (_frameType == EASY_SDK_AUDIO_FRAME_FLAG)
  400. {
  401. pChannel->mediaInfo.u32AudioCodec = _frameInfo->codec;
  402. pChannel->mediaInfo.u32AudioSamplerate = _frameInfo->sample_rate;
  403. pChannel->mediaInfo.u32AudioChannel = _frameInfo->channels;
  404. pChannel->mediaInfo.u32AudioBitsPerSample = _frameInfo->bits_per_sample;
  405. if (pChannel->sendStatus == 1)
  406. {
  407. libGB28181Device_AddAudioData(pChannel->id, _frameInfo->codec, (char*)pBuf, _frameInfo->length, _frameInfo->length);
  408. }
  409. //if (pChannel->sendStatus == 1)
  410. //{
  411. // if (NULL == pChannel->atcHandle)
  412. // {
  413. // ATC_Init(&pChannel->atcHandle, pChannel->audioOutputFormat,//TRANSCODE_AUDIO_TYPE_AAC,
  414. // //pChannel->srcAudioCodec, frameinfo->sample_rate, 1, frameinfo->bitsPerSample);
  415. // pChannel->srcAudioCodec, _frameInfo->sample_rate, _frameInfo->channels, _frameInfo->bits_per_sample);
  416. // }
  417. // if (pChannel->atcHandle)
  418. // {
  419. // unsigned char* dstBuf = NULL;
  420. // int dstBufSize = 0;
  421. // if (0 == ATC_Transcode(pChannel->atcHandle, &dstBuf, &dstBufSize, (unsigned char*)pBuf, _frameInfo->length))
  422. // {
  423. // //printf("Audio frame length: %d --> %d\n", frameinfo->length, dstBufSize);
  424. // //if (NULL != pChannel->pDSPlayer)
  425. // //{
  426. // // pChannel->pDSPlayer->Write((char*)dstBuf, dstBufSize);
  427. // //}
  428. // if (pChannel->sendStatus == 1)
  429. // {
  430. // libGB28181Device_AddAudioData(pChannel->id, pChannel->audioOutputFormat, (char*)dstBuf, dstBufSize, dstBufSize);// dstBufSize);
  431. // //libGB28181Device_AddAudioData(7, (char*)dstBuf, dstBufSize, dstBufSize);// dstBufSize);
  432. // }
  433. // //if (NULL == pChannel->fDat)
  434. // //{
  435. // // //pGB28181Device->fDat = fopen("1.aac", "wb");
  436. // // pChannel->fDat = fopen("1.711u", "wb");
  437. // //}
  438. // //if (NULL != pChannel->fDat)
  439. // //{
  440. // // fwrite(pBuf, 1, _frameInfo->length, pChannel->fDat);
  441. // //}
  442. // }
  443. // }
  444. // //libGB28181Device_AddAudioData(pChannel->id, _frameInfo->codec, (char*)pBuf, _frameInfo->length, _frameInfo->length);
  445. //}
  446. }
  447. else if (_frameType == EASY_SDK_EVENT_FRAME_FLAG)
  448. {
  449. if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_DISCONNECTED)
  450. {
  451. pThis->OutputLog("当前视频源已断开!\n");
  452. }
  453. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECTED)
  454. {
  455. pThis->OutputLog("当前视频源连接成功!\n");
  456. }
  457. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_EXIT)
  458. {
  459. pThis->OutputLog("当前视频源已正常断开连接!\n");
  460. }
  461. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECT_FAILED)
  462. {
  463. pThis->OutputLog("当前视频源连接失败!\n");
  464. }
  465. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECTING)
  466. {
  467. pThis->OutputLog("当前视频源连接中...\n");
  468. }
  469. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECTED)
  470. {
  471. pThis->OutputLog("当前视频源连接成功.\n");
  472. }
  473. else if (_frameInfo->codec == EASY_STREAM_CLIENT_STATE_CONNECT_ABORT)
  474. {
  475. pThis->OutputLog("当前视频源连接异常中断.\n");
  476. }
  477. }
  478. else if (_frameType == EASY_SDK_MEDIA_INFO_FLAG)
  479. {
  480. EASY_MEDIA_INFO_T* pMediaInfo = (EASY_MEDIA_INFO_T*)pBuf;
  481. //memcpy(&pChannel->mediaInfo, pMediaInfo, sizeof(EASY_MEDIA_INFO_T));// pChannel = pMediaInfo->u32AudioCodec;
  482. }
  483. return 0;
  484. }
  485. int CEasyGBDDemoDlg::Startup(const char* serverSIPId, const char* serverIP, const int serverPort,
  486. const int reg_expires, const int heartbeatCount, const int heartbeatInterval,
  487. const int protocol, const char* password,
  488. const int deviceNum, const char* localSIPId, const int localPort,
  489. const char* deviceName, const char* sourceURL)
  490. {
  491. int ret = 0;
  492. if (NULL == mGB28181DeviceList.pGB28181Device && deviceNum>1)
  493. {
  494. OutputLog("启动中...\n");
  495. mGB28181DeviceList.nDeviceNum = deviceNum;
  496. mGB28181DeviceList.pGB28181Device = new GB28181_DEVICE_T[deviceNum];
  497. if (mGB28181DeviceList.pGB28181Device)
  498. {
  499. memset(mGB28181DeviceList.pGB28181Device, 0x00, sizeof(GB28181_DEVICE_T) * deviceNum);
  500. for (int i = 0; i < deviceNum; i++)
  501. {
  502. mGB28181DeviceList.pGB28181Device[i].pChannel = new GB28181_CHANNEL_T[MAX_GB28181_CHANNEL_NUM];
  503. if (mGB28181DeviceList.pGB28181Device[i].pChannel)
  504. {
  505. memset(mGB28181DeviceList.pGB28181Device[i].pChannel, 0x00, sizeof(GB28181_CHANNEL_T) * MAX_GB28181_CHANNEL_NUM);
  506. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  507. {
  508. mGB28181DeviceList.pGB28181Device[i].pChannel[i].id = i;
  509. mGB28181DeviceList.pGB28181Device[i].pChannel[i].userptr = this;
  510. strcpy(mGB28181DeviceList.pGB28181Device[i].pChannel[i].sourceURL, sourceURL);// "rtsp://admin:admin12345@192.168.6.41");
  511. mGB28181DeviceList.pGB28181Device[i].pChannel[i].longitude = 121.29;
  512. mGB28181DeviceList.pGB28181Device[i].pChannel[i].latitude = 31.14;
  513. }
  514. GB28181_DEVICE_INFO_T gb28181DeviceInfo;
  515. memset(&gb28181DeviceInfo, 0x00, sizeof(GB28181_DEVICE_INFO_T));
  516. strcpy(gb28181DeviceInfo.device_name, deviceName);// "GB/T28181 Client");
  517. gb28181DeviceInfo.version = 0;
  518. strcpy(gb28181DeviceInfo.server_id, serverSIPId);
  519. memcpy(gb28181DeviceInfo.server_domain, gb28181DeviceInfo.server_id, 10);
  520. strcpy(gb28181DeviceInfo.server_ip, serverIP);
  521. gb28181DeviceInfo.server_port = serverPort;
  522. gb28181DeviceInfo.reg_expires = reg_expires;
  523. gb28181DeviceInfo.heartbeat_count = heartbeatCount;
  524. gb28181DeviceInfo.heartbeat_interval = heartbeatInterval;
  525. gb28181DeviceInfo.protocol = protocol; //0 - udp; 1 - tcp
  526. gb28181DeviceInfo.media_protocol = protocol;
  527. strcpy(gb28181DeviceInfo.password, password);
  528. gb28181DeviceInfo.log_enable = 1; // log enable flag
  529. gb28181DeviceInfo.log_level = 0; // log level(0:TRACE,1:DEBUG,2:INFO,3:WARNING,4:ERROR,5:FATAL)
  530. strcpy(gb28181DeviceInfo.device_id, localSIPId);
  531. gb28181DeviceInfo.localSipPort = localPort;
  532. gb28181DeviceInfo.channel_nums = MAX_GB28181_CHANNEL_NUM;
  533. for (int i = 0; i < gb28181DeviceInfo.channel_nums; i++)
  534. {
  535. sprintf(gb28181DeviceInfo.channel[i].id, "%s1310%06d", gb28181DeviceInfo.server_domain, i + 1);
  536. //sprintf(gb28181DeviceInfo.channel[i].name, "ch %02d", i + 1);
  537. strcpy(gb28181DeviceInfo.channel[i].name, "EasyIPC");
  538. strcpy(gb28181DeviceInfo.channel[i].model, "IPCamera");
  539. sprintf(gb28181DeviceInfo.channel[i].owner, "Owner %02d", i + 1);
  540. strcpy(gb28181DeviceInfo.channel[i].manufacturer, "Easy");
  541. gb28181DeviceInfo.channel[i].longitude = (double)i + 100;
  542. gb28181DeviceInfo.channel[i].latitude = (double)i + 10;
  543. }
  544. libGB28181Device_Create(&gb28181DeviceInfo/*为NULL则表示从当前目录下读取config.xml*/, __GB28181DeviceCALLBACK, (void*)&mGB28181Device);
  545. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  546. {
  547. if (0 == strcmp(mGB28181DeviceList.pGB28181Device[i].pChannel[i].sourceURL, "\0")) continue;
  548. EasyStreamClient_Init(&mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, 0);
  549. EasyStreamClient_SetCallback(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, __EasyStreamClientCallBack);
  550. EasyStreamClient_OpenStream(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle,
  551. mGB28181DeviceList.pGB28181Device[i].pChannel[i].sourceURL, EASY_RTP_OVER_TCP, &mGB28181DeviceList.pGB28181Device[i].pChannel[i], 1000, 20, 1);
  552. EasyStreamClient_SetAudioEnable(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, 1);
  553. //EasyStreamClient_SetAudioOutFormat(mGB28181DeviceList.pGB28181Device[i].pChannel[i].streamClientHandle, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1);
  554. //mGB28181DeviceList.pGB28181Device[i].pChannel[i].audioOutputFormat = TRANSCODE_AUDIO_TYPE_G711U;// TRANSCODE_AUDIO_TYPE_G711U;
  555. //libGB28181Device_SetVideoFormat(i, EASY_SDK_VIDEO_CODEC_H265, 0, 0, 0);
  556. //libGB28181Device_SetAudioFormat(i, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1, 16);
  557. }
  558. OutputLog("已启动..\n");
  559. }
  560. else
  561. {
  562. OutputLog("启动失败...\n");
  563. ret = -1000;
  564. return ret;
  565. }
  566. }
  567. }
  568. return 0;
  569. }
  570. if (NULL == mGB28181Device.pChannel)
  571. {
  572. OutputLog("启动中...\n");
  573. mGB28181Device.pChannel = new GB28181_CHANNEL_T[MAX_GB28181_CHANNEL_NUM];
  574. if (mGB28181Device.pChannel)
  575. {
  576. memset(mGB28181Device.pChannel, 0x00, sizeof(GB28181_CHANNEL_T) * MAX_GB28181_CHANNEL_NUM);
  577. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  578. {
  579. mGB28181Device.pChannel[i].id = i;
  580. mGB28181Device.pChannel[i].userptr = this;
  581. strcpy(mGB28181Device.pChannel[i].sourceURL, sourceURL);// "rtsp://admin:admin12345@192.168.6.41");
  582. mGB28181Device.pChannel[i].longitude = 121.29;
  583. mGB28181Device.pChannel[i].latitude = 31.14;
  584. }
  585. GB28181_DEVICE_INFO_T gb28181DeviceInfo;
  586. memset(&gb28181DeviceInfo, 0x00, sizeof(GB28181_DEVICE_INFO_T));
  587. strcpy(gb28181DeviceInfo.device_name, deviceName); //"GB/T28181 Client");
  588. gb28181DeviceInfo.version = 0;
  589. strcpy(gb28181DeviceInfo.server_id, serverSIPId);
  590. memcpy(gb28181DeviceInfo.server_domain, gb28181DeviceInfo.server_id, 10);
  591. strcpy(gb28181DeviceInfo.server_ip, serverIP);
  592. gb28181DeviceInfo.server_port = serverPort;
  593. gb28181DeviceInfo.reg_expires = reg_expires;
  594. gb28181DeviceInfo.heartbeat_count = heartbeatCount;
  595. gb28181DeviceInfo.heartbeat_interval = heartbeatInterval;
  596. gb28181DeviceInfo.protocol = protocol; //0 - udp; 1 - tcp
  597. gb28181DeviceInfo.media_protocol = protocol;
  598. strcpy(gb28181DeviceInfo.password, password);
  599. gb28181DeviceInfo.log_enable = 1; // log enable flag
  600. gb28181DeviceInfo.log_level = 0; // log level(0:TRACE,1:DEBUG,2:INFO,3:WARNING,4:ERROR,5:FATAL)
  601. strcpy(gb28181DeviceInfo.device_id, localSIPId);
  602. gb28181DeviceInfo.localSipPort = localPort;
  603. gb28181DeviceInfo.channel_nums = MAX_GB28181_CHANNEL_NUM;
  604. for (int i = 0; i < gb28181DeviceInfo.channel_nums; i++)
  605. {
  606. sprintf(gb28181DeviceInfo.channel[i].id, "%s1310%06d", gb28181DeviceInfo.server_domain, i + 1);
  607. //sprintf(gb28181DeviceInfo.channel[i].name, "ch %02d", i + 1);
  608. strcpy(gb28181DeviceInfo.channel[i].name, "EasyIPC");
  609. strcpy(gb28181DeviceInfo.channel[i].model, "IPCamera");
  610. sprintf(gb28181DeviceInfo.channel[i].owner, "Owner %02d", i + 1);
  611. strcpy(gb28181DeviceInfo.channel[i].manufacturer, "Easy");
  612. gb28181DeviceInfo.channel[i].longitude = (double)i + 100;
  613. gb28181DeviceInfo.channel[i].latitude = (double)i + 10;
  614. }
  615. libGB28181Device_Create(&gb28181DeviceInfo/*为NULL则表示从当前目录下读取config.xml*/, __GB28181DeviceCALLBACK, (void*)&mGB28181Device);
  616. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  617. {
  618. if (0 == strcmp(mGB28181Device.pChannel[i].sourceURL, "\0")) continue;
  619. EasyStreamClient_Init(&mGB28181Device.pChannel[i].streamClientHandle, 0);
  620. EasyStreamClient_SetCallback(mGB28181Device.pChannel[i].streamClientHandle, __EasyStreamClientCallBack);
  621. EasyStreamClient_OpenStream(mGB28181Device.pChannel[i].streamClientHandle,
  622. mGB28181Device.pChannel[i].sourceURL, EASY_RTP_OVER_TCP, &mGB28181Device.pChannel[i], 1000, 20, 1);
  623. EasyStreamClient_SetAudioEnable(mGB28181Device.pChannel[i].streamClientHandle, 1);
  624. //EasyStreamClient_SetAudioOutFormat(mGB28181Device.pChannel[i].streamClientHandle, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1);
  625. //mGB28181Device.pChannel[i].audioOutputFormat = TRANSCODE_AUDIO_TYPE_G711U;// TRANSCODE_AUDIO_TYPE_G711U;
  626. //libGB28181Device_SetVideoFormat(i, EASY_SDK_VIDEO_CODEC_H265, 0, 0, 0);
  627. //libGB28181Device_SetAudioFormat(i, EASY_SDK_AUDIO_CODEC_AAC, 8000, 1, 16);
  628. }
  629. OutputLog("已启动..\n");
  630. }
  631. else
  632. {
  633. OutputLog("启动失败...\n");
  634. ret = -1000;
  635. return ret;
  636. }
  637. }
  638. return ret;
  639. }
  640. void CEasyGBDDemoDlg::Shutdown()
  641. {
  642. if (mGB28181DeviceList.pGB28181Device)
  643. {
  644. for (int i = 0; i < mGB28181DeviceList.nDeviceNum; i++)
  645. {
  646. for (int ch = 0; ch < MAX_GB28181_CHANNEL_NUM; ch++)
  647. {
  648. if (0 == strcmp(mGB28181DeviceList.pGB28181Device[i].pChannel[ch].sourceURL, "\0")) continue;
  649. mGB28181DeviceList.pGB28181Device[i].pChannel[ch].sendStatus = 0;
  650. EasyStreamClient_Deinit(mGB28181DeviceList.pGB28181Device[i].pChannel[ch].streamClientHandle);
  651. mGB28181DeviceList.pGB28181Device[i].pChannel[ch].streamClientHandle = NULL;
  652. //ATC_Deinit(&mGB28181Device.pChannel[i].atcHandle);
  653. if (NULL != mGB28181DeviceList.pGB28181Device[i].pChannel[ch].fDat)
  654. {
  655. fclose(mGB28181DeviceList.pGB28181Device[i].pChannel[ch].fDat);
  656. mGB28181DeviceList.pGB28181Device[i].pChannel[ch].fDat = NULL;
  657. }
  658. }
  659. delete[]mGB28181DeviceList.pGB28181Device[i].pChannel;
  660. mGB28181DeviceList.pGB28181Device[i].pChannel = NULL;
  661. }
  662. delete[]mGB28181DeviceList.pGB28181Device;
  663. mGB28181DeviceList.pGB28181Device = NULL;
  664. }
  665. if (NULL == mGB28181Device.pChannel) return;
  666. OutputLog("停止中...\n");
  667. for (int i = 0; i < MAX_GB28181_CHANNEL_NUM; i++)
  668. {
  669. if (0 == strcmp(mGB28181Device.pChannel[i].sourceURL, "\0")) continue;
  670. mGB28181Device.pChannel[i].sendStatus = 0;
  671. EasyStreamClient_Deinit(mGB28181Device.pChannel[i].streamClientHandle);
  672. mGB28181Device.pChannel[i].streamClientHandle = NULL;
  673. //ATC_Deinit(&mGB28181Device.pChannel[i].atcHandle);
  674. if (NULL != mGB28181Device.pChannel[i].fDat)
  675. {
  676. fclose(mGB28181Device.pChannel[i].fDat);
  677. mGB28181Device.pChannel[i].fDat = NULL;
  678. }
  679. }
  680. delete[]mGB28181Device.pChannel;
  681. mGB28181Device.pChannel = NULL;
  682. libGB28181Device_Release();
  683. OutputLog("已停止.\n");
  684. }
  685. void CEasyGBDDemoDlg::OnDestroy()
  686. {
  687. CDialogEx::OnDestroy();
  688. Shutdown();
  689. DeinitMutex(&mLogMutex);
  690. }
  691. void CEasyGBDDemoDlg::OnBnClickedButtonBrowse()
  692. {
  693. //wchar_t szDefaultOpenPath[MAX_PATH] = { 0 };
  694. //MByteToWChar(globalRecordingPath, szDefaultOpenPath, sizeof(szDefaultOpenPath) / sizeof(szDefaultOpenPath[0]));
  695. CFileDialog file(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"媒体文件(*.*)|*.*||");
  696. //file.m_ofn.lpstrInitialDir = szDefaultOpenPath;
  697. if (file.DoModal() != IDOK) return;
  698. //获取文件名称
  699. file.GetFileName();
  700. //获取文件路径,此处只想说明下file.GetPathName()的返回值类型。
  701. CString filePath = file.GetPathName();
  702. pEdtSourceURL->SetWindowTextW(filePath);
  703. }