音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十一)

介绍

在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器

如果您不理解本文,可参考我的前一篇文章音视频项目---基于FFmpeg和SDL的音视频播放器解析(二十)

解析

我们继续解析 videooutput 的函数

RefreshLoopWaitEvent:
cpp 复制代码
#define REFRESH_RATE 0.01
void VideoOutput::RefreshLoopWaitEvent(SDL_Event* event){
    double remaining_time = 0.0;
    SDL_PumpEvents();
    while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)){
        if(remaining_time > 0.0){
            this_thread::sleep_for(chrono::milliseconds(int64_t(remaining_time * 1000.0)));
        }
        remaining_time = REFRESH_RATE;
        videoRefresh(&remaining_time);
        SDL_PumpEvents();
    }   
}

SDL_PumpEvents:用于更新事件队列并处理事件

SDL_PeepEvents:用于从事件队列中获取特定类型的事件

如果 remaining_time 大于 0,则等待一会

接着给 remaining_time 赋值 0.01

接着调用 videoRefresh,更新 SDL

MainLoop:
cpp 复制代码
int VideoOutput::MainLoop(){
    SDL_Event event;
    while (true)
    {
        RefreshLoopWaitEvent(&event);
        switch (event.type){
        case SDL_KEYDOWN:
            if(event.key.keysym.sym == SDLK_ESCAPE){
                return 0;
            }
            break;
        case SDL_QUIT:
            return 0;
        default:
            break;
        }
    }
    return 0;
}

主循环函数

检测 SDL_Event 的类型

SDL_KEYDOWN:检测到按键的按压,如果是 escape,则退出

SDL_QUIT:如果类型为 QUIT(停止),则退出

好了,videooutput 这个类解析完了,我们最后可以看一下,main 函数是如何运行的,把总体运行起来。

欲知后事如何,请听下回分解。

相关推荐
Francek Chen13 分钟前
【海螺AI视频】蓝耘智算 | AI视频新浪潮:蓝耘MaaS与海螺AI视频创作体验
人工智能·aigc·音视频·海螺ai
_zwy1 小时前
【AIGC 前沿】蓝耘 MaaS 搭载海螺 AI 视频,开启视频创作 “芯” 时代
人工智能·深度学习·计算机视觉·aigc·音视频
程序员JerrySUN2 小时前
深入学习恩智浦 GoPoint:探索 AI Demo 与嵌入式 AI 开发
linux·运维·服务器·人工智能·驱动开发·学习·音视频
AI技术控14 小时前
扩散模型算法实战——视频生成(主页有源码)
算法·音视频
背水15 小时前
音频大语言模型可作为描述性语音质量评价器
人工智能·语言模型·音视频·语音识别
Aomnitrix15 小时前
Qt 实操记录:打造自己的“ QQ 音乐播放器”
开发语言·c++·qt·ui·音视频
智联视频超融合平台15 小时前
大华HTTP协议在智联视频超融合平台中的接入方法
网络协议·http·音视频·实时音视频·视频编解码
爱做ppt的阿伟15 小时前
一键爬取b站视频
python·音视频
DogDaoDao20 小时前
libaom 源码分析:scalable_decoder.c 文件
音视频·视频编解码·av1·svc·视频解码器·libaom·aom