Windows平台RTSP|RTMP播放器如何叠加OSD文字

news2024/9/22 11:32:48

技术背景

我们在做Windows平台RTSP|RTMP播放器的时候,特别是多路播放场景下,开发者希望可以给每一路RTSP或RTMP流添加个额外的OSD台标,以区分不同的设备信息(比如添加摄像头所在位置),本文主要探讨,如何动态添加OSD台标。

技术实现

以大牛直播SDK的C#的RTSP|RTMP播放demo为例,分享下设计实现流程。选中“设置台标”复选框,在player窗口左上角显示“叠加字符展示”,具体内容、坐标可自定义,如果需要关闭台标,可以随时关闭:

实现代码如下:

/*
 * SmartPlayerForm.cs.cs
 * Created by daniusdk.com on 2017/04/19.
 * WeChat: xinsheng120
 */
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);
}
}

总结

Windows平台RTSP|RTMP播放器动态添加OSD文字台标,在实时监控场景下,非常实用,特别是多路场景,以上是大概的实现思路,可能还有开发者说,如果是添加的OSD文字台标,想录制下来,怎么办?实际上,我们也有分享过,可以把播放端解码后的YUV数据回调上来,投递到推送模块,然后,OSD文字水印,以图层的形式添加进去,录像即可,感兴趣的开发者,可以单独跟我沟通探讨。

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

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

相关文章

手写qiankun-页面渲染

registerMicroApps配置子应用 start读取配置&#xff0c;拉取子应用并完成渲染 //全局变量 let _app [];//更好的获取全局变量_app export const getApps () > _app;//app为传递过来的子应用数组 export const registerMicroApps (app) > {_app app; };export cons…

http中get和post怎么选

5.4.2.怎么选择1.如果你是想从服务器上获取资源&#xff0c;建议使用GET请求&#xff0c;如果你这个请求是为了向服务器提交数据&#xff0c;建议使用POST请求。2.大部分的form表单提交&#xff0c;都是post方式&#xff0c;因为form表单中要填写大量的数据&#xff0c;这些数据…

RK3399平台开发系列讲解(内核入门篇)详解内联汇编

🚀返回专栏总目录 文章目录 一、C语言实现加法二、使用汇编函数实现加法三、内联汇编语法四、使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢要深入理解Linux内核中的同步与互斥的实现,需要先了解一下内联汇编:在C函数中使用汇编代码。 现代编译器已经足…

Linux系统调试课:CPUFreq 中央处理器频率调节技术

文章目录 一、CPUFreq组成二、用户接口三、设备树配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中央处理器频率调节(Central Processing Unit frequency,CPUFreq)技术可以降低ARM芯片的功耗,例如在系统对任务压力较小时,通过调整处理器工作频率与输入电压的…

【一图学技术】9.OAuth2.0授权框架SSO单点登录图解及关系区别、使用场景

OAuth2.0原理&SSO单点登录图解 一、单点登录SSO 1.概述 ​ 单点登录&#xff08;全称Single Sign On&#xff0c;简称就是SSO)是一种身份验证和授权机制&#xff0c;它允许用户在多个相关但相互独立的系统或应用程序之间进行无缝切换&#xff0c;而无需重复登录。在多个…

【3】MySQL的安装即启动

目录 一.下载 二.安装 三.启动 一.下载 二.安装 安装MySQL时遇到的Initializing database错误&#xff1a;推荐下面的博客&#xff08;简单就是电脑名不要出现中文&#xff09; https://blog.csdn.net/m0_52775858/article/details/123705566 三.启动 PS&#xff1a;cmd要…

多台USB 3.0相机启动时部分相机无法打开

在使用多台USB 3.0相机时&#xff0c;遇到启动时部分相机无法打开的问题是较为常见的情况。这个问题通常与带宽、供电、驱动程序、或系统资源管理有关。以下是一些优化建议&#xff0c;帮助你提高相机启动的可靠性&#xff1a; 1. USB带宽管理 USB 3.0的带宽虽然比USB 2.0高很…

自训Transformer模型:识别图像是否由AI生成?

背景 随着AI生成图像技术的迅猛发展&#xff0c;特别是生成对抗网络&#xff08;GANs&#xff09;和深度学习的不断进步&#xff0c;生成的图像变得越来越逼真。 这项技术不仅催生了许多创新应用&#xff0c;也带来了潜在的风险和挑战。 Transformer模型在图像识别中的作用 …

PHP初级栈进阶篇

小刘小刘&#xff0c;下雨不愁 (收藏&#xff0c;关注不迷路) 这里我会更新一些php进阶知识点&#xff0c;新手想再进一步可以有个方向&#xff0c;也有个知识图谱的普及 当然本篇不止写技术 会涉及一些进阶路线 我也是在这里积累&#xff0c;希望和同行者一起进步为后来者…

