Windows平台RTMP播放器/RTSP播放器如何在播放窗口添加OSD文字叠加

好多开发者在做Windows平台特别是单屏多画面显示时,希望像监控摄像机一样,可以在播放画面添加OSD台标,以实现字符叠加效果,大多开发者可很轻松的实现以上效果,针对此,本文以大牛直播SDK (Github)的Windows平台demo为例,简单介绍下具体实现:

Windows平台RTMP播放器、RTSP播放器C++ demo

Windows平台C++的demo,以录像过程为例,动态在左上角显示个闪动的图标+当前时间,具体效果如下:

核心代码

std::shared_ptr<nt_argb_image_logo> CSmartPlayerDlg::MakeLogo()
{std::shared_ptr<nt_argb_image_logo> logo_image;if (!is_init_gdi_plus_ok_)return logo_image;if (!recoder_image_){static bool is_load_image_failed = false;if (!is_load_image_failed){recoder_image_.reset(Gdiplus::Image::FromFile(_T("red_circle.png")));if (recoder_image_ && Gdiplus::Ok != recoder_image_->GetLastStatus()){is_load_image_failed = true;recoder_image_.reset();}}}is_has_recoder_image_ = !is_has_recoder_image_;if (!recoder_image_){is_has_recoder_image_ = false;}if (m_hWnd == nullptr || !::IsWindow(m_hWnd))return logo_image;if (cur_logo_font_name_.empty()){cur_logo_font_name_ = FindLogoFontName();}if (cur_logo_font_name_.empty()){return logo_image;}Gdiplus::FontFamily font_family(cur_logo_font_name_.c_str());if (!font_family.IsAvailable()){return logo_image;}Gdiplus::Font font(&font_family, 10, Gdiplus::FontStyleBold, Gdiplus::Unit::UnitPoint);if (!font.IsAvailable()){return logo_image;}// 白色Gdiplus::SolidBrush solid_brush(Gdiplus::Color(255, 255, 255));Gdiplus::Graphics  graphics(m_hWnd);if (Gdiplus::Ok != graphics.GetLastStatus()){return logo_image;}int recoder_image_w = 18;int recoder_image_h = 18;if (recoder_image_){recoder_image_w = recoder_image_->GetWidth();recoder_image_h = recoder_image_->GetHeight();}auto image_w = recoder_image_w + 2 + 5;auto image_h = recoder_image_h + 5 + 5;graphics.SetTextRenderingHint(Gdiplus::TextRenderingHint::TextRenderingHintClearTypeGridFit);auto cur_time_str = MakeCurTimerStr();Gdiplus::RectF bounding_box(0, 0, 0, 0);graphics.MeasureString(cur_time_str.c_str(), -1, &font, Gdiplus::PointF(0, 0), &bounding_box);Gdiplus::SizeF text_size(0, 0);bounding_box.GetSize(&text_size);image_w += (int)text_size.Width;image_h = image_h > ((int)text_size.Height) ? image_h : ((int)text_size.Height);image_w += 2;image_h += 2;image_w = ByteAlign(image_w, 4);image_h = ByteAlign(image_h, 4);Gdiplus::Bitmap   bitmap(image_w, image_h, PixelFormat32bppARGB);if (Gdiplus::Ok != bitmap.GetLastStatus()){return logo_image;}Gdiplus::Graphics g(&bitmap);if (Gdiplus::Ok != g.GetLastStatus()){return logo_image;}int r_left = 2;int r_top = (image_h / 2) - (recoder_image_h / 2);r_top -= 1;if (is_has_recoder_image_){g.DrawImage(recoder_image_.get(), r_left, r_top);}r_left += recoder_image_w;r_left += 5;r_top = (image_h / 2) - (text_size.Height / 2);g.DrawString(cur_time_str.c_str(), -1, &font, Gdiplus::PointF(r_left, r_top), &solid_brush);Gdiplus::BitmapData locked_bitmapData;if (Gdiplus::Ok == bitmap.LockBits(nullptr, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &locked_bitmapData)){auto buffer_size = locked_bitmapData.Stride * locked_bitmapData.Height;std::unique_ptr<NT_BYTE[]> buffer(new NT_BYTE[buffer_size]);if (buffer){logo_image = std::make_shared<nt_argb_image_logo>(locked_bitmapData.Width, locked_bitmapData.Height);logo_image->stride_ = locked_bitmapData.Stride;memcpy(buffer.get(), locked_bitmapData.Scan0, buffer_size);logo_image->data_.swap(buffer);}bitmap.UnlockBits(&locked_bitmapData);}return logo_image;
}

Windows平台RTMP播放器、RTSP播放器C# demo

Windows平台C#的demo,添加了“设置台标”选择框,在player窗口左上角显示“叠加字符展示”,具体内容、坐标可自定义,具体效果如下:

