D3D还是GDI? Windows平台播放RTSP或RTMP渲染模式比较

先说结论,Windows平台播放渲染这块,支持D3D的前提下,优先D3D,如果检测到不支持D3D,数据回调上来,GDI模式绘制。

相比GDI模式,D3D绘制更细腻,绘制效率更高,CPU占用低,只要是系统检测支持,一般建议D3D模式。

无图无真相:

本文以1920*1080分辨率、30帧、固定码率(采集屏幕左侧区域)为例,通过大牛直播SDK ( github) 的Windows平台SmartPublisherDemo.exe工具推送到内网nginx服务器,然后分别以D3D模式和GDI模式拉流(播放端缓冲设置为0)。

可以看到:

D3D模式,CPU占用只有2.7%,延迟:249-156 = 93ms;

GDI模式,CPU占用19.5%,延迟249-73 = 176ms。

无论是从延迟和CPU占用上看,D3D模式都占优。

实现思路:

以C#的demo为例:

1. 先检测系统是否支持D3D模式:

                if (NT.NTBaseCodeDefine.NT_ERC_OK == NTSmartPlayerSDK.NT_SP_IsSupportD3DRender(player_handle_, playWnd.Handle, ref in_support_d3d_render)){if (1 == in_support_d3d_render){is_support_d3d_render = true;}}