网络协议四 物理层,数据链路层,数字信号,模拟信号,信道,CSMA/CD协议-以太网帧协议,PPP协议,网卡

从这一节开始学习 五层模型。学习方法是从最底层物理层开始学习 七层模型 五层模型 各个层用的协议&#xff0c;以及加上协议后的称谓 各个层的作用 应用层&#xff1a;可以认为是原始数据&#xff0c;该数据称为 报文&#xff0c;用户数据。 运输层&#xff1a;也叫传输层&am…

猫头虎 分享:Python库 Pytest 的简介、安装、用法详解入门教程

猫头虎 分享&#xff1a;Python库 Pytest 的简介、安装、用法详解入门教程 &#x1f680; 今天猫头虎带您深入了解 Python 测试框架 Pytest 的强大功能&#xff0c;手把手教您从安装到实际使用&#xff0c;助您轻松提升代码质量&#xff01;&#x1f63a; 摘要 &#x1f4cb; …

Windows蓝屏事件:深入分析与未来启示

引言 在2024年7月19日&#xff0c;一起引发全球范围蓝屏问题的事件&#xff0c;将安全领域领先的公司CrowdStrike推向了舆论的风口浪尖。尽管事后CrowdStrike发布了一份长达12页的根本原因分析&#xff08;RCA&#xff09;&#xff0c;试图解释并缓解这一问题&#xff0c;但该…

学习笔记 韩顺平 零基础30天学会Java(2024.8.14)

P500 集合体系图 单列集合是指自己只有一个值&#xff0c;双列集合是像键值对这样的 P501 Collection方法 对于第三点&#xff0c;像Set这样的&#xff0c;存放进去的和取出来的顺序可能不是一样的&#xff0c;所以就叫无序的 P502 迭代器遍历 在调用iterator.next()方法之前必…

新160个crackme - 030-Acid Bytes.4

运行分析 需要破解Name和Serial PE分析 upx壳&#xff0c;32位 linux系统upx -d 脱壳 脱壳后发现是Delphi程序 静态分析&动态调试 ida搜索字符串&#xff0c;找到Your Name must be at least 6 Chars long !&#xff0c;双击进入 发现地址为红色&#xff0c;即函数未定义 选…

grpc简单知识

目录 gRPC简介 RPC&#xff08;远程过程调用&#xff09;的定义与重要性 gRPC的设计目标与使用场景 ​编辑gRPC调用方式 Unary RPC&#xff1a;一元RPC Server-side streaming RPC&#xff1a;服务端流式RPC Client-side streaming RPC&#xff1a;客户端流式RPC Bidirecti…

Midjourney应用-用AI帮你做广告视频(动物走秀视频制作)

​ 前言/introduction 在之前的教程里我们讲过动物拟人化图片的生成。 这篇我们讲下这种图片的一种应用&#xff1a; 动物走秀视频广告制作方法 使用工具&#xff1a; MidjourneyAI视频生成工具&#xff08;即梦AI/可灵AI/runway&#xff09; 操作方法 step1-Midjourney出图 …

从数字化到数智化:消费零售企业如何实现门店数智化管理?

随着信息技术的飞速发展&#xff0c;数字化已成为企业转型的必经之路。然而&#xff0c;数字化本身并不是目的&#xff0c;而是通往数智化的桥梁。数智化&#xff0c;即数据智能化&#xff0c;是指企业通过数字化手段收集和分析数据&#xff0c;进而利用这些数据驱动决策和创新…

气象大数据案例项目(求各气象站的平均气温)

气象大数据案例项目&#xff08;求各气象站的平均气温&#xff09; 一、项目需求二、数据格式三、项目开发3.1 在windows 进行开发3.2 运行结果3.3 对项目打包 一、项目需求 现在有一份来自美国国家海洋和大气管理局的数据集&#xff0c;里面包含近30年每个气象站、每小时的天…

C++ 面向对象技术实战:实现基于 POSIX 线程标准封装的线程池

线程池基础概述 为什么要有线程池&#xff1f;假设没有使用线程池时&#xff0c;一个请求用一个子线程来处理。每来一个请求&#xff0c;都得创建子线程&#xff0c;子线程执行请求&#xff0c;关闭子线程。当请求量&#xff08;并发&#xff09;比较大的时候&#xff0c;频繁…

新能源遇“秋老虎”,8月第二周销量集体下滑,问界惨遭腰斩

文/王俣祺 导语&#xff1a;随着日前7月份乘用车销量的公布&#xff0c;我们发现7月并没有因6月各车企的“冲量”行为迎来反噬&#xff0c;对于这种“淡季不淡”的现象市场上一片看好。但从近日公布的8月销量数据来看&#xff0c;人们对于“秋老虎”的恐怖可以说是一无所知。随…