核心代码

        //设置OSD文本private void DrawOSD(string draw_text){// gdi 绘制的话,文本请自己绘制if (is_gdi_render_)return;if (player_handle_ == IntPtr.Zero)return;if (draw_text == null || draw_text.Length < 1){NTSmartPlayerSDK.NT_SP_SetRenderARGBLogo(player_handle_, IntPtr.Zero, 0, 0, 0, 0, 0, 0, 0);return;}Graphics graphics = this.CreateGraphics();SolidBrush solid_brush = new SolidBrush(Color.FromArgb(255, 255, 255));graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;SizeF text_size = new SizeF();text_size = graphics.MeasureString(draw_text, this.Font);int image_w = (int)text_size.Width + 4;int image_h = (int)text_size.Height + 4;image_w = (int)ByteAlign((UInt32)image_w, 4);image_h = (int)ByteAlign((UInt32)image_h, 4);Bitmap bmp = new Bitmap(image_w, image_h, System.Drawing.Imaging.PixelFormat.Format32bppArgb);Graphics g = Graphics.FromImage(bmp);g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;float left = image_w / 2 - text_size.Width / 2;float top = image_h / 2 - text_size.Height / 2;g.DrawString(draw_text, this.Font, solid_brush, left, top);Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);System.Drawing.Imaging.BitmapData bmp_data = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);IntPtr ptr = bmp_data.Scan0;int strdie = Math.Abs(bmp_data.Stride);NTSmartPlayerSDK.NT_SP_SetRenderARGBLogo(player_handle_, ptr, strdie, bmp_data.Width,bmp_data.Height, 6, 6, bmp_data.Width, bmp_data.Height);// Unlock the bits.bmp.UnlockBits(bmp_data);}}

注意,如果GDI模式下,我们数据回调到上层绘制的,这样加起来更简单:

            if (btn_check_add_osd.Checked){string draw_text = "叠加字符展示";Graphics graphics = this.CreateGraphics();SolidBrush solid_brush = new SolidBrush(Color.FromArgb(255, 255, 255));graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;float left = playWnd.Left + 4;float top = playWnd.Top + 4;g.DrawString(draw_text, this.Font, solid_brush, left, top);}

感兴趣的开发者可自行尝试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6款真正好用的播放器推荐

GOM player GOM player 是一款本身装有视频播放所需的解码&#xff0c;及占用系统资源少&#xff0c;并且能以最优秀的画质来观看多种格式影片的播放程序。 可以支持播放大多数当前流行的视频格式&#xff0c;如&#xff1a;MP4、AVI、WMV、MKV、MOV、FLV 等)&#xff0c;并且…

win7系统电脑运行速度的提升方法

win7系统是一款被大多数用户们认可的好用系统&#xff0c;在不断的对win7系统的使用中很多用户们都在寻找win7提高电脑运行速度的方法&#xff0c;今天小编就为大家带来了win7系统电脑运行速度的提升方法&#xff0c;让我们一起来看一下吧。 win7系统电脑运行速度的提升方法 …

Windows平台Unity3d下如何同时播放多路RTSP或RTMP流

好多开发者在做AR、VR或者教育类产品时&#xff0c;苦于如何在windows平台构建一个稳定且低延迟的RTSP或者RTMP播放器&#xff0c;如果基于Unity3d完全重新开发一个播放器&#xff0c;代价大、而且周期长&#xff0c;不适合快速出产品&#xff0c;我们认为当前最好的方式就是集…

如何修改Win11睡眠时间

近日&#xff0c;微软发布了 Win11 的首个预览版&#xff0c;所有之前已加入到 Insider Preview 的用户都能收到这个版本。该版本融入了发布会里的很多变化&#xff0c;但并未添加 Microsoft Teams 和安卓应用支持。相信很多朋友已经安装体验了一把。大家知道为了节省电量&…

Android平台使用Camera2(5.0+)替代过时的Camera

转自&#xff1a;https://forums.developer.amazon.com/articles/2707/using-camera2-to-replace-deprecated-camera-api.html From Android 5.0(API Level 21) the new Camera2 API(android.hardware.Camera2) is introduced which now gives full manual control over Andro…

RTMP播放器开发填坑之道

好多开发者提到&#xff0c;在目前开源播放器如此泛滥的情况下&#xff0c;为什么还需要做自研框架的RTMP播放器&#xff0c;自研和开源播放器&#xff0c;到底好在哪些方面&#xff1f;以下大概聊聊我们的一点经验&#xff0c;感兴趣的&#xff0c;可以关注 github&#xff1a…

Win11系统语言修改不了中文怎么办

一些升级了Win11系统的朋友发现升级后发现是英文版的&#xff0c;怎么把英文版的换成中文版的呢?下面为大家带来如何把Win11系统语言从英文变成中文&#xff0c;方法非常简单。 Win11系统语言修改不了中文怎么办 1、首先打开区域和语言设置(搜索)&#xff0c;看看是否有“显…

Vscode —— 解决Vscode终端无法使用npm的命令的问题

在cmd中可以正常执行npm -v等指令,但是在vs code终端中,无法执行npm -v,node -v等指令 出现报错 解决办法&#x1f447; 方法一&#xff1a;【右键单击Vscode】以【管理员身份运行】&#xff0c;【重启Vscode】 方法二&#xff1a;①【用户变量】的【path】添加npm所在路径的…

RTSP播放器开发填坑之道

好多开发者提到&#xff0c;在目前开源播放器如此泛滥的情况下&#xff0c;为什么还需要做自研框架的RTSP播放器&#xff0c;自研和开源播放器&#xff0c;到底好在哪些方面&#xff1f;以下大概聊聊我们的一点经验&#xff0c;感兴趣的&#xff0c;可以关注 github&#xff1a…

ijkplayer、VLC Player、SmartPlayer、ExoPlayer播放器比较

ijkPlayer ijkPlayer是BiliBili公司维护的一个开源工程&#xff0c;基于ffmpeg开发的一个播放器软件&#xff0c;支持Android和iOS平台&#xff0c;整个ijkplayer就是以ffplay为基础&#xff0c;如果只是使用它进行播放&#xff0c;集成也较为简单&#xff0c;使用也和MediaPl…

Win11系统设置绿色护眼模式的方法

随着Win11系统电脑的逐步推广&#xff0c;Win11系统在市场上的用户量也是越来越大&#xff0c;不少电脑办公群体也是很青睐于使用Win11系统&#xff0c;然而&#xff0c;长时间的办公容易造成视觉疲劳&#xff0c;为此&#xff0c;很多人希望把电脑的显示颜色改成”护眼绿“&am…

浏览器播放RTSP视频流几种解决方案

方案一: H5 websocket_rtsp_proxy 实现视频流直播 Streamedian 提供了一种“html5_rtsp_player websock_rtsp_proxy”的技术方案&#xff0c;可以通过html5的video标签直接播放RTSP的视频流。 整个架构如下图所示&#xff0c;分为服务器端和浏览器端两部分&#xff1a; 方案…

技术员联盟Win11 64位官方全新旗舰版镜像V2021.08

技术员联盟Win11 64位官方全新旗舰版镜像V2021.08以微软官方纯净版作为母盘对系统进行了全面优化更新&#xff0c;用户使用更加流畅顺手&#xff0c;轻松体验到系统的优秀性能&#xff0c;适用目前市场最新机型以及老旧机型&#xff0c;多种安装方式供用户选择&#xff0c;且更…

Android播放器之SurfaceView与GLSurfaceView

先看Surface Surface的官方介绍&#xff1a;Handle onto a raw buffer that is being managed by the screen compositor&#xff0c;Surface是一个raw buffer的句柄&#xff0c;通过它在raw buffer上进行绘制&#xff0c;可以通过Surface获得一个Canvas。 Canvas canvas mS…

几款知名RTMP推流模块比较:OBS VS SmartPublisher VS Flash Media Live Encoder

OBS 功能强大&#xff0c;几乎所有你想要的场景它都有&#xff0c;用起来很顺手。可以将桌面、摄像头、程序窗口通过rtmp推送到流媒体服务器上。 当然如果你是开发者&#xff0c;想基于OBS做二次开发&#xff0c;实现二次产品化的化&#xff0c;难度比较大&#xff0c;OBS代码…

中关村Win11 32位微软原版ISO V2021.08

中关村Win11 32位微软原版ISO V2021.08以微软官方原版作为母盘对系统进行了全面优化更新&#xff0c;支持一键化智能安装&#xff0c;在操作舒适性和便捷性方面进行了优化设计&#xff0c;流畅稳定&#xff0c;系统进行了全面优化&#xff0c;大大降低了发生蓝屏和黑屏的可能&a…

如何用轻量级RTSP服务本地生成RTSP测试URL

最近发现好多开发者都在搜索可用的RTSP测试URL&#xff0c;目前公网实际可测试的RTSP URL非常少&#xff0c;即便是可用&#xff0c;分辨率和网络也非常差&#xff0c;不适合长期测试。 针对此&#xff0c;我们的建议是最好直接网上买个海康或大华的摄像头&#xff0c;一般来说…

Windows平台RTSP|RTMP播放端SDK集成说明

2.1 demo说明 大牛直播SDK提供C/C#两套接口&#xff0c;对外提供32/64位debug/release库&#xff0c;C和C#接口一一对应&#xff0c;C#接口比C接口增加前缀NT_PB_&#xff1b;WIN-PlayerSDK-CPP-Demo&#xff1a;播放端SDK对应的C接口的demo&#xff1b;WIN-PlayerSDK-CSharp-…

微软为Win11用户更新了剪贴工具、计算器以及邮件和日历应用

微软今天宣布为Windows 11的几个预装应用程序推出第一次更新&#xff0c;以下应用程序的更新正在向开发渠道的Windows Insiders推出。微软正在将经典的Snipping Tool和Snip & Sketch合并为一个截屏应用程序&#xff0c;而计算器、邮件和日历都将以新的视觉风格以配合Window…

Windows平台RTMP直播推送集成简要说明

好多开发者在集成大牛直播SDK &#xff08;官方&#xff09;的Windows平台RTMP推送模块时吓一跳&#xff0c;怎么这么多接口&#xff1f;本文做个简单的拆分&#xff1a; 初始化 初始化之前&#xff0c;如需设置日志路径&#xff0c;调用NTSmartLog.NT_SL_SetPath(log_path);…