📄 rtspplayer.cpp
字号:
GetPrivateProfileString("FILE_PATH", "path", "", m_szPlayFilePath, sizeof(m_szPlayFilePath), m_szIniFile);
GetPrivateProfileString("IP_ADDRESS", "ip", "", m_szIpAddr, sizeof(m_szIpAddr), m_szIniFile);
GetPrivateProfileString("SERVER_TYPE", "server", "", buffer, sizeof(buffer), m_szIniFile);
if (strcmp(buffer, "OVS") == 0)
m_iServerType = OVS;
else if (strcmp(buffer, "SGI") == 0)
m_iServerType = SGI;
}
/////////////////////////////////////////////////////////////////////////////////////////
void RtspPlayer::SetFileName(char *szFile)
{
strcpy(m_szPlayFileName, szFile);
wsprintf(m_szPlayFileFullPath, "rtsp://%s%s%s", m_szIpAddr, m_szPlayFilePath, m_szPlayFileName);
}
/////////////////////////////////////////////////////////////////////////////////////////
void RtspPlayer::SetIniFilePath(char *szFile)
{
strcpy(m_szIniFile, szFile);
}
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
void BrowseFiles()
{
OPENFILENAME fileName;
HGLOBAL hFile, hFileTitle; // Capture filename handles
TCHAR *lpFile;
TCHAR *lpFileTitle;
hFile = GlobalAlloc(GHND, 256); // Allocate global memory
if (!hFile) // if unsuccessful, print error message
{
MessageBox (g_hWnd, "Unable to get file name", NULL, MB_OK);
return;
}
hFileTitle = GlobalAlloc(GHND, 256);
if (!hFileTitle)
{
GlobalFree(hFile);
MessageBox (g_hWnd, "Unable to get file name", NULL, MB_OK);
return;
}
lpFile = (TCHAR *)GlobalLock(hFile); // Lock allocated memory
lpFileTitle = (TCHAR *)GlobalLock(hFileTitle);
memset(&fileName, 0, sizeof(fileName));
fileName.lStructSize = sizeof(fileName);
fileName.Flags = OFN_HIDEREADONLY;
fileName.hInstance = g_hInstance;
fileName.hwndOwner = g_hWnd;
fileName.lpstrFile = lpFile;
fileName.nMaxFile = 256;
fileName.lpstrFileTitle = lpFileTitle;
fileName.nMaxFileTitle = 256;
fileName.lpstrFilter = INI_FILE_EXTENSION;
char cPath[_MAX_PATH] = "";
char cDrive[_MAX_DRIVE] = "";
char cDir[_MAX_DIR] = "";
char cFName[_MAX_FNAME] = "";
fileName.lpstrInitialDir = cPath;
fileName.lpstrFilter = INI_FILE_EXTENSION;
if (GetOpenFileName (&fileName))
strcpy(g_szIniFile, fileName.lpstrFile);
GlobalUnlock(hFile);
GlobalUnlock(hFileTitle);
GlobalFree(hFile);
GlobalFree(hFileTitle);
}
/////////////////////////////////////////////////////////////////////////////////////////
/****f* DirectshDvr/WndProc
* USAGE
* long CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
* DESCRIPTION
* The main window procedure to handle the user inputs.
* PARAMETERS
* HWND hwnd - Handle to the main window
* UINT message - Current passing message
* UINT wParam -
* LONG lParam -
* RETURN VALUE
/**********************************************************************/
long CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
HDC hdc; // handle to device context
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
g_pPlayer = new RtspPlayer(hwnd);
CreateDialog(g_hInstance, "PLAY_FILE", hwnd, (DLGPROC)PlayFileDlgProc);
break;
case WM_PAINT :
hdc = BeginPaint(hwnd, &ps); // prepares the window for painting
EndPaint(hwnd, &ps); //marks the end of painting for the window
break;
case WM_KEYDOWN:
case WM_LBUTTONDBLCLK:
if (wParam == VK_ESCAPE || message == WM_LBUTTONDBLCLK)
{
if (g_uiWindowStatus == SW_HIDE)
{
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
g_uiWindowStatus = SW_SHOWNORMAL;
g_pPlayer->SetFullScreen(OAFALSE);
}
else if (g_uiWindowStatus == SW_SHOWNORMAL)
{
ShowWindow(hwnd, SW_HIDE);
UpdateWindow(hwnd);
g_uiWindowStatus = SW_HIDE;
g_pPlayer->SetFullScreen(OATRUE);
}
g_pPlayer->UpdateWindowPos(hwnd);
}
break;
case WM_MOVE:
case WM_SIZE:
g_pPlayer->UpdateWindowPos(hwnd);
break;
case WM_GRAPHNOTIFY:
LONG evCode, evParam1, evParam2;
while (SUCCEEDED(g_pPlayer->GetMediaEvent(&evCode, &evParam1, &evParam2, 0)))
{
g_pPlayer->FreeMediaEventParams(evCode, evParam1, evParam2);
switch (evCode)
{
case EC_COMPLETE:
case EC_USERABORT: // 2
if (!g_bLoop)
{
g_pPlayer->Uninitialize();
return 0;
}
else
{
g_pPlayer->Stop();
Sleep(100);
// g_pPlayer->Uninitialize();
// g_pPlayer->Initialize();
g_pPlayer->Play();
break;
}
case EC_NEED_RESTART: // 20
case EC_ERROR_STILLPLAYING: // 8
case EC_STARVATION: // 23
case EC_STREAM_ERROR_STOPPED: // 6
case EC_STREAM_ERROR_STILLPLAYING: // 7
break;
}
}
break;
case WM_DESTROY :
g_pPlayer->Uninitialize();
delete g_pPlayer;
PostQuitMessage(0);
break;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/////////////////////////////////////////////////////////////////////
void DisplayTime(HWND hwnd)
{
DWORD dwTime = (timeGetTime() - g_dwStartTime) / 1000;
char szTemp[25];
wsprintf(szTemp, "%02d:%02d:%02d", dwTime / 3600, (dwTime / 60) % 60, dwTime % 60);
SetDlgItemText(hwnd, IDC_TIME, szTemp);
}
/////////////////////////////////////////////////////////////////////
BOOL CALLBACK PlayFileDlgProc(HWND hDlg, WORD wMsg, WPARAM wParam, LONG lParam)
{
PAINTSTRUCT ps;
HDC hdc;
char str[256];
switch (wMsg)
{
case WM_INITDIALOG:
g_hDlg = hDlg;
g_pPlayer->GetINIInfo(hDlg);
CheckDlgButton(hDlg, IDC_TV_VGA, BST_CHECKED);
CheckDlgButton(hDlg, IDC_LOOP, BST_CHECKED);
CheckDlgButton(hDlg, IDC_FULL_SCREEN, BST_CHECKED);
RegisterHotKey(hDlg, 1, MOD_CONTROL, 0x46); // VK_F, full screen
RegisterHotKey(hDlg, 2, MOD_CONTROL, 0x50); // VK_P, play
RegisterHotKey(hDlg, 3, MOD_CONTROL, 0x53); // VK_S, stop
RegisterHotKey(hDlg, 4, MOD_CONTROL, 0x43); // VK_C, close app
RegisterHotKey(hDlg, 5, MOD_CONTROL, 0x54); // VK-T, tv/vga switch
RegisterHotKey(hDlg, 6, MOD_CONTROL, VK_TAB);
break;
case WM_PAINT:
hdc = BeginPaint(hDlg, &ps);
EndPaint(hDlg, &ps);
break;
case WM_TIMER:
DisplayTime(hDlg);
break;
case WM_HOTKEY:
switch(LOWORD(lParam))
{
case MOD_CONTROL:
switch(HIWORD(lParam))
{
case 'C':
SendMessage(hDlg, WM_COMMAND, IDCANCEL, 0L);
break;
case 'F':
SendMessage(GetParent(hDlg), WM_KEYDOWN, VK_ESCAPE, 0L);
if (IsDlgButtonChecked(hDlg, IDC_FULL_SCREEN) == BST_CHECKED)
{
g_bFullScreen = FALSE;
CheckDlgButton(hDlg, IDC_FULL_SCREEN, BST_UNCHECKED);
}
else
{
g_bFullScreen = TRUE;
CheckDlgButton(hDlg, IDC_FULL_SCREEN, BST_CHECKED);
}
g_pPlayer->SetFullScreen(g_bFullScreen);
break;
case 'P':
SendMessage(hDlg, WM_COMMAND, ID_PLAY, 0L);
break;
case 'S':
SendMessage(hDlg, WM_COMMAND, ID_STOP, 0L);
break;
case 'T':
if (IsDlgButtonChecked(hDlg, IDC_TV_VGA) == BST_CHECKED)
{
g_bTvOut = FALSE;
CheckDlgButton(hDlg, IDC_TV_VGA, BST_UNCHECKED);
}
else
{
g_bTvOut = TRUE;
CheckDlgButton(hDlg, IDC_TV_VGA, BST_CHECKED);
}
g_pPlayer->SetTvOut(g_bTvOut);
break;
case VK_TAB:
SetFocus(GetDlgItem(hDlg, IDC_COMBO_PLAYFILE));
break;
}
}
break;
case WM_COMMAND:
switch (wParam)
{
case IDOK:
case ID_PLAY:
GetDlgItemText(hDlg, IDC_COMBO_PLAYFILE, str, sizeof(str)); // Get selected file name
g_pPlayer->SetFileName(str);
g_pPlayer->Uninitialize();
if (g_pPlayer->Initialize())
{
g_pPlayer->Play();
g_dwStartTime = timeGetTime();
SetTimer(hDlg, 0, 1000, NULL);
EnableWindow (GetDlgItem(hDlg, ID_PLAY), FALSE);
}
else
MessageBox(g_hWnd, "Unable to initialize hardware", NULL, MB_OK);
break;
case ID_STOP:
KillTimer(hDlg, 0);
g_pPlayer->Uninitialize();
EnableWindow (GetDlgItem(hDlg, ID_PLAY), TRUE);
break;
case ID_BROWSE:
BrowseFiles();
g_pPlayer->SetIniFilePath(g_szIniFile);
g_pPlayer->GetINIInfo(hDlg);
break;
case IDC_TV_VGA:
if (IsDlgButtonChecked(hDlg, IDC_TV_VGA) == BST_CHECKED)
g_bTvOut = TRUE;
else
g_bTvOut = FALSE;
g_pPlayer->SetTvOut(g_bTvOut);
break;
case IDC_LOOP:
if (IsDlgButtonChecked(hDlg, IDC_LOOP) == BST_CHECKED)
g_bLoop = TRUE;
else
g_bLoop = FALSE;
break;
case IDC_FULL_SCREEN:
if (IsDlgButtonChecked(hDlg, IDC_FULL_SCREEN) == BST_CHECKED)
g_bFullScreen = TRUE;
else
g_bFullScreen = FALSE;
g_pPlayer->SetFullScreen(g_bFullScreen);
break;
case IDCANCEL:
SendMessage(hDlg, WM_COMMAND, ID_STOP, 0L);
SendMessage(GetParent(hDlg), WM_CLOSE, 0, 0L);
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;
g_hInstance = hInstance;
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_ICON1));
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = CreateSolidBrush(g_KeyColor);
wndclass.lpszMenuName = 0;
wndclass.lpszClassName = g_szAppName;
RegisterClass (&wndclass);
}
int x= 0;
int y = 0;
int w = 640;
int h = 480;
CoInitialize(NULL);
g_hWnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, g_szAppName, g_szAppName, WS_OVERLAPPEDWINDOW,
x, y, w, h, NULL, NULL, hInstance, NULL);
if (g_hWnd)
{
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
CoUninitialize();
return msg.wParam ;
}
////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -