Windows平台实现超高分辨率或帧率硬编码

简介: Windows平台实现超高分辨率或帧率硬编码

 我们在做Windows平台RTMP推送或轻量级RTSP服务模块的时候,遇到这样的问题,有些超高清场景(4K甚至更高分辨率)或高帧率场景(50帧+)的编码,比如地铁安检机数据分析检测,设备性能一般的话,软编码很容易出现瓶颈,这个时候就需要硬编。基于此,我们前几年发布了基于NVIDIA的硬编。

image.gifwindows二次水印.png

硬编码逻辑调用:

privatevoidLoadHWVideoEncoderInfos()
        {
hw_video_encoder_infos_.Clear();
Int32count=0;
UInt32ret=NTSmartPublisherSDK.NT_PB_GetHWVideoEncoderInfoCount(refcount);
if (NTBaseCodeDefine.NT_ERC_OK==ret&&count>0)
            {
IntPtrptr_hw_video_encoder_infos=Marshal.AllocHGlobal(Marshal.SizeOf(typeof(NT_PB_HWVideoEncoderInfo)) *count);
Int32out_count=0;
ret=NTSmartPublisherSDK.NT_PB_GetHWVideoEncoderInfos(ptr_hw_video_encoder_infos, count, refout_count);
if (ret!=NTBaseCodeDefine.NT_ERC_OK||out_count<1)
                {
hw_video_encoder_infos_.Clear();
                }
else                {
for (inti=0; i<out_count; i++)
                    {
NT_PB_HWVideoEncoderInfohw_video_encoder_info= (NT_PB_HWVideoEncoderInfo)Marshal.PtrToStructure(ptr_hw_video_encoder_infos+i*Marshal.SizeOf(typeof(NT_PB_HWVideoEncoderInfo)), typeof(NT_PB_HWVideoEncoderInfo));
hw_video_encoder_infos_.Add(hw_video_encoder_info);
                    }
                }
Marshal.FreeHGlobal(ptr_hw_video_encoder_infos);
            }
        }
privateboolIsSupportHWVideoEncoder(UInt32codec_id)
        {
foreach (variinhw_video_encoder_infos_)
            {
if (codec_id==i.codec_id_)
returntrue;
            }
returnfalse;
        }
privatevoidEnableHWVideoEncoderControls(boolis_enable)
        {
btn_check_video_hardware_encoder_.Enabled=is_enable;
combobox_video_encoders_.Enabled=is_enable;
combobox_video_hardware_encoder_devices_.Enabled=is_enable;
        }

image.gif

接口设计:

/** 获取视频硬编码器信息数* count: 返回的数量* 成功返回 NT_ERC_OK*/        [DllImport(@"SmartPublisherSDK.dll")]
publicstaticexternUInt32NT_PB_GetHWVideoEncoderInfoCount(refInt32count);
/** 获取视频硬编码信息* infos: 请先调用GetHWVideoEncoderInfoCount, 然后分配这个数组* info_array_size: 分配的数组大小* out_count: 实际返回的数量* 成功返回 NT_ERC_OK*/        [DllImport(@"SmartPublisherSDK.dll")]
publicstaticexternUInt32NT_PB_GetHWVideoEncoderInfos(IntPtrinfos, Int32info_array_size, refInt32out_count);
/** 设置软硬编码类型, 编码器, codec_id, 编码器其他参数.* type: 0为软编码, 1为硬编码, 默认是软编码.* encoder_id: 如果是软编码, 并且用h264, 可以设置0, 0用默认编码器, 也可以设置1, 设置1将使用OpenH264编码. 如果不是h264, 请设置成0; 如果是硬编码, 128为NVIDIA video encoder (NVENC), 填其他值接口返回错误.* param1: 如果是软编码,请设置0; 如果是硬编码且是NVENC, 这个参数用来设置GPU index, 设置-1的话SDK自动选择GPU.* codec_id: 设置h264或h265编码, 默认是h264, 请参考NT_MEDIA_CODEC_ID,  h264填 NT_MEDIA_CODEC_ID_H264, h265填 NT_MEDIA_CODEC_ID_H265.* 注意: 软编码不支持h265, 硬编码根据实际硬件情况决定是否支持h265.* 如果调用了这个接口,请不要再调用SetVideoEncoderType接口* 成功返回 NT_ERC_OK*/        [DllImport(@"SmartPublisherSDK.dll")]
publicstaticexternUInt32NT_PB_SetVideoEncoder(IntPtrhandle, Int32type, Int32encoder_id, UInt32codec_id, Int32param1);

image.gif

如果需要看自己配置的硬件设备是不是支持硬编码,可以到NVIDIA官方网站查看,当然也可以用我们的接口做检测,网站链接如下:

Video Encode and Decode GPU Support Matrix | NVIDIA Developer

相关文章
|
7月前
|
开发工具 C# C++
Windows平台RTMP|RTSP播放器实现画面全屏功能
我们在Windows平台实现RTSP或者RTMP播放的时候,有个功能是绕不开的,那就是播放窗口全屏。本文就以大牛直播SDK(官方)的Windows播放器为例,大概讲下大概实现:
157 0
|
7月前
|
开发工具 Windows
Windows平台RTMP推送|轻量级RTSP服务实现本地摄像头|屏幕|叠加数据预览
大家在做Windows平台RTMP推送或轻量级RTSP服务的时候,不管是采集屏幕还是采集摄像头,亦或屏幕摄像头的叠加模式,总会有这样的诉求,采集到的数据,希望能本地看看具体采集的数据或者图像实际效果,也就是本次介绍的“预览”功能。
192 0
|
7月前
|
监控 开发工具 C++
Windows平台RTMP/RTSP播放器如何实现实时音量调节
RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们通用的做法是支持播放端实时静音,更细粒度的做法是可以实时调节每一路RTMP/RTSP流的音量。
177 0
|
7月前
|
数据采集 开发工具 图形学
Windows平台实现Unity下窗体|摄像头|屏幕采集推送
随着Unity3D的应用范围越来越广,越来越多的行业开始基于Unity3D开发产品,如传统行业中虚拟仿真教育、航空工业、室内设计、城市规划、工业仿真等领域。
|
7月前
|
编解码 应用服务中间件 开发工具
Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制
先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模式。
|
3月前
|
C# 数据安全/隐私保护 开发者
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
|
3月前
|
C++ Windows
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
|
4月前
|
Linux Shell 开发工具
Git 安装和配置教程:Windows - Mac - Linux 三平台详细图文教程,带你一次性搞 Git 环境
Git是一款免费、开源的分布式版本控制系统,广泛应用于软件开发领域。随着开源和云计算的发展,Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法,带你一次性搞定Git环境
1595 0
|
6月前
|
存储 JavaScript Unix
[笔记]c++Windows平台代码规范(下)
[笔记]c++Windows平台代码规范(下)
111 0
|
6月前
|
安全 Linux C++
[笔记]c++Windows平台代码规范(上)
[笔记]c++Windows平台代码规范
117 0