使用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);
}

播放视频中称比例的计算相关推荐

  1. HTML5视频直播默认静音,HTML5教程 如何实现播放视频中暂停、关闭声音等操作

    本篇教程探讨了HTML5教程 如何实现播放视频中暂停.关闭声音等操作,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < html> HTML5-video ...

  2. Android黑屏死机--充电运行土豆视频【.4.4】》播放视频中黑屏死机》手动按电源键开机显示电量为6%

    [测试版本] T0405 [测试模块] [测试步骤]  充电运行土豆视频[.4.4]> [测试结果]播放视频中黑屏死机>手动按电源键开机显示电量为6%[开机后恢复] [预期结果]可正常播放 ...

  3. OpenCV重复播放摄像头视频,循环播放摄像头(视频)文件,循环播放视频中某一段视频

    OpenCV中使用摄像头录像并保存并不难实现,本文针对摄像头实时帧画面进行记录,并重复播放 视频文件的读取和处理方法类似,首先,本文对摄像头进行采集和实时帧画面显示. #include <ope ...

  4. c#winform调用VLC播放视频器控件

    由于项目需求,斯最近遇到一个很麻烦的问题,涉及到视频播放的功能,先前也有使用系统自带的media player来实现播放视频的目的,自带的虽然比较通用,但是问题很大,为什么呢?经常会出现以下↓的框框 ...

  5. AntDesign of Vue中实现弹窗播放视频

    问题:关闭对话框之后视频不停止(还是不够细心,没有看完对话框Modal中全部API) 可以实现关闭时销毁modal中的元素 弹窗播放视频代码如下: <div class="tro-Bo ...

  6. linux gst-launch 播放视频旋转,【视频开发】Gstreamer中一些gst-launch常用命令

    GStreamer是著名的开源多媒体框架,功能强大,其命令行程序 gst-launch 可以实现很多常规测试.播放等,作为系统调试等是非常方便的. 1.摄像头测试 gst-launch v4l2src ...

  7. 在虚幻引擎4中播放视频文件超详细教程

    1.新建工程,我这里用的是4.20版本,在Content下新建文件夹Movies(必须是这个名字) 2.右键文件夹,选择show in Explorer,找到本地路径,将视频文件复制到此路径下 3.在 ...

  8. 手机视频连接计算机显示器播放,教您使用手机/平板电脑直接在计算机上播放视频...

    我相信,在阅读了前面的教程之后,您已经在计算机上下载了许多电影和电视节目. 因此,是时候在国庆假期呆在家里了. 好吧,开个玩笑. 但是,本教程是为了使主要参与者更容易. 不必将视频复制到"手 ...

  9. ViewPager中显示图片和播放视频填坑之旅

    一.需求来源与实现思路 1.最近项目需求中有用到需要在ViewPager中播放视频和显示图片的功能,视频是本地视频,最开始的实现思路是ViewPager中根据当前item位置对应的是图片还是视频去初始 ...

最新文章

  1. ECCV 2020 | PHOSA:一种基于单目图像的人-物重建方法
  2. 安卓模拟器BlueStacks 安装使用教程(图解)
  3. 用户层CS段描述符信息
  4. SVN本地代码未提交而被覆盖
  5. 如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...
  6. bzoj5147bzoj2121loj6701 字符串游戏
  7. 为别人软件加入广告或者密码(特别思路)
  8. mysql c webservice_如何编写webservice c
  9. 轨迹压缩文献阅读 TrajStore: An Adaptive Storage System for Very Large Trajectory Data Sets
  10. 学习笔记之linux网络属性配置及其命令用法
  11. go语言打印日期_基于 Go 语言开发在线论坛(八):消息、视图及日期时间本地化...
  12. qcustomplot 游标吸附_QCustomplot使用分享(九) 绘制图表-多功能游标
  13. RS编码过程通俗理解
  14. 计算机论文格式要求吗,计算机论文格式(写作要求详细介绍)
  15. 本特利振动探头177230-01-01-CN
  16. 计算机会计凭证审核,记账凭证的审核
  17. android 轮播图 github,Android轮播图控件的实现详解(附GitHub开源链接)
  18. AB PLC 1769模拟量模块量程转换
  19. SpringMvc中的校验框架@valid和@validation的概念及相关使用 和BindingResult bindingResult...
  20. Facebook 如何识别出性工作者?

热门文章

  1. 微软亚研院华刚对科研的见解
  2. 智能设备破解的那些事儿
  3. springboot开发(yml配置和注解解析)
  4. 混血网站诞生-公司相互嫁接成就新商业模式(转贴)
  5. 北京市通信管理局对3·15晚会曝光的北京企业作出行政处罚
  6. 新势力首家 小鹏汽车正式纳入港股通!
  7. 腾讯正式下线PC版QQ秀 网友:我的时代落幕了
  8. 永福股份遭宁德时代减持3% 后者产业链投资浮盈已达80亿
  9. iOS 14.5广告跟踪功能使广告商在安卓支出增长21%
  10. 重庆木叶村,每天被忍者迷骚扰500次