Windows平台RTMP/RTSP播放器窗口添加OSD叠加文字效果

2023-10-31 05:20

本文主要是介绍Windows平台RTMP/RTSP播放器窗口添加OSD叠加文字效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:https://zhuanlan.zhihu.com/p/353750409

Windows平台RTMP/RTSP播放器窗口添加OSD叠加文字效果

牛哥

牛哥

大牛直播SDK联合创始人,daniusdk.com

好多开发者在做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);}

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

发布于 03-01

这篇关于Windows平台RTMP/RTSP播放器窗口添加OSD叠加文字效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/313086

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设