FFMPEG小白-day10(sdl项目播放视频进阶)

首先,向雷神,雷霄骅致敬!


星河战队.png
星河战队.png

我们上篇文章已经介绍了sdl的播放视频的知识了,但是不知道试验过的同学有没有发现,我们在播放视频时的状态是这样的

细心的同学应该能看到,鼠标现在是加载中的一个状态,知道我们关闭程序,鼠标才能恢复到可用的状态,那么为什么是这种情况呢?拿到程序一跑起来电脑就卡掉了?

因为是mac下放的虚拟机,暂时无法截到鼠标忙碌的状态,大家脑补一下吧~~~乖

做过编程的朋友都知道,来解析yuv数据其实是工作量比较大,多少会占有cpu的内存,所以我们会看到卡顿的现象,那么处理的方式其实大多是创建一个子线程,让子线程中去处理耗时的操作,我们今天的内容其实就是介绍一下sdl中的"线程"及"事件"。

SDL进阶---SDL中的事件和多线程

SDL多线程的一些知识

*函数
      SDL_CreateThread():创建一个线程
*数据结构
      SDL_Thread:线程的句柄

SDL事件

*函数
        SDL_WaitEvent()等待一个事件
        SDL_PushEvent()发送一个事件
*数据结构
        SDL_Event:代表一个事件

看看代码吧

ok,概念看完了,我们来看一下代码
为了方便观看,还是截图吧,需要代码的同学可以朝我要,当然你们也可以自己敲一敲,代码量也不是很大

代码1.png
代码1.png

代码2.png
代码2.png

代码3.png
代码3.png

ok,代码都做了必要的注释,这个代码跟上一篇文章的代码相比,其实就事多了一个线程,多了一个event事件,除此之外其实没有过多的变化。

看看结果吧

这是原始视频大小


原始大小.png
原始大小.png

我们拖拽一下,让他变大


拖拽变大.png
拖拽变大.png

拖拽变小
拖拽变小.png
拖拽变小.png

由此可见,我们通过事件就完成了sdl_window的拖动变大变小的操作,具体代码是这里

实现拖拽代码.png
实现拖拽代码.png

然后我们点击窗口的关闭按键,就能把窗口关闭
实现代码是


点击关闭图标的调试界面.png
点击关闭图标的调试界面.png

ok,我们来大体解释下代码:
其实代码很简单,我们创建了一个子线程,在改线程中每40ms去发送一次事件 即 SDL_PushEvent()
定义方法


方法.png
方法.png

创建线程


创建线程.png
创建线程.png

判断如果已经走完40ms就刷新界面
主线程去判断进入到哪个状态,判断是否需要重绘制界面.png
主线程去判断进入到哪个状态,判断是否需要重绘制界面.png

ok,逻辑就是这样,这个东西多看几遍其实就能看懂了,还是普通的逻辑。
今天的内容就到这了,大家如果有疑问,或者需要代码的话,可以评论,谢谢大家关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值