音视频项目—基于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)进行初始化。
好了,今天的知识理解起来比较轻松,不做总结了。
欲知后事如何,请听下回分解。