当前位置: 首页 > article >正文

谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计

技术背景

我们在做RTMP|RTSP播放器的时候,有这样的技术诉求,有的摄像头出来的数据是有角度偏差的,比如“装倒了”,或者,图像存在上下或者左右反转,这时候,就需要播放器能做响应的处理,显示出符合预期的角度的画面。

咱们都知道,在数字视频中,画面是由一系列像素点组成的,每个像素点都有其在二维平面上的坐标。上下翻转是将像素点的纵坐标(y 轴坐标)进行反转,左右翻转是将横坐标(x 轴坐标)进行反转,旋转则是将每个像素点按照一定的角度进行坐标变换,从而实现视频画面的旋转效果。

技术实现

以大牛直播SDK的Windows平台RTMP|RTSP播放器为例,我们的接口设计,是这样的:

/*
 * smart_player_sdk.h
 * Created by daniusdk.com (C) All rights reserved.
 */
....
/*
 * 上下反转(垂直反转)
 * 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);
....

需要注意的是,这些接口,都要做成支持动态调用的,也就是说,播放前后,都可以正常调用,demo调用示例代码如下。

void CSmartPlayerDlg::OnBnClickedCheckFlipHorizontal()
{
	if (player_handle_ != NULL)
	{
		player_api_.SetFlipHorizontal(player_handle_, BST_CHECKED == btn_check_flip_horizontal_.GetCheck() ? 1 : 0);
	}
}

void CSmartPlayerDlg::OnBnClickedCheckFlipVertical()
{
	if (player_handle_ != NULL)
	{
		player_api_.SetFlipVertical(player_handle_, BST_CHECKED == btn_check_flip_vertical_.GetCheck() ? 1 : 0);
	}
}

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_);
	}
}

总结

除了上面提到的RTMP|RTSP播放器view反转和旋转外,一个健全的播放器,除了低延迟和性能指标外,基础功能,可参考的实现如下:

  •  [支持播放协议]RTMP、RTSP;
  •  [多实例播放]支持多实例播放;
  •  [事件回调]支持网络状态、buffer状态等回调;
  •  [视频格式]支持H.265、H.264,此外,还支持RTSP MJPEG播放;
  • [视频格式]支持RTMP扩展H.265和Enhanced RTMP H.265,H.264;
  •  [音频格式]支持AAC/PCMA/PCMU/SPEX(RTMP);
  •  [H.264/H.265软解码]支持H.264/H.265软解;
  •  [H.264硬解码]Windows/Android/iOS支持特定机型H.264硬解;
  •  [H.265硬解]Windows/Android/iOS支持特定机型H.265硬解;
  •  [H.264/H.265硬解码]Android支持设置Surface模式硬解和普通模式硬解码;
  •  [RTSP模式设置]支持RTSP TCP/UDP模式设置;
  •  [RTSP TCP/UDP自动切换]支持RTSP TCP、UDP模式自动切换;
  •  [RTSP超时设置]支持RTSP超时时间设置,单位:秒;
  •  [RTSP 401认证处理]支持上报RTSP 401事件,如URL携带鉴权信息,会自动处理;
  •  [缓冲时间设置]支持buffer time设置;
  •  [首屏秒开]支持首屏秒开模式;
  •  [复杂网络处理]支持断网重连等各种网络环境自动适配;
  •  [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;
  •  [音视频多种render机制]Android平台,视频:surfaceview/OpenGL ES,音频:AudioTrack/OpenSL ES;
  •  [实时静音]支持播放过程中,实时静音/取消静音;
  •  [实时音量调节]支持播放过程中实时调节音量;
  •  [实时快照]支持播放过程中截取当前播放画面;
  •  [只播关键帧]Windows平台支持实时设置是否只播放关键帧;
  •  [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;
  •  [渲染镜像]支持水平反转、垂直反转模式设置;
  •  [等比例缩放]支持图像等比例缩放绘制(Android设置surface模式硬解模式不支持);
  •  [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);
  •  [解码前视频数据回调]支持H.264/H.265数据回调;
  •  [解码后视频数据回调]支持解码后YUV/RGB数据回调;
  •  [解码前音频数据回调]支持AAC/PCMA/PCMU数据回调;
  •  [音视频自适应]支持播放过程中,音视频信息改变后自适应;
  •  [扩展录像功能]支持实时录像功能。


http://www.kler.cn/a/515159.html

相关文章:

  • JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南
  • 2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程
  • react install
  • Flutter调用HarmonyOS NEXT原生相机拍摄相册选择照片视频
  • Flink 使用 Kafka 作为数据源时遇到了偏移量提交失败的问题
  • 【3GPP】【5G】注销流程(Deregistration procedures)
  • 图论 八字码
  • 【Uniapp-Vue3】request各种不同类型的参数详解
  • 0基础跟德姆(dom)一起学AI 自然语言处理20-模型构建
  • 数据结构——算法基础
  • 13 网络编程
  • DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究
  • kotlin的协程的基础概念
  • Shellcode
  • 计算机毕业设计hadoop+spark视频推荐系统 短视频推荐系统 视频流量预测系统 短视频爬虫 视频数据分析 视频可视化 视频大数据 大数据
  • 人脸识别打卡系统--基于QT(附源码)
  • Django学习笔记(bootstrap的运用)-04
  • 【优选算法】5----有效三角形个数
  • python创建一个httpServer网页上传文件到httpServer
  • LightGBM算法
  • node安装与管理
  • Centos类型服务器等保测评整/etc/pam.d/system-auth
  • Typescript 多个泛型参数详细解读
  • HP 笔记本重新安装 Windows 11 无法启动
  • webrtc入门系列(五)amazon-kinesis-video-streams-webrtc-sdk-c编译
  • 【P2P】基于 Nebula 的 P2P 通信技术的虚拟局域网游戏设计方案