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

介绍

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

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

解析

我们今天文章将会解析负责解码的线程 decodethread,我们先看看 .h 文件的代码:

#ifndef DECODETHREAD_H_
#define DECODETHREAD_H_

#include"thread.h"
#include"avpacketqueue.h"
#include"avframequeue.h"

class DecodeThread : public Thread
{
public:
    DecodeThread(AVPacketQueue* packet_queue, AVPacketQueue* frame_queue);
    ~DecodeThread();
    int Init(AVCodecParameters* par);
    int Start();
    int Stop();
    void Run();
private:
    AVCodecContext* codec_ctx = nullptr;
    AVPacketQueue* packet_queue = nullptr;
    AVFrameQueue* frame_queue = nullptr;
};

#endif

可以看到,其实结构上与负责解封装的线程 demuxthread 差不多,公有函数都有构造函数,析构函数,Init,Start,Stop,Run。不过私有成员发生了一些变化,之前的 AVFormatContext 变成了现在的 AVCodecContext,之前的包队列(AVPacketQueue)变成了现在的帧队列(AVFrameQueue)。

有兴趣的朋友可以看看下面的 demuxthread 源码对比一下:

#ifndef DECODETHREAD_H_
#define DECODETHREAD_H_

#include"thread.h"
#include"avpacketqueue.h"
#include"avframequeue.h"

class DecodeThread : public Thread
{
public:
    DecodeThread(AVPacketQueue* packet_queue, AVPacketQueue* frame_queue);
    ~DecodeThread();
    int Init(AVCodecParameters* par);
    int Start();
    int Stop();
    void Run();
private:
    AVCodecContext* codec_ctx = nullptr;
    AVPacketQueue* packet_queue = nullptr;
    AVFrameQueue* frame_queue = nullptr;
};

#endif

最后,我们看一些构造函数,其余的呢我们下一篇文章再讲。

DecodeThread::DecodeThread(AVPacketQueue* packet_queue, AVPacketQueue* frame_queue){
    this->packet_queue = packet_queue;
    this->frame_queue = frame_queue;
}

这比较好理解,就是将两个私有成员,一个包队列(AVodecPacket),一个帧队列(AVFrameQueue)进行初始化。

好了,今天的知识理解起来比较轻松,不做总结了。

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

猜你喜欢

转载自blog.csdn.net/weixin_60701731/article/details/134420227