RTSP、RTMP播放器拉到的视频图像角度不对怎么办?

我们在做RTSP、RTMP播放器的时候,遇到这样的诉求:特别是RTSP,有些摄像头安装可能倒置或者旋转了90°亦或270°,拉取到图像,势必需要对视频图像做一定的处理,确保显示正常。

为此,我们提供了以下接口:视频数据水平反转、垂直反转、设置旋转角度。

好多开发者搞不清楚特别是水平反转和垂直反转,以下我们以图例的形式,做个效果展示。

先看原始图像:

 

水平反转后:

垂直反转后:

 

按照设定角度旋转(90°、180°、270°):

 

以C++的接口为例,设计如下:

/**上下反转(垂直反转)*is_flip: 1:表示反转, 0:表示不反转*/NT_UINT32(NT_API *SetFlipVertical)(NT_HANDLE handle, NT_INT32 is_flip);/**水平反转*is_flip: 1:表示反转, 0:表示不反转*/NT_UINT32(NT_API *SetFlipHorizontal)(NT_HANDLE handle, NT_INT32 is_flip);/*设置旋转,顺时针旋转degress: 设置0, 90, 180, 270度有效,其他值无效注意:除了0度,其他角度播放会耗费更多CPU接口调用成功返回NT_ERC_OK*/NT_UINT32(NT_API* SetRotation)(NT_HANDLE handle, NT_INT32 degress);

以上接口设计,考虑到图像出来后,才可以知道要怎么调整,设计成了可实时调用的接口模式。

具体调用逻辑非常简单:

player_api_.SetFlipVertical(player_handle_, BST_CHECKED == btn_check_flip_vertical_.GetCheck() ? 1 :0 );player_api_.SetFlipHorizontal(player_handle_, BST_CHECKED == btn_check_flip_horizontal_.GetCheck() ? 1 : 0);player_api_.SetRotation(player_handle_, rotate_degrees_);

旋转角度按钮逻辑:

void CSmartPlayerDlg::OnBnClickedButtonRotation()
{rotate_degrees_ += 90;rotate_degrees_ = rotate_degrees_ % 360;if (0 == rotate_degrees_){btn_rotation_.SetWindowText(_T("旋转90度"));}else if (90 == rotate_degrees_){btn_rotation_.SetWindowText(_T("旋转180度"));}else if (180 == rotate_degrees_){btn_rotation_.SetWindowText(_T("旋转270度"));}else if (270 == rotate_degrees_){btn_rotation_.SetWindowText(_T("不旋转"));}if ( player_handle_ != NULL ){player_api_.SetRotation(player_handle_, rotate_degrees_);}
}

总的来说,实现难度不大,此外,我们针对视频数据,还设计了只解关键帧、按照视频宽高scale显示图像,最大限度的方便用户使用。

/**设置只解码视频关键帧*is_only_dec_key_frame: 1:表示只解码关键帧, 0:表示都解码, 默认是0*成功返回NT_ERC_OK*/NT_UINT32(NT_API *SetOnlyDecodeVideoKeyFrame)(NT_HANDLE handle, NT_INT32 is_only_dec_key_frame);
/*设置视频画面的填充模式,如填充整个绘制窗口、等比例填充绘制窗口,如不设置,默认填充整个绘制窗口handle: 播放句柄mode: 0: 填充整个绘制窗口; 1: 等比例填充绘制窗口, 默认值是0成功返回NT_ERC_OK*/NT_UINT32 (NT_API *SetRenderScaleMode)(NT_HANDLE handle, NT_INT32 mode);

如果以上数据都还不满足开发者或终端用户的需求,我们还可以把数据(YUV/RGB)回调上来,用户自行处理。

player_api_.SetVideoFrameCallBack(player_handle_, NT_SP_E_VIDEO_FRAME_FORMAT_RGB32,GetSafeHwnd(), SM_SDKVideoFrameHandle);
extern "C" NT_VOID NT_CALLBACK SM_SDKVideoFrameHandle(NT_HANDLE handle, NT_PVOID userData, NT_UINT32 status,const NT_SP_VideoFrame* frame)
{/*if (frame != NULL){std::ostringstream ss;ss << "Receive frame time_stamp:" << frame->timestamp_ << "ms" << "\r\n";OutputDebugStringA(ss.str().c_str());}*/if ( frame != NULL ){if ( NT_SP_E_VIDEO_FRAME_FORMAT_RGB32 == frame->format_&& frame->plane0_ != NULL&& frame->stride0_ > 0&& frame->height_ > 0 ){std::unique_ptr<nt_rgb32_image > pImage(new nt_rgb32_image());pImage->size_ = frame->stride0_* frame->height_;pImage->data_ = new NT_BYTE[pImage->size_];memcpy(pImage->data_, frame->plane0_, pImage->size_);pImage->width_  = frame->width_;pImage->height_ = frame->height_;pImage->stride_ = frame->stride0_;HWND hwnd = (HWND)userData;if ( hwnd != NULL && ::IsWindow(hwnd) ){::PostMessage(hwnd, WM_USER_SDK_RGB32_IMAGE, (WPARAM)handle, (LPARAM)pImage.release());}}}
}

