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

介绍

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

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

解析

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

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

#ifndef VIDEOOUTPUT_H_
#define VIDEOOUTPUT_H_

#ifdef __cplusplus
extern "C"{
#include"libavutil/avutil.h"
#include"SDL.h"
#include"libavutil/time.h"
}
#endif

#include"avframequeue.h"
#include"avsync.h"

class VideoOutput{
public:
    VideoOutput(AVSync* avsync, AVRational time_base, AVFrameQueue* frame_queue, int video_width, int video_height);
    ~VideoOutput();
    int Init();
    int MainLoop();
    void RefreshLoopWaitEvent(SDL_Event* event);
private:
    void videoRefresh(double* remaining_time);
    AVFrameQueue* frame_queue = nullptr;
    SDL_Event event;
    SDL_Rect rect;
    SDL_Window* win = nullptr;
    SDL_Renderer* renderer = nullptr;
    SDL_Texture* texture = nullptr;

    AVSync* avsync = nullptr;
    AVRational time_base;

    int video_width = 0;
    int video_height = 0;
    uint8_t* yuv_buf = nullptr;
    int yuv_buf_size = 0;
};

#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 类的私有成员变量,下一篇文章开始讲解函数。

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

相关推荐

  1. qt+ffmpeg 实现视频播放(一)

    2023-12-08 18:00:09       17 阅读
  2. FFmpeg 视频处理

    2023-12-08 18:00:09       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 18:00:09       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 18:00:09       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 18:00:09       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 18:00:09       18 阅读

热门阅读

  1. VS2010 VS2015环境编译boost库

    2023-12-08 18:00:09       29 阅读
  2. 移植OpenSSH到DM IPNC中的Linux ARM SSH编程

    2023-12-08 18:00:09       45 阅读
  3. Sentinel与SpringBoot整合

    2023-12-08 18:00:09       32 阅读
  4. Spring 之 @Cacheable 缓存使用教程

    2023-12-08 18:00:09       37 阅读
  5. LeetCode算法练习top100:(6)图论

    2023-12-08 18:00:09       28 阅读
  6. 今天讲讲TCP(详解)

    2023-12-08 18:00:09       31 阅读