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

相关文章
|
3月前
|
编解码 监控 图形学
Windows平台Unity下播放RTSP或RTMP如何开启硬解码?
我们在做Windows平台Unity播放RTMP或RTSP的时候,遇到这样的问题,比如展会、安防监控等场景下,需要同时播放多路RTMP或RTSP流,这样对设备性能,提出来更高的要求。
|
3月前
|
数据采集 vr&ar 图形学
Windows平台Unity Camera场景实现轻量级RTSP服务和RTMP推送
随着VR技术在医疗、军事、农业、学校、景区、消防、公共安全、研学机构、展厅展馆,商场等场所普及,开发者对Unity平台下的直播体验提出了更高的要求。
|
3月前
|
编解码 应用服务中间件 开发工具
Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制
先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模式。
|
3月前
|
开发工具 Windows
Windows平台RTMP推送|轻量级RTSP服务实现本地摄像头|屏幕|叠加数据预览
大家在做Windows平台RTMP推送或轻量级RTSP服务的时候,不管是采集屏幕还是采集摄像头,亦或屏幕摄像头的叠加模式,总会有这样的诉求,采集到的数据,希望能本地看看具体采集的数据或者图像实际效果,也就是本次介绍的“预览”功能。
121 0
|
3月前
|
vr&ar 开发工具 图形学
Windows平台Unity3d下如何同时播放多路RTSP或RTMP流
好多开发者在做AR、VR或者教育类产品时,苦于如何在windows平台构建一个稳定且低延迟的RTSP或者RTMP播放器,如果基于Unity3d完全重新开发一个播放器,代价大、而且周期长,不适合快速出产品,我们认为当前最好的方式就是集成现有Native平台上成熟稳定播放器,回调rgb/yuv数据到上层,上层做绘制即可。
|
3月前
|
监控 开发工具 C++
Windows平台RTMP/RTSP播放器如何实现实时音量调节
RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们通用的做法是支持播放端实时静音,更细粒度的做法是可以实时调节每一路RTMP/RTSP流的音量。
|
3月前
|
监控 数据处理 开发工具
Windows平台RTSP播放器/RTMP播放器设计需要考虑的几个点
我们在实现Windows平台RTSP播放器或RTMP播放器的时候,需要考虑的点很多,比如多实例设计、多绘制模式兼容、软硬解码支持、快照、RTSP下TCP-UDP自动切换等,以下就其中几个方面,做个大概的探讨。
|
3月前
|
网络协议 开发工具 C#
Windows平台如何快速实现RTSP/RTMP直播播放
前段时间,我们在 https://blog.csdn.net/renhui1112/article/details/104143794 提到“RTSP播放器开发过程中需要考虑哪些关键因素”,本次主要介绍,如何调用SDK实现RTSP/RTMP播放能力。
169 0
|
3月前
|
编解码 开发工具 C#
Windows平台RTMP/RTSP直播推送模块设计和使用说明
好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们设计的Windows平台RTSP、RTMP直播推送模块,设计和使用说明,供大家参考。
229 0
|
3月前
|
开发工具 图形学 Android开发
Windows/Android/IOS平台如何在Unity3d播放RTSP/RTMP流
如果基于Unity3d完全重新开发一个播放器,代价大,周期长,不适合快速出产品,最好的方式就是集成现有Native平台上成熟稳定播放器.
相关产品
云迁移中心
推荐文章
更多