返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++sdl实现渲染旋转视频的方法分享
  • 144
分享到

C++sdl实现渲染旋转视频的方法分享

sdl渲染旋转视频sdl渲染视频sdl旋转视频sdl视频 2022-12-16 12:12:50 144人浏览 泡泡鱼
摘要

目录前言一、如何实现1、计算边框大小2、计算缩放大小3、逆运算视频宽高二、完整代码三、使用示例总结前言 一般情况下播放视频时不需要旋转,但是如果是移动端录制的视频有时会出现rotat

前言

一般情况下播放视频时不需要旋转,但是如果是移动端录制的视频有时会出现rotate参数,且视频宽高也是互换的,如果直接渲染则会出现视频90度倒转的问题。所以渲染视频时需要获取包的metadata中的rotate参数,计算出旋转角度,按照旋转角度渲染视频才能显示正常的画面。

一、如何实现

sdl支持旋转渲染使用SDL_RenderCopyEx设置旋转角度即可旋转画面,但是直接设置之后显示的画面位置是异常的,尤其时旋转非直角角度后画面大小会大一些,所以需要对旋转后的画面的位置以及大小进行一些处理。

1、计算边框大小

计算旋转后的边框大小。知道视频画面宽高和旋转角度,根据三角函数即可计算出边框大小,这里就没必要具体说明了。

边框宽=视频高∗sinθ+视频宽∗cosθ

边框高=视频高∗cosθ+视频宽∗sinθ

示例代码:

//srcRect为视频区域,angle为旋转角度
const double PI = 3.1415926535897935384626;
//角度转弧度,用于三角函数计算。
double theta = PI / 180.0 * angle;
//计算旋转后的边框大小,+0.5四舍五入
int width = srcRect->h * fabs(sin(theta) )+ srcRect->w * fabs(cos(theta)) + 0.5;
int height = srcRect->h * fabs(cos(theta)) + srcRect->w * fabs(sin(theta)) + 0.5;

2、计算缩放大小

边框宽=边框宽∗缩放比

边框高=边框高∗缩放比

代码示例:

//边框的宽高比
double srcBorderRatio = (double)width / height;
//目标区域的宽高比
double dstRatio = (double)dstRect->w / dstRect->h;
//计算边框缩放到目标区域的大小
int zoomWidth;
int zoomHeight;
if (srcBorderRatio > dstRatio)
{
	zoomWidth = dstRect->w;
	zoomHeight = dstRect->w / srcBorderRatio;
}
else
{
	zoomWidth = dstRect->h * srcBorderRatio;
	zoomHeight = dstRect->h;
}

3、逆运算视频宽高

视频高=边框宽/(sinθ+视频宽高比∗cosθ)

视频宽=视频高∗视频宽高比

代码示例:

//视频的宽高比
double srcRatio = (double)srcRect->w / srcRect->h;
//通过缩放后的边框计算还原的图像大小
targetRect.h = (double)zoomWidth / (fabs(sin(theta) )+ srcRatio * fabs(cos(theta)));
targetRect.w = targetRect.h * srcRatio;
targetRect.x = (dstRect->w- targetRect.w ) / 2;
targetRect.y = (dstRect->h- targetRect.h ) / 2;

二、完整代码

/// <summary>
/// 计算旋转的矩形大小
/// </summary>
/// <param name="src">原图像区域</param>
/// <param name="dst">目标区域</param>
/// <param name="angle">旋转角度</param>
/// <returns></returns>
static SDL_Rect getRotateRect(SDL_Rect *srcRect, SDL_Rect* dstRect,double angle) {
	SDL_Rect targetRect;
	const double PI = 3.1415926535897935384626;
	double theta = PI / 180.0 * angle;
	//计算旋转后的边框大小
	int width = srcRect->h * fabs(sin(theta) )+ srcRect->w * fabs(cos(theta)) + 0.5;
	int height = srcRect->h * fabs(cos(theta)) + srcRect->w * fabs(sin(theta)) + 0.5;
	double srcRatio = (double)srcRect->w / srcRect->h;
	double srcBorderRatio = (double)width / height;
	double dstRatio = (double)dstRect->w / dstRect->h;
	//计算边框缩放到目标区域的大小
	int zoomWidth;
	int zoomHeight;
	if (srcBorderRatio > dstRatio)
	{
		zoomWidth = dstRect->w;
		zoomHeight = dstRect->w / srcBorderRatio;
	}
	else
	{
		zoomWidth = dstRect->h * srcBorderRatio;
		zoomHeight = dstRect->h;
	}
	//通过缩放后的边框计算还原的图像大小
	targetRect.h = (double)zoomWidth / (fabs(sin(theta) )+ srcRatio * fabs(cos(theta)));
	targetRect.w = targetRect.h * srcRatio;
	targetRect.x = (dstRect->w- targetRect.w ) / 2;
	targetRect.y = (dstRect->h- targetRect.h ) / 2;
	return targetRect;
}

