• 音视频项目—基于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. }

    将私有成员变量进行赋值

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

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

  • 相关阅读:
    基于 ARM + FPGA 的 EtherCAT 主站设计及实现
    模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
    spring cache 的常规使用
    spring自定义异常处理,前端接收抛出结果
    DataOps课程:DataOps如何提高工作效率,降低出错率? | 内附视频
    算法笔记-第十章-图的定义和相关术语
    【网络技术】什么是DNS及常见问题
    Linux系统中的ps命令详解及用法介绍
    系统韧性研究(2)|系统韧性如何关联其他质量属性?
    装配式施工在建筑装修中的应用研究
  • 原文地址:https://blog.csdn.net/weixin_60701731/article/details/134487232