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


    介绍

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

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

    解析

    之前解析的 fill_audio_pcm 函数有点复杂,先不继续讲这个了。

    我们讲最后一个类 videooutput,可见这是负责视频播放的函数,先看 .h 文件

    1. #ifndef VIDEOOUTPUT_H_
    2. #define VIDEOOUTPUT_H_
    3. #ifdef __cplusplus
    4. extern "C"{
    5. #include"libavutil/avutil.h"
    6. #include"SDL.h"
    7. #include"libavutil/time.h"
    8. }
    9. #endif
    10. #include"avframequeue.h"
    11. #include"avsync.h"
    12. class VideoOutput{
    13. public:
    14. VideoOutput(AVSync* avsync, AVRational time_base, AVFrameQueue* frame_queue, int video_width, int video_height);
    15. ~VideoOutput();
    16. int Init();
    17. int MainLoop();
    18. void RefreshLoopWaitEvent(SDL_Event* event);
    19. private:
    20. void videoRefresh(double* remaining_time);
    21. AVFrameQueue* frame_queue = nullptr;
    22. SDL_Event event;
    23. SDL_Rect rect;
    24. SDL_Window* win = nullptr;
    25. SDL_Renderer* renderer = nullptr;
    26. SDL_Texture* texture = nullptr;
    27. AVSync* avsync = nullptr;
    28. AVRational time_base;
    29. int video_width = 0;
    30. int video_height = 0;
    31. uint8_t* yuv_buf = nullptr;
    32. int yuv_buf_size = 0;
    33. };
    34. #endif

    公有成员,都是构造函数,析构函数,初始化函数,循环函数,等待函数。

    私有成员有比较多,我们这篇文章解析一下。

        void videoRefresh(double* remaining_time);        负责刷新的函数

        AVFrameQueue* frame_queue = nullptr;              视频帧数据队列

        SDL_Event event;                                                 SDL 事件

        SDL_Rect rect;                                                      SDL rectangle

        SDL_Window* win = nullptr;                                  SDL 窗口

        SDL_Renderer* renderer = nullptr;                        SDL 渲染器

        SDL_Texture* texture = nullptr;                              SDL 纹理

        AVSync* avsync = nullptr;                                       负责音视频同步的类

        AVRational time_base;                                           用于计算时间戳与帧率

        int video_width = 0;                                                视频窗口的宽度

        int video_height = 0;                                               视频窗口的高度

        uint8_t* yuv_buf = nullptr;                                       存放 yuv 数据的数组

        int yuv_buf_size = 0;                                               存放 yuv 数据的数组长度

    好了,这篇文章讲解了 VieoOutput 类的私有成员变量,下一篇文章开始讲解函数。

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

  • 相关阅读:
    CentOS7.9 搭建内部yum源服务器同步阿里yum源
    HTML <video> 标签
    [论文笔记]P-tuning v2
    apt-get手册翻译
    java框架面试题总结
    MySQL笔记1(数据库的好处,数据库的概念,数据库的特点,MySQL的启动,数据模型,SQL)
    数据结构与算法之 leetcode 47. 全排列 II (回溯)
    支付系统 — 支付路由
    VS2022+QT使用VTK教程
    CodeTON Round 3 (Div. 1 + Div. 2, Rated, Prizes!)——A、B、C
  • 原文地址:https://blog.csdn.net/weixin_60701731/article/details/134562254