有了这些数据接口的加持,播放端对数据处理非常方便。

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

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

相关文章

Android平台GB28181设备接入端如何调节实时音量?

我们在对接Android平台GB28181设备接入端的时候&#xff0c;有开发者提出这样的疑惑&#xff0c;如何调整设备接入端的实时音量&#xff1f; 实际上&#xff0c;这块我们前几年在做RTMP直播推送模块的时候&#xff0c;已经发布了相关的接口&#xff0c;这里再回顾下&#xff1…

Win10系统如何查看声卡ID

在Win10系统的日常使用过程中&#xff0c;我们可能经常需要去查看电脑的声卡ID&#xff0c;但很多小伙伴都不知道要如何查看声卡ID&#xff0c;那么碰到这种情况时&#xff0c;Win10系统如何查看声卡ID呢?下面就和小编一起来看看Win10系统查看声卡ID的方法吧。 Win10系统如何查…

Win10系统如何退出桌面磁贴功能

桌面磁贴是Modern开始界面下的那些方格&#xff0c;但是很多小伙都用不太习惯却不知道如何去关闭这个功能&#xff0c;那么Win10系统如何退出桌面磁贴功能呢?就此问题&#xff0c;下面小编整理了Win10系统退出桌面磁贴功能的解决方法&#xff0c;一来看看解决办法吧。 Win10系…

【技术分享】如何实现功能完备性能优异的RTMP、RTSP播放器?

技术背景 这几年&#xff0c;我们对接了太多有RTSP或RTMP直播播放器诉求的开发者&#xff0c;他们当中除了寻求完整的解决方案的&#xff0c;还有些是技术探讨&#xff0c;希望能借鉴我们播放端的开发思路或功能特性&#xff0c;完善自己的产品。 忙里偷闲&#xff0c;今天我…

我正在参加2022年度博客之星评选,大家帮我点个五星好评

大家好&#xff0c;我是音视频牛哥&#xff0c;致力于跨平台的实时RTMP推流、转发、RTMP/RTSP直播播放、GB28181设备接入。 有幸参加2022年度博客之星评选&#xff0c;欢迎大家帮点五星好评。如果我的博客能给开发者带来哪怕一丝启发&#xff0c;对博主来说&#xff0c;也甚感…

Win10系统切换输入法快捷键设置方法

无论是家用电脑还是办公电脑&#xff0c;一般都没有单一的输入法。有些人每次使用时都必须使用鼠标单击&#xff0c;其实真的很麻烦。Windows10系统切换输入法与以往的都不同&#xff0c;Win10系统如何修改切换输入法按键?就此问题&#xff0c;小编今天就把Win10切换输入法快捷…

rtmp/rtsp/hls公网真正可用的测试地址

相信大家在调试播放器的时候&#xff0c;都有这样的困惑&#xff0c;很难找到合适的公有测试源&#xff0c;以下是大牛直播SDK&#xff08;GitHub地址&#xff09;整理的真正可用的直播地址源。 其中&#xff0c;rtmp和rtsp的url&#xff0c;用我们播放器验证通过。 1. rtmp:…

Firefox火狐浏览器怎么设置中文 火狐浏览器语言设置方法

如果下载的是官方版的火狐浏览器&#xff0c;默认的预言可能会是英文版的&#xff0c;如何将火狐浏览器设置中文的呢? 1、打开浏览器&#xff0c;在地址栏中输入about:config&#xff0c;然后按下回车。 2、在列表中找到“general.useragent.locale”&#xff0c;双击&#…

公网可用的RTMP、RTSP测试地址(更新于2021年3月)

好多博客提到的公网可测试的RTSP和RTMP URL大多都不用了&#xff0c;以下是大牛直播SDK(Github)于2021年3月亲测可用的几个URL&#xff0c;有其他可用的URL&#xff0c;也欢迎大家在评论区回复。 RTMP流地址 湖南卫视&#xff1a;rtmp://58.200.131.2:1935/livetv/hunantv (7…

