介绍
在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(十二)
解析
我们到了后面,就应该播放出音频和视频了,这就了两个包,audiooutput,videooutput。我们今天解析负责播放音频的包,audiooutput。
我们先来看看 .h 文件的代码
- #ifndef AUDIOOUTPUT_H_
- #define AUDIOOUTPUT_H_
-
- #ifdef __cplusplus
-
- extern "C"{
- #include"libavutil/avutil.h"
- #include"SDL.h"
- #include"libswresample/swresample.h"
- }
-
- #include"avsync.h"
- #include"avframequeue.h"
-
- typedef struct AudioParams{
- int freq;
- int channels;
- int64_t channel_layout;
- enum AVSampleFormat fmt;
- int frame_size;
- } AudioParams;
-
- class AudioOutput
- {
- public:
- AudioOutput(AVSync* avsync, AVRational time_base, const AudioParams& audio_params, AVFrameQueue* frame_queue);
- ~AudioOutput();
- int Init();
- int DeInit();
- private:
- int64_t pts = AV_NOPTS_VALUE;
- AudioParams src_tgt;
- AudioParams dst_tgt;
- AVFrameQueue* frame_queue = nullptr;
- struct SwrContext* swr_ctx = nullptr;
- uint8_t* audio_buf = nullptr;
- uint8_t* audio_buf1 = nullptr;
- uint32_t* audio_buf_size = 0;
- uint32_t* audio_buf1_size = 0;
- uint32_t* audio_buf_index = 0;
- AVSync* avsync = nullptr;
- AVRational time_base;
- };
-
- #endif
-
- #endif
大体上看一遍,首部有 AudioParams,然后是 AudioOutput 的类。
- typedef struct AudioParams{
- int freq;
- int channels;
- int64_t channel_layout;
- enum AVSampleFormat fmt;
- int frame_size;
- } AudioParams;
这个结体体负责记录音频的各类参数
freq:频率
channels:频道数
channel_layout:
fmt:音频格式
frame_size:帧大小
我们先看私有成员
int64_t pts = AV_NOPTS_VALUE:显示时间戳
AudioParams src_tgt:源音频参数
AudioParams dst_tgt:目标音频参数
AVFrameQueue* frame_queue = nullptr:音频帧队列
struct SwrContext* swr_ctx = nullptr:
uint8_t* audio_buf = nullptr:音频缓冲区
uint8_t* audio_buf1 = nullptr:音频缓冲区
uint32_t* audio_buf_size = 0:音频缓冲区大小
uint32_t* audio_buf1_size = 0:音频缓冲区大小
uint32_t* audio_buf_index = 0:音频缓冲区 index
AVSync* avsync = nullptr:音视频同步
AVRational time_base:帧率
构造函数:
- AudioOutput::AudioOutput(AVSync* avsync, AVRational time_base, const AudioParams& audio_params, AVFrameQueue* frame_queue){
- this->avsync = avsync;
- this->time_base = time_base;
- this->src_tgt = audio_params;
- this->frame_queue = frame_queue;
- }
将私有成员变量进行赋值
好了,今天先讲这么多,下一篇文章讲解的函数会比较多且难,大家慢慢来。
欲知后事如何,请听下回分解。