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


    介绍

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

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

    解析

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

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

    1. #ifndef AUDIOOUTPUT_H_
    2. #define AUDIOOUTPUT_H_
    3. #ifdef __cplusplus
    4. extern "C"{
    5. #include"libavutil/avutil.h"
    6. #include"SDL.h"
    7. #include"libswresample/swresample.h"
    8. }
    9. #include"avsync.h"
    10. #include"avframequeue.h"
    11. typedef struct AudioParams{
    12. int freq;
    13. int channels;
    14. int64_t channel_layout;
    15. enum AVSampleFormat fmt;
    16. int frame_size;
    17. } AudioParams;
    18. class AudioOutput
    19. {
    20. public:
    21. AudioOutput(AVSync* avsync, AVRational time_base, const AudioParams& audio_params, AVFrameQueue* frame_queue);
    22. ~AudioOutput();
    23. int Init();
    24. int DeInit();
    25. private:
    26. int64_t pts = AV_NOPTS_VALUE;
    27. AudioParams src_tgt;
    28. AudioParams dst_tgt;
    29. AVFrameQueue* frame_queue = nullptr;
    30. struct SwrContext* swr_ctx = nullptr;
    31. uint8_t* audio_buf = nullptr;
    32. uint8_t* audio_buf1 = nullptr;
    33. uint32_t* audio_buf_size = 0;
    34. uint32_t* audio_buf1_size = 0;
    35. uint32_t* audio_buf_index = 0;
    36. AVSync* avsync = nullptr;
    37. AVRational time_base;
    38. };
    39. #endif
    40. #endif

    大体上看一遍,首部有 AudioParams,然后是 AudioOutput 的类。

    AudioParams:
    1. typedef struct AudioParams{
    2. int freq;
    3. int channels;
    4. int64_t channel_layout;
    5. enum AVSampleFormat fmt;
    6. int frame_size;
    7. } 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:帧率

    构造函数:

    1. AudioOutput::AudioOutput(AVSync* avsync, AVRational time_base, const AudioParams& audio_params, AVFrameQueue* frame_queue){
    2. this->avsync = avsync;
    3. this->time_base = time_base;
    4. this->src_tgt = audio_params;
    5. this->frame_queue = frame_queue;
    6. }

    将私有成员变量进行赋值

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

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

  • 相关阅读:
    【2022】【论文笔记】基于二维光子晶体的光控分光比可调Y型——
    C++ STL进阶与补充(vector容器)
    STM32电源名词解析
    【神印王座】悲啸洞穴中隐藏的人有多强?实力不如魔神皇,靠一绝招魔神皇都怕
    电商平台搭建流程是怎样的_不懂编程怎么搭建_OctShop
    微信小程序获取元素的高度
    应用程序服务器/事件驱动编程/CommonJS介绍
    SpringBoot之使用Redis和注解实现接口幂等性
    山东省技能兴鲁职业技能竞赛-人工智能工程技术人员
    Linux中Java图片、二维码设置的中文变成乱码问题解决
  • 原文地址:https://blog.csdn.net/weixin_60701731/article/details/134487232