2. 如不支持D3D,数据回到上层,做绘制:

                if (is_support_d3d_render){is_gdi_render_ = false;// 支持d3d绘制的话,就用D3D绘制NTSmartPlayerSDK.NT_SP_SetRenderWindow(player_handle_, playWnd.Handle);if (btn_check_render_scale_mode.Checked){NTSmartPlayerSDK.NT_SP_SetRenderScaleMode(player_handle_, 1);}else{NTSmartPlayerSDK.NT_SP_SetRenderScaleMode(player_handle_, 0);}}else{is_gdi_render_ = true;playWnd.Visible = false;// 不支持D3D就让播放器吐出数据来,用GDI绘制//video frame callback (YUV/RGB)//format请参见 NT_SP_E_VIDEO_FRAME_FORMAT,如需回调YUV,请设置为 NT_SP_E_VIDEO_FRAME_FROMAT_I420video_frame_call_back_ = new SP_SDKVideoFrameCallBack(SetVideoFrameCallBack);NTSmartPlayerSDK.NT_SP_SetVideoFrameCallBack(player_handle_, (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, IntPtr.Zero, video_frame_call_back_);}
        public void SetVideoFrameCallBack(IntPtr handle, IntPtr userData, UInt32 status, IntPtr frame){if (frame == IntPtr.Zero){return;}//如需直接处理RGB数据,请参考以下流程NT_SP_VideoFrame video_frame = (NT_SP_VideoFrame)Marshal.PtrToStructure(frame, typeof(NT_SP_VideoFrame));NT_SP_VideoFrame pVideoFrame = new NT_SP_VideoFrame();pVideoFrame.format_ = video_frame.format_;pVideoFrame.width_ = video_frame.width_;pVideoFrame.height_ = video_frame.height_;pVideoFrame.timestamp_ = video_frame.timestamp_;pVideoFrame.stride0_ = video_frame.stride0_;pVideoFrame.stride1_ = video_frame.stride1_;pVideoFrame.stride2_ = video_frame.stride2_;pVideoFrame.stride3_ = video_frame.stride3_;Int32 argb_size = video_frame.stride0_ * video_frame.height_;pVideoFrame.plane0_ = Marshal.AllocHGlobal(argb_size);CopyMemory(pVideoFrame.plane0_, video_frame.plane0_, (UInt32)argb_size);if (playWnd.InvokeRequired){BeginInvoke(set_video_frame_call_back_, status, pVideoFrame);}else{set_video_frame_call_back_(status, pVideoFrame);}}

具体绘制代码:

        private void SmartPlayerForm_Paint(object sender, PaintEventArgs e){if (player_handle_ == IntPtr.Zero || !is_gdi_render_ || !is_playing_){return;}if (cur_video_frame_.plane0_ == IntPtr.Zero){return;}Bitmap bitmap = new Bitmap(cur_video_frame_.width_, cur_video_frame_.height_, cur_video_frame_.stride0_,System.Drawing.Imaging.PixelFormat.Format32bppRgb, cur_video_frame_.plane0_);int image_width = cur_video_frame_.width_;int image_height = cur_video_frame_.height_;Graphics g = e.Graphics;    //获取窗体画布g.SmoothingMode = SmoothingMode.HighSpeed;int limit_w = this.Width - 60;int limit_h = this.Height - playWnd.Top - 60;if (btn_check_render_scale_mode.Checked){int d_w = 0, d_h = 0;int left_offset = 0;int top_offset = 0;Brush brush = new SolidBrush(Color.Black);g.FillRectangle(brush, playWnd.Left, playWnd.Top, limit_w, limit_h);GetRenderRect(limit_w, limit_h, image_width, image_height, ref left_offset, ref top_offset, ref d_w, ref d_h);g.DrawImage(bitmap, playWnd.Left + left_offset, playWnd.Top + top_offset, d_w, d_h);   //在窗体的画布中绘画出内存中的图像}else{g.DrawImage(bitmap, playWnd.Left, playWnd.Top, limit_w, limit_h);   //在窗体的画布中绘画出内存中的图像}}

目前来看,不支持D3D的机器少之又少,在环境具备的情况下,优先建议考虑D3D模式绘制。

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

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

相关文章

Android投屏(屏幕共享)设计需要考虑的关键因素

许多开发者,在做智慧教室同屏、会议同屏之类的方案时,基于Andriod平台的采集,往往遇到各种各样的问题,以下就几个点,抛砖引玉: 1. 内网环境下,组播还是RTMP? 回答:这个…

微信公众号怎么给微店设置运费

微信小店想要设置运费,该怎么设置呢?今天我们就来看看使用微信公众号设置微店运费的教程。 1、在电脑登录你的微信公众号服务号,确保已经事先开通了微信小店功能 微信公众号怎么给微店设置运费? 2、点击左侧导航栏的微信小店,进去后点击…

RTSP/RTMP播放端录像不可忽视的几个设计要点

很多开发者提到,拉取的摄像机(一般RTSP流)或RTMP流,如果需要录制,需要考虑哪些因素,本文以大牛直播SDK的Windows平台拉流端录像为例(github),做个简单的介绍:…

海康摄像机rtsp地址格式(官方最新版)

★目前海康录像机、网络摄像机,网络球机的RTSP单播取流格式如下(车载录像机不支持RTSP取流): rtsp://用户名:密码IP:554/Streaming/Channels/101 →录像机示例: 取第1个通道的主码流预览 rtsp://admin:hik1234510.…

QQ邮箱怎么发送文件夹 怎样在QQ邮箱里发送压缩文件夹

有很多用户想要知道怎么样才能通过QQ邮箱来发送自己的一些文件压缩包,应该怎么操作呢?不要慌,现在小编就给大家分享一下,下面一起来学习操作步骤吧! 其实,无论何种邮箱都无法发送文件夹,都只能对文件进行操作。如果文…

时光手帐怎么修改作品 时光手帐修改作品封面方法

对于自己在时光手账Pro中的手账本封面是可以随时更改的。那么,怎么在时光手账Pro中更改自己手账封面?下面我使用苹果手机(安卓端操作方法一致)来分享一下具体的操作流程。 首先打开手机,点击进入时光手账Pro。 时光手帐怎么修改作品 时光手帐修改作品…

几款优秀的点播、RTSP/RTMP直播播放器介绍

1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器。实现了跨平台功能,API 易于集成;编译配置可裁剪,方便控制安装包大小&…

Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结

很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型: 1. Android摄像头前后…

作业帮口算批改怎么开 作业帮口算批改如何用

作业帮口算批改功能怎么用?作业帮最近全新改版的消息传的很火,新增了口算批改的功能,很吸引人。但是还有很多用户不是很清楚作业帮口算批改功能怎么用,下面是小编整理的关于作业帮口算批改功能怎么用的相关资讯,快来看看吧! 作业…

RTSP播放器或RTMP播放器常用的事件回调设计

很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用的event id,总的来说&…

Windows平台RTMP多实例推送探讨

之前,我们博客 https://blog.csdn.net/renhui1112/article/details/105624392 提到,Android平台RTMP多实例推送的几种情况探讨,简单来说有以下三种情况: 多路编码,多个实例分别推送到不同的RTMP URL(如And…

Win7蓝屏代码0x000000001e怎么解决

蓝屏问题,是所有系统都会遇到的最普遍的电脑故障问题,电脑蓝屏是因为系统与硬件或软件不兼容冲突引起的,不同的提示代码表示了不同的蓝屏原因,那么Win7蓝屏代码0x000000001e怎么解决?为此问题困扰的用户,请来看看Win7…

开发个好的RTMP播放器到底难在哪里?RTMP播放器对标和考察指标

好多开发者提到,RTMP播放器,不知道有哪些对标和考察指标,以下大概聊聊我们的一点经验,感兴趣的,可以关注 github: 1. 低延迟:大多数RTMP的播放都面向直播场景,如果延迟过大&#xf…

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

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

Win7图片查看器打印不了图片怎么办

当我们想浏览电脑中的图片文件时,可以选择系统自带的图片查看器或者第三方看图工具打开,但是有些win7用户发现自己想通过windows图片查看器打印图片却没有反应,Win7图片查看器打印不了图片怎么办?就此剖,下面小编就来教教大家解决…

Android平台屏幕/摄像头或外部数据采集及RTMP推送接口设计描述

好多开发者提到,为什么大牛直播SDK的Android平台RTMP推送接口怎么这么多?不像一些开源或者商业RTMP推送一样,就几个接口,简单明了。 不解释,以Android平台RTMP推送模块常用接口,看看这些接口有没有存在的意…

钉钉怎么设置考勤打卡规则

1、首先在电脑上登陆钉钉后台,然后点击如图所示的钉钉考勤打卡 钉钉后怎么设置考勤打卡规则? 2、比如一个公司生产型企业 互联网部门上班时间是 周一到周五上班时间 8:30-5:30 周六上班 8:30-12:00 以此作为案例说明 钉钉后怎么设置考勤打卡规则? 3、首先设…

变废为宝:使用废旧手机实现实时监控方案

随着手机淘汰的速度越来越快,大多数手机功能性能很强劲就不再使用了,以大牛直播SDK现有方案为例,本文探讨下,如何用废旧手机实现实时监控方案(把手机当摄像头做监控之用): 本方案需要准备一个手…

企业微信登录不了怎么办 企业微信无法登录的原因及解决方法

企业微信无法登陆怎么办?企业微信为什么登陆不了?应该怎么解决?企业微信一个很好用的基础办公沟通工具,现在很多朋友都在使用。那么,如果遇到企业微信登不上的情况应该怎么办呢?接下来小编就给大家带来企业微信无法登录的原因及解决方法,…

RTSP鉴权认证之基础认证和摘要认证

RTSP认证类型 基本认证(basic authentication):http 1.0提出的认证方案,其消息传输不经过加密转换因此存在严重的安全隐患;摘要认证(digest authentication):http 1.1提出的基本认证…