三、使用示例

只展示渲染部分,初始化及获取视频略。

	//窗口区域
	sdlRect.x = 0;
	sdlRect.y = 0;
	sdlRect.w = video->screen_w;
	sdlRect.h = video->screen_h;
	//视频区域
	sdlRect2.x = 0;
	sdlRect2.y = 0;
	sdlRect2.w = video->decoder.codecContext->width;
	sdlRect2.h = video->decoder.codecContext->height;
	//渲染到sdl窗口
	SDL_RenderClear(video->sdlRenderer);
	SDL_UpdateYUVTexture(video->sdlTexture, &sdlRect2, dst_data[0], dst_linesize[0], dst_data[1], dst_linesize[1], dst_data[2], dst_linesize[2]);
	if (video->angle == 0)
		SDL_RenderCopy(video->sdlRenderer, video->sdlTexture, NULL, &sdlRect);
	else
	//当旋转角度不为0时使用SDL_RenderCopyEx渲染
	{
		SDL_Rect sdlRect3;
		//计算旋转后的目标区域
		sdlRect3= getRotateRect(&sdlRect2,&sdlRect,video->angle);
		SDL_RenderCopyEx(video->sdlRenderer, video->sdlTexture, NULL
			, &sdlRect3, video->angle, 0, SDL_FLIP_NONE);
	}
	SDL_RenderPresent(video->sdlRenderer);

效果预览:

1、mp4 metadata-rotate为270,未处理旋转的情况:

2、旋转270度后

3、自定义旋转角度

总结

以上就是今天要讲的内容,做音视频开发过程中还是比较少遇到需要旋转视频的场景的,笔者也是测试播放器的时候,无意中发现自己手机的视频播放时画面倒转了,经过一番探究才了解到播放视频时需要处理rotate信息,于是实现了sdl渲染带旋转参数的视频,顺带也支持任意角度旋转。

到此这篇关于c++ sdl实现渲染旋转视频的方法分享的文章就介绍到这了,更多相关sdl渲染旋转视频内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++sdl实现渲染旋转视频的方法分享

本文链接: https://lsjlt.com/news/175052.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++sdl实现渲染旋转视频的方法分享
    目录前言一、如何实现1、计算边框大小2、计算缩放大小3、逆运算视频宽高二、完整代码三、使用示例总结前言 一般情况下播放视频时不需要旋转,但是如果是移动端录制的视频有时会出现rotat...
    99+
    2022-12-16
    sdl 渲染旋转视频 sdl 渲染视频 sdl 旋转视频 sdl 视频
  • C# wpf 通过HwndHost渲染视频的实现方法
    目录前言一、如何实现二、使用方式三、示例总结前言 日常开发中,特别是音视频开发,需要在界面上渲染视频,比如制作一个播放器、或者视频编辑工具、以及视频会议客户端。通常拿到的是像素格式数...
    99+
    2024-04-02
  • Python实现视频分帧的方法分享
    目录下载依赖实现方法一方法二方法三下载依赖 pip install opencv-python==4.0.0.21 实现 方法一 def video_to_frames(video...
    99+
    2023-03-24
    Python实现视频分帧 Python视频分帧
  • mini-vue渲染的实现方法
    本篇内容介绍了“mini-vue渲染的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言目标 第二步:总结前言目前的主...
    99+
    2023-06-20
  • C++实现旋转图像的方法
    这篇文章主要讲解了“C++实现旋转图像的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++实现旋转图像的方法”吧!Rotate Image 旋转图像You are given an&n...
    99+
    2023-06-20
  • Android实现旋转动画的方式代码分享
    这篇文章主要介绍“Android实现旋转动画的方式代码分享”,在日常操作中,相信很多人在Android实现旋转动画的方式代码分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android实现旋转动画的方式代...
    99+
    2023-06-20
  • 使用Golang和FFmpeg实现视频画面旋转的技巧
    要使用Golang和FFmpeg实现视频画面旋转,你需要使用Go语言的os/exec包来调用FFmpeg命令行工具。下面是一个示例代...
    99+
    2023-10-08
    Golang
  • C#使用 NAudio 实现音频可视化的方法
    预览: 捕捉声卡输出: 实现音频可视化, 第一步就是获得音频采样, 这里我们选择使用计算机正在播放的音频作为采样源进行处理: NAudio 中, 可以借助 WasapiLoopba...
    99+
    2024-04-02
  • C++ OpenGL实现旋转立方体的绘制
    目录1、Z-缓冲2、GLM库函数3、PVM矩阵4、PVM矩阵的使用5、工程文件结构shader.hshader.cppmain.cpp 1、Z-缓冲 //开启深度测试 ...
    99+
    2024-04-02
  • 利用Golang和FFmpeg实现视频格式转换的方法
    要利用Golang和FFmpeg实现视频格式转换的方法,你可以按照以下步骤进行操作:1. 安装FFmpeg:首先需要在计算机上安装F...
    99+
    2023-10-08
    Golang
  • css旋转动画效果的实现方法
    这篇文章主要讲解了“css旋转动画效果的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css旋转动画效果的实现方法”吧!我们可以通过css来做出动画...
    99+
    2024-04-02
  • VB.NET中心旋转图像的实现方法
    这篇文章主要讲解了“VB.NET中心旋转图像的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VB.NET中心旋转图像的实现方法”吧!我们在学习一门编程语言的时候,需要通过不断的实践去...
    99+
    2023-06-17
  • PHP实现图片旋转的方法详解
    最近有一个需求需要将前端上传过来的图片进行逆时针旋转90°,这个主要需要使用到php的imagerotate方法对于图片进行旋转,具体实现方法如下: <php na...
    99+
    2022-11-13
    PHP图片旋转方法 PHP图片旋转 PHP 旋转
  • C++实现寻找旋转有序数组的最小值的方法
    本篇内容介绍了“C++实现寻找旋转有序数组的最小值的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!寻找旋转有序数组的最小值Suppose...
    99+
    2023-06-20
  • Python中使用moviepy进行视频分割的实现方法
    场景 moviepy官网: https://pypi.org/project/moviepy/ 是一个用于视频编辑的Python库:切割、连接、标题插入、视频合成、非线性编辑,视频处...
    99+
    2024-04-02
  • PHP生日转时间戳的实现方法分享
    PHP生日转时间戳的实现方法分享 在日常开发中,有时候我们需要将用户的生日转换为时间戳的形式,以便进行更多的操作,比如计算年龄、比较时间等。本文将分享如何使用PHP将生日转换为时间戳的...
    99+
    2024-03-04
    php 时间戳 生日
  • 减少react组件不必要的重新渲染实现方法
    目录什么是重新渲染不必要的重新渲染react组件重新渲染情况state变化父组件的重新渲染context变化在组件内创建组件一些减少重新渲染的方法useState初始值使用函数形式重...
    99+
    2023-01-09
    减少react组件重新渲染 react 重新渲染
  • Python使用ffmpeg合成视频、音频的实现方法
    最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。接下准备写使用python如何做屏幕录制工具的系列文章: 录制屏...
    99+
    2024-04-02
  • C++中4种类型转换的方法分享
    目录1. C语言中的类型转换2. 为什么C++需要四种类型转换3. C++强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cas...
    99+
    2023-05-14
    C++实现类型转换方法 C++类型转换方法 C++类型转换
  • Shell中实现字符串反转方法分享
    在做关键词清洗过程中,需要将一类不符合某个字结尾的词过滤出来,思路是把这一批词按最后一个字排序,于是想到了先把这些词反转一下,如把12345转为54321,好像以前在夜息的文章里看过用shell可以实现,就...
    99+
    2022-06-04
    字符串 方法 Shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作