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

相关文章
|
19天前
|
存储 文字识别 C#
.NET开源免费、功能强大的 Windows 截图录屏神器
今天大姚给大家分享一款.NET开源免费(基于GPL3.0开源协议)、功能强大、简洁灵活的 Windows 截图、录屏、Gif动图制作神器:ShareX。
|
1月前
|
Windows
Windows 命令提示符(CMD)操作(七):扩展命令和功能
Windows 命令提示符(CMD)操作(七):扩展命令和功能
50 0
|
26天前
|
应用服务中间件 nginx Windows
windows下Nginx+RTMP部署
windows下Nginx+RTMP部署
21 0
|
1月前
|
Windows
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
144 0
|
2月前
|
C# Windows
.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件
.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件
|
3月前
|
编解码 数据挖掘 异构计算
Windows平台实现超高分辨率或帧率硬编码
Windows平台实现超高分辨率或帧率硬编码
|
3月前
|
C# 数据安全/隐私保护 开发者
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
|
3月前
|
存储 网络协议 安全
Windows Server 2022 安全功能重大更新
这篇文将介绍 Windows Server 2022 中的一些新增的安全功能,在 Windows Server 2019 的强大基础之上引入了许多创新功能。
60 0
|
3月前
|
C++ Windows
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
|
4月前
|
Linux Shell 开发工具
Git 安装和配置教程:Windows - Mac - Linux 三平台详细图文教程,带你一次性搞 Git 环境
Git是一款免费、开源的分布式版本控制系统,广泛应用于软件开发领域。随着开源和云计算的发展,Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法,带你一次性搞定Git环境
1593 0