Windows平台RTMP|RTSP播放器实现画面全屏功能
生活随笔
收集整理的這篇文章主要介紹了
Windows平台RTMP|RTSP播放器实现画面全屏功能
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我們在Windows平臺實現(xiàn)RTSP或者RTMP播放的時候,有個功能是繞不開的,那就是播放窗口全屏。本文就以大牛直播SDK(官方)的Windows播放器為例,大概講下大概實現(xiàn):
全屏播放需要考慮的點不多:
第一:視頻播放后,全屏的意義;
第二:全屏后,是否等比例顯示,我們的設計原則是,之前等比例顯示的,繼續(xù)等比例顯示,之前鋪滿的,繼續(xù)鋪滿;
第三:ESC退出全屏。
本文以C++的demo為例,具體實現(xiàn)如下:
void nt_wrapper_render_wnd::FullScreenSwitch() {if ( !::IsWindow(m_hWnd) )return;if (player_handle_ != nullptr){player_api_.SetRenderARGBLogo(player_handle_, nullptr, 0, 0, 0, 0, 0, 0, 0);}if ( !IsFullScreen() ){if ( !IsCanFullScreen() )return;auto old_wnd = GetParent();if ( old_wnd == NULL )return;old_parent_wnd_ = old_wnd->m_hWnd;ASSERT(::IsWindow(old_parent_wnd_));GetWindowRect(&old_rect_);old_wnd->ScreenToClient(old_rect_);HMONITOR hMonitor = ::MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);if (hMonitor == NULL)return;MONITORINFOEX mi;mi.cbSize = sizeof(mi);if ( !GetMonitorInfo(hMonitor, &mi) )return;::SetParent(m_hWnd, NULL);auto wnd_styles = GetWindowLongPtr(m_hWnd, GWL_STYLE);wnd_styles = wnd_styles & (~WS_CHILD); wnd_styles |= WS_POPUP;::SetWindowLongPtr(m_hWnd, GWL_STYLE, wnd_styles);// 隱藏老窗口::ShowWindow(old_parent_wnd_, SW_HIDE);is_full_screen_ = true;::SetWindowPos(m_hWnd, HWND_TOP, mi.rcMonitor.left,mi.rcMonitor.top,mi.rcMonitor.right - mi.rcMonitor.left,mi.rcMonitor.bottom - mi.rcMonitor.top,SWP_FRAMECHANGED);::SetForegroundWindow(m_hWnd);::RedrawWindow(m_hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW| RDW_ERASE);::RedrawWindow(NULL, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW| RDW_ERASE);}else{::ShowWindow(old_parent_wnd_, SW_SHOW);auto wnd_styles = GetWindowLongPtr(m_hWnd, GWL_STYLE);wnd_styles = wnd_styles & (~WS_POPUP);wnd_styles |= WS_CHILD;auto ret = SetWindowLongPtr(m_hWnd, GWL_STYLE, wnd_styles);::SetParent(m_hWnd, old_parent_wnd_);is_full_screen_ = false;MoveWindow(old_rect_, TRUE);} }ESC處理:
void nt_wrapper_render_wnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call default// 全屏的時候,按ESC將退出全屏if ( nChar == VK_ESCAPE ){if ( IsFullScreen() ){FullScreenSwitch();}}CWnd::OnChar(nChar, nRepCnt, nFlags); }C#的實現(xiàn)也非常簡單,感興趣的可自行研究。
總結(jié)
以上是生活随笔為你收集整理的Windows平台RTMP|RTSP播放器实现画面全屏功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学术相关】普通在读奶爸博士生的一年总结
- 下一篇: 【机器学习】算法模型自动超参数优化方法