音视频项目—基于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 函数是如何运行的,把总体运行起来。

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

相关推荐
VidDown7 小时前
VidDown 工具站:免费视频处理与开发者工具箱
网络协议·编辑器·音视频·视频编解码·视频
超哥--7 小时前
B站视频内容智能分析系统(四):语音转写三级回退
音视频
EasyDSS9 小时前
私有化音视频系统/视频高清直播点播EasyDSS重构多元化社交娱乐互动新生态
重构·音视频·娱乐
辣香牛肉面15 小时前
B站油管抖音视频下载器vidDown
音视频
矜辰所致16 小时前
嵌入式语音开发应用基础说明
ffmpeg·ai 语音·嵌入式语音·语音播放·语音采样
GIS数据转换器16 小时前
基于3D GIS的监控视频精准标定平台
人工智能·物联网·3d·音视频·无人机·知识图谱
换个昵称都难17 小时前
webrtc 视频传输Flexfec模块
音视频·webrtc
Kang.lee17 小时前
2026.6.4【MIPI C-PHY】C-PHY v2.1协议阅读后问题总结
音视频·soc·asic
dualven_in_csdn20 小时前
h265视频的播放问题
音视频
企业老板ai培训1 天前
2026中小企业AI应用落地白皮书:从AI短视频矩阵到数字人获客的破局增长趋势
人工智能·矩阵·音视频