Unity环境下RTMP推流+RTMP播放低延迟解决方案

在本文之前&#xff0c;我们发布了Unity环境下的RTMP推流&#xff08;Windows平台Android平台&#xff09;和RTMP|RTSP拉流&#xff08;Windows平台Android平台iOS平台&#xff09;低延迟的解决方案&#xff0c;今天做个整体汇总&#xff0c;权当抛砖引玉。 1. Unity环境下RTM…

mac怎么设置默认浏览器 mac默认浏览器设置方法

现在很多人都开始使用mac电脑&#xff0c;而有些人不大喜欢Safari浏览器&#xff0c;或许也有别的原因导致用户想要将Mac OS X系统下的默认浏览器换成其他更符合自己口味的浏览&#xff0c;如果你你不会换&#xff0c;那就由小编为你解答mac怎么设置默认浏览器。 mac默认浏览器…

麒麟操作系统|Linux下低延时RTMP|RTSP直播播放实现

背景 国产操作系统多为以Linux为基础二次开发的操作系统。2014年4月8日起&#xff0c;美国微软公司停止了对Windows XP SP3操作系统提供服务支持&#xff0c;这引起了社会和广大用户的广泛关注和对信息安全的担忧。而2020年对Windows7服务支持的终止再一次推动了国产系统的发展…

基于RTMP实现Linux|麒麟操作系统下屏幕|系统声音采集推送

背景 Windows操作系统自问世以来&#xff0c;以其简单易用的图形化界面操作受到大众追捧&#xff0c;为计算机的普及、科技的发展做出了不可磨灭的功绩&#xff0c;也慢慢的成为人们最依赖的操作系统。在中国&#xff0c;90&#xff05;以上的办公环境都是Windows&#xff0c;…

Windows11关机键在哪 Win11系统关机键的位置

很多用户更新了Win11系统之后就发现Win11系统有很多功能的位置都不一样了&#xff0c;导致用户们找不到自己想要的功能。就像是关机功能&#xff0c;很多用户更新了系统之后发现自己找不到关机键了&#xff0c;下面让小编教教大家吧&#xff0c;希望能帮助您。 Windows11关机键…

如何快速实现Android平台前端设备接入能力

技术背景 SIP(会话初始化协议)是在 IP网络上进行多媒体通信的应用层控制协议&#xff0c;以几种RFC的形式提供&#xff0c;其中最重要的是包含核心协议规范的RFC3261。该协议用于创建&#xff0c;修改和终止与一个或多个参与者的会话。通过会话&#xff0c;我们了解了一组进行…

如何解决Win11系统显示你的账户已被停用

现在Win11系统是现在非常火热的电脑操作系统&#xff0c;很多用户都想去升级体验&#xff0c;最近有使用Win11系统用户在咨询这样一个情况&#xff0c;就是电脑突然提示“你的账户已被停用&#xff0c;请向系统管理员咨询”&#xff0c;遇到这样的问题该如何解决呢?下面小编就…

Win11系统创建虚拟桌面的方法

现在Win11系统是非常火热的电脑操作系统&#xff0c;现在已经有越来越多的小伙伴在使用Win11系统&#xff0c;Win11系统集成了Windows10的许多便利的功能&#xff0c;例如虚拟桌面&#xff0c;但是有的朋友不知道在Windows11上怎么进行操作。接下来小编就来为大家简单的介绍一下…

Win10系统开机任务栏一直转圈怎么解决

Win10系统可说是最常用的系统之一&#xff0c;不过最近有不少使用Win10系统的小伙伴发现自己开机之后任务栏一直转圈&#xff0c;那么Win10系统开机任务栏一直转圈怎么解决呢?下面小编就带给大家带来了Win10系统开机任务栏一直转圈的解决方法。 Win10系统开机任务栏一直转圈怎…

Win10系统电脑不会一键还原系统怎么解决

在我们电脑遇到大问题之后&#xff0c;还原系统是最简单有效的办法&#xff0c;现在网络上有很多种系统还原系统的办法&#xff0c;有简单的也有复杂的&#xff0c;Win10系统电脑不会一键还原系统怎么解决呢&#xff0c;这个办法是我觉得最简单的办法之一&#xff0c;小伙伴们可…

Win10本地账户怎么更改为Microsoft账户

在使用电脑的时候&#xff0c;用户想要使用任何Microsoft服务&#xff0c;就需要创建一个Microsoft帐户。那有些用户一直使用的本地账户&#xff0c;这该怎么切换成Microsoft账户呢?其实方法很简单&#xff0c;小编这里就教教大家Win10本地账户更改为Microsoft账户的吧。 Win…