播放视频中称比例的计算
使用sdl来播放
使用sdl来播放,封装
class SDLPlayer
{private:SDL_Renderer * _pRender = NULL;SDL_Texture* _pTexture = NULL;int _pixelW = 0;int _pixelH = 0;int _iPitch = 0;SDL_Rect _sdlRect;SDL_Window * _pWindow = NULL;int _DrawMode = SDL_PIXELFORMAT_IYUV;void Calculate(int cx, int cy, int &retx, int &rety);
public:static void Init(){if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTS) == -1){fprintf(stderr, "SDL_Init() %s\n", SDL_GetError());exit(-1);}}static void UnInit(){SDL_Quit();}SDLPlayer();~SDLPlayer();//准备内存画布int Prepare(HWND hWnd, int pixelW, int pixelH, uint32_t mode = SDL_PIXELFORMAT_IYUV);void Draw(uint8_t *buffer,int len);void unPrepare();
};
画面的比例问题
如果画面和实际窗口不成比例,有时候拉伸会很难看,所以可以使用计算来画出画面,下面给出计算方法:
//cx,cy原始大小,retx,rety调整后的大小
void SDLPlayer::Calculate(int cx, int cy, int &retx, int &rety)
{double rate = (float)_pixelW / _pixelH;if (cx >= _pixelW) //宽度大于实际像素{if (cy > _pixelH) //同时高度大于实际像素{//取宽度,截取高度retx = cx;rety = cx / rate;}else //但是高度小于实际像素{//取全部高度,截取宽度rety = cy;retx = cy * rate;}}else //宽度小于实际像素{if (cy > _pixelH) //同时高度大于实际像素{//取宽度,截取高度retx = cx;rety = cx / rate;}else //高度也小于实际像素{//取rety = cy;retx = cy * rate;}}float f1 = (float)cx / (float)cy;float f2 = (float)_pixelW / (float)_pixelH;if (f1 > f2) //实际画布比例 较为宽{rety = cy;retx = cy * rate; }else //实际画布比例 较为z{retx = cx;if (cx / rate > cy){rety = cy;retx = cy * rate;}else{rety = cx / rate;}}
}
这样展示画面时画面比较正常,不会拉伸,下面是cpp文件,仅仅供参考。
#include "SDLPlayer.h"SDLPlayer::SDLPlayer()
{//_hWnd = NULL;
}SDLPlayer::~SDLPlayer()
{}int SDLPlayer::Prepare(HWND hWnd, int pixelW, int pixelH, uint32_t mode)
{if (hWnd == NULL)return -1;_pWindow = SDL_CreateWindowFrom(hWnd);if (!_pWindow) return -1;int windowx;int windowy;SDL_GetWindowSize(_pWindow, &windowx, &windowy);_sdlRect.x = 0;_sdlRect.y = 0;_sdlRect.w = windowx;_sdlRect.h = windowy;_pRender = SDL_CreateRenderer(_pWindow, 0, SDL_RENDERER_ACCELERATED);_pixelW = pixelW;_pixelH = pixelH;_DrawMode = mode;// _DrawMode = SDL_PIXELFORMAT_BGR24;//else// _DrawMode = SDL_PIXELFORMAT_IYUV;_pTexture = SDL_CreateTexture(_pRender,_DrawMode,SDL_TEXTUREACCESS_STREAMING,pixelW,pixelH);if (_pTexture == NULL)return -1;_iPitch = pixelW *SDL_BYTESPERPIXEL(_DrawMode);return 0;
}//cx,cy原始大小,retx,rety调整后的大小
void SDLPlayer::Calculate(int cx, int cy, int &retx, int &rety)
{double rate = (float)_pixelW / _pixelH;if (cx >= _pixelW) //宽度大于实际像素{if (cy > _pixelH) //同时高度大于实际像素{//取宽度,截取高度retx = cx;rety = cx / rate;}else //但是高度小于实际像素{//取全部高度,截取宽度rety = cy;retx = cy * rate;}}else //宽度小于实际像素{if (cy > _pixelH) //同时高度大于实际像素{//取宽度,截取高度retx = cx;rety = cx / rate;}else //高度也小于实际像素{//取rety = cy;retx = cy * rate;}}float f1 = (float)cx / (float)cy;float f2 = (float)_pixelW / (float)_pixelH;if (f1 > f2) //实际画布比例 较为宽{rety = cy;retx = cy * rate; }else //实际画布比例 较为z{retx = cx;if (cx / rate > cy){rety = cy;retx = cy * rate;}else{rety = cx / rate;}}
}void SDLPlayer::Draw(uint8_t *buffer,int len)
{#if 0SDL_Event event;SDL_bool done = SDL_FALSE;while (SDL_PollEvent(&event)) {switch (event.type) {case SDL_WINDOWEVENT:if (event.window.event == SDL_WINDOWEVENT_RESIZED) {//_sdlRect.w = event.window.data1;//_sdlRect.h = event.window.data2;//SDL_RenderSetViewport(_pRender, &_sdlRect);SDL_GetWindowSize(_pWindow, &_w, &_h);_sdlRect.x = 1;_sdlRect.y = 1;_sdlRect.w = _w-2;_sdlRect.h = _h -2;}break;case SDL_KEYDOWN:if (event.key.keysym.sym == SDLK_ESCAPE) {done = SDL_TRUE;}break;case SDL_QUIT:done = SDL_TRUE;break;}//SDL_Delay(1);}
#endif
#if 1int w, h;SDL_GetWindowSize(_pWindow, &w, &h);if (w!= _sdlRect.w || h!= _sdlRect.h){Calculate(w, h, _sdlRect.w, _sdlRect.h);_sdlRect.x =abs(w- _sdlRect.w)/ 2;_sdlRect.y =abs(h- _sdlRect.h)/ 2;/*_sdlRect.w = w-2;_sdlRect.h = h-2;_sdlRect.x = 1;_sdlRect.y = 1;*/}
#endifSDL_UpdateTexture(_pTexture, NULL, buffer, _iPitch);SDL_RenderClear(_pRender);if (_DrawMode == SDL_PIXELFORMAT_IYUV)SDL_RenderCopy(_pRender, _pTexture, NULL, &_sdlRect);else if(_DrawMode == SDL_PIXELFORMAT_BGR24)SDL_RenderCopyEx(_pRender, _pTexture, NULL, &_sdlRect, 0, 0, SDL_FLIP_VERTICAL);SDL_RenderPresent(_pRender);
}void SDLPlayer::unPrepare()
{if (_pWindow){SDL_DestroyWindow(_pWindow);//SDL_ShowWindow(_pWindow);//if (_hWnd!=NULL)// ShowWindow(_hWnd, 1);_pWindow = NULL;}if (_pRender)SDL_DestroyRenderer(_pRender);if (_pTexture)SDL_DestroyTexture(_pTexture);
}
播放视频中称比例的计算相关推荐
- HTML5视频直播默认静音,HTML5教程 如何实现播放视频中暂停、关闭声音等操作
本篇教程探讨了HTML5教程 如何实现播放视频中暂停.关闭声音等操作,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < html> HTML5-video ...
- Android黑屏死机--充电运行土豆视频【.4.4】》播放视频中黑屏死机》手动按电源键开机显示电量为6%
[测试版本] T0405 [测试模块] [测试步骤] 充电运行土豆视频[.4.4]> [测试结果]播放视频中黑屏死机>手动按电源键开机显示电量为6%[开机后恢复] [预期结果]可正常播放 ...
- OpenCV重复播放摄像头视频,循环播放摄像头(视频)文件,循环播放视频中某一段视频
OpenCV中使用摄像头录像并保存并不难实现,本文针对摄像头实时帧画面进行记录,并重复播放 视频文件的读取和处理方法类似,首先,本文对摄像头进行采集和实时帧画面显示. #include <ope ...
- c#winform调用VLC播放视频器控件
由于项目需求,斯最近遇到一个很麻烦的问题,涉及到视频播放的功能,先前也有使用系统自带的media player来实现播放视频的目的,自带的虽然比较通用,但是问题很大,为什么呢?经常会出现以下↓的框框 ...
- AntDesign of Vue中实现弹窗播放视频
问题:关闭对话框之后视频不停止(还是不够细心,没有看完对话框Modal中全部API) 可以实现关闭时销毁modal中的元素 弹窗播放视频代码如下: <div class="tro-Bo ...
- linux gst-launch 播放视频旋转,【视频开发】Gstreamer中一些gst-launch常用命令
GStreamer是著名的开源多媒体框架,功能强大,其命令行程序 gst-launch 可以实现很多常规测试.播放等,作为系统调试等是非常方便的. 1.摄像头测试 gst-launch v4l2src ...
- 在虚幻引擎4中播放视频文件超详细教程
1.新建工程,我这里用的是4.20版本,在Content下新建文件夹Movies(必须是这个名字) 2.右键文件夹,选择show in Explorer,找到本地路径,将视频文件复制到此路径下 3.在 ...
- 手机视频连接计算机显示器播放,教您使用手机/平板电脑直接在计算机上播放视频...
我相信,在阅读了前面的教程之后,您已经在计算机上下载了许多电影和电视节目. 因此,是时候在国庆假期呆在家里了. 好吧,开个玩笑. 但是,本教程是为了使主要参与者更容易. 不必将视频复制到"手 ...
- ViewPager中显示图片和播放视频填坑之旅
一.需求来源与实现思路 1.最近项目需求中有用到需要在ViewPager中播放视频和显示图片的功能,视频是本地视频,最开始的实现思路是ViewPager中根据当前item位置对应的是图片还是视频去初始 ...
最新文章
- ECCV 2020 | PHOSA:一种基于单目图像的人-物重建方法
- 安卓模拟器BlueStacks 安装使用教程(图解)
- 用户层CS段描述符信息
- SVN本地代码未提交而被覆盖
- 如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...
- bzoj5147bzoj2121loj6701 字符串游戏
- 为别人软件加入广告或者密码(特别思路)
- mysql c webservice_如何编写webservice c
- 轨迹压缩文献阅读 TrajStore: An Adaptive Storage System for Very Large Trajectory Data Sets
- 学习笔记之linux网络属性配置及其命令用法
- go语言打印日期_基于 Go 语言开发在线论坛(八):消息、视图及日期时间本地化...
- qcustomplot 游标吸附_QCustomplot使用分享(九) 绘制图表-多功能游标
- RS编码过程通俗理解
- 计算机论文格式要求吗,计算机论文格式(写作要求详细介绍)
- 本特利振动探头177230-01-01-CN
- 计算机会计凭证审核,记账凭证的审核
- android 轮播图 github,Android轮播图控件的实现详解(附GitHub开源链接)
- AB PLC 1769模拟量模块量程转换
- SpringMvc中的校验框架@valid和@validation的概念及相关使用 和BindingResult bindingResult...
- Facebook 如何识别出性工作者?