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

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

  1. Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制

    为什么要支持GDI 先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模 ...

  2. Windows平台RTMP/RTSP播放器如何实现实时音量调节

    为什么要做实时音量调节 RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们 ...

  3. Android平台RTMP/RTSP播放器开发系列之解码和绘制

    本文主要抛砖引玉,粗略介绍下Android平台RTMP/RTSP播放器中解码和绘制相关的部分(Github). 解码 提到解码,大家都知道软硬解,甚至一些公司觉得硬解码已经足够通用,慢慢抛弃软解了,如 ...

  4. Android、iOS平台RTMP/RTSP播放器实现实时音量调节

    介绍移动端RTMP.RTSP播放器实时音量调节之前,我们之前也写过,为什么windows播放端加这样的接口,windows端播放器在多窗口大屏显示的场景下尤其需要,尽管我们老早就有了实时静音接口,相对 ...

  5. Windows平台RTMP/RTSP直播推送模块设计和使用说明

    开发背景 好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们设计的W ...

  6. android 直播流服务器,视频-Android上的实时流RTMP / RTSP播放器,无需使用webview(WOWZA服务器)...

    视频-Android上的实时流RTMP / RTSP播放器,无需使用webview(WOWZA服务器) 我正在开发一个Android应用程序,我想在其中发布和播放视频... 我想要的是: 我的应用记录 ...

  7. 熊猫怎么用html5看直播,熊猫TV HTML5播放器自动网页全屏

    // ==UserScript== // @name 熊猫TV HTML5播放器自动网页全屏 // @name:zh-CN 熊猫TV HTML5播放器自动网页全屏 // @namespace pand ...

  8. mx播放器有没有投屏功能_这个播放器真是太强大了!

    吾爱分享网 分享是一种态度 小编曾经给大家推荐过堪称安卓最强大的本地视频播放神器MX player,而今天要给大家推荐的神器则是堪称音乐界的MX播放器,JetAudio.无论是支持格式,还是自定义调整 ...

  9. mx播放器有没有投屏功能_手机屏幕太小怎么办?一步就能投屏到电视上!

    把手机上的内容同步到电视上,有两种方法:有线投屏和无线投屏.可能大部分人都喜欢用无线投屏,但无线投屏必须要有一个稳定的WIFI,并且还要额外下载软件,延时也很高,所以个人不推荐这种方法. 我们的电视都 ...

最新文章

  1. 《Spring2之站立会议8》
  2. python表头写进csv文件_Python读取CSV文件列并在CSV-fi中写入文件名和列名
  3. 面试被拒绝如何争取_争取反馈
  4. 【UDP协议头解析】
  5. Scrapy-Item Pipeline(项目管道)
  6. Java的多线程以及内存模型的知识点梳理,有想到过这些吗?
  7. 学习C++怎么进阶?
  8. 关于如何获得网站集宿主网站集地址的问题
  9. includes(), startsWith(), endsWith()
  10. java单链表基本操作 一,Java_实现单链表-基本操作
  11. SAP自学指南:案例公司的SAP解决方案
  12. 【w3cschool】正则表达式基础语法
  13. 和catch的区别_面试刷题2:Exception和Error的区别?
  14. 《Linux程序设计》 - 《Linux高级程序设计》 - 《Unix环境高级编程》
  15. 宁波注塑电子塑料件加工
  16. 网易python公开课_教程帖-爬取网易云课堂上所有python课程的基本信息
  17. 量化投资--技术篇(4) 投资组合策略
  18. Linux入门学习 —— 常用的基本命令(上)
  19. 钛资本研究院:创业公司如何搭建高管团队,实现组织跃升?
  20. 更换Eclipse黑色皮肤

热门文章

  1. 两点间最短路 java_AcWing 850. Dijkstra求最短路 II_Java实现含详细注释
  2. git add 撤销_更科学地管理你的项目,Git 简明教程(二)
  3. 贪吃蛇程序 php,微信小程序-贪吃蛇教程实例
  4. java set是重复_java算法题,set内出现重复元素
  5. 程序代码错误检测_错误检测代码
  6. Java Vector setElementAt()方法与示例
  7. html5画分形图形,2.5 绘制透明图形 - HTML5 Canvas 实战
  8. android 颜色范围,Android系统颜色的适用范围
  9. c winform 上传文件到mysql_C# winform DevExpress上传图片到数据库【转】
  10. Java PushbackInputStream skip()方法与示例