Windows平台RTMP|RTSP播放器实现画面全屏功能

简介: 我们在Windows平台实现RTSP或者RTMP播放的时候,有个功能是绕不开的,那就是播放窗口全屏。本文就以大牛直播SDK(官方)的Windows播放器为例,大概讲下大概实现:

我们在Windows平台实现RTSP或者RTMP播放的时候,有个功能是绕不开的,那就是播放窗口全屏。本文就以大牛直播SDK(官方)的Windows播放器为例,大概讲下大概实现:


全屏播放需要考虑的点不多:


第一:视频播放后,全屏的意义;


第二:全屏后,是否等比例显示,我们的设计原则是,之前等比例显示的,继续等比例显示,之前铺满的,继续铺满;


第三:ESC退出全屏。


本文以C++的demo为例,具体实现如下:

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#的实现也非常简单,感兴趣的可自行研究。

相关文章
|
1月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
205 4
|
1月前
|
NoSQL Shell MongoDB
Windows 平台安装 MongoDB
10月更文挑战第10天
46 0
Windows 平台安装 MongoDB
|
1月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
201 0
|
6天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
12天前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
41 3
|
15天前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
|
1月前
|
边缘计算 安全 网络安全
|
1月前
|
数据安全/隐私保护 Windows
安装 Windows Server 2019
安装 Windows Server 2019
|
1月前
|
网络协议 Windows
Windows Server 2019 DHCP服务器搭建
Windows Server 2019 DHCP服务器搭建
|
1月前
|
网络协议 定位技术 Windows
Windows Server 2019 DNS服务器搭建
Windows Server 2019 DNS服务器搭建
下一篇
无影云桌面