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

介绍

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

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

解析

我们到了后面,就应该播放出音频和视频了,这就了两个包,audiooutput,videooutput。我们今天解析负责播放音频的包,audiooutput。

我们先来看看 .h 文件的代码

cpp 复制代码
#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 的类。

AudioParams:
cpp 复制代码
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:帧大小

AudioOutput:

我们先看私有成员

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:帧率

构造函数:

cpp 复制代码
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;
}

将私有成员变量进行赋值

好了,今天先讲这么多,下一篇文章讲解的函数会比较多且难,大家慢慢来。

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

相关推荐
小豆庄4 分钟前
本地视频脱敏的追踪系统踩坑——车牌过滤、转场误判与ID冲突排查
人工智能·算法·目标检测·音视频·视频·敏捷流程·纹理贴图
是Yu欸2 小时前
先让 T1 Pro 传回一张好用的图:JPEG 抓拍、RTSP 视频与方向校正
python·机器人·音视频
OH_TPC2 小时前
【鸿蒙优选三方库】@ohos/ffmpeg-kit:把 FFmpeg 的全部能量带进鸿蒙
华为·ffmpeg·harmonyos·鸿蒙
是jin奥2 小时前
最新 FFmpeg 安装脚本:Linux x86_64
linux·运维·ffmpeg
阿明副业观察2 小时前
AI分镜批量生成与画风统一的秘诀
大数据·人工智能·aigc·音视频·ai写作
xierui1231233 小时前
视频Agent的首帧验收:用3秒无声样段检查开场信息与可读性
人工智能·音视频
美狐美颜sdk3 小时前
直播APP开发中的视频帧处理:美颜SDK接入需要注意哪些细节?
大数据·前端·人工智能·音视频·美颜sdk
骑着蜗牛撵大象3273 小时前
用 Codex 批量做数字人商品口播视频:从分镜 JSON 到成片校验的流水线
java·ffmpeg·json·音视频·数字人·视频·codex
2601_965449084 小时前
新闻视频自动化:从采集、清洗到成片的工程化实践
信息可视化·自动化·音视频
码流子5 小时前
毫米波雷达+视频融合(雷视一体)在高速事件检测里怎么落地:从目标级融合到事件级研判
大数据·人工智能·音视频