谈谈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数据回调;
- [音视频自适应]支持播放过程中,音视频信息改变后自适应;
- [扩展录像功能]支持实时录像功能。