audio_mixer.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef __AUDIO_MIXER_H__
  2. #define __AUDIO_MIXER_H__
  3. #include <cstdint>
  4. #include <memory>
  5. #include <mutex>
  6. #include <queue>
  7. #include <string>
  8. #include <unordered_map>
  9. extern "C" {
  10. #include <libavcodec/avcodec.h>
  11. #include <libavfilter/buffersink.h>
  12. #include <libavfilter/buffersrc.h>
  13. #include <libavformat/avformat.h>
  14. #include <libavutil/opt.h>
  15. #include <libswresample/swresample.h>
  16. }
  17. #include "basic/frame.h"
  18. #define __PCM1_FRAME_SIZE (4096 * 2)
  19. #define __PCM2_FRAME_SIZE (4096)
  20. #define __PCM_OUT_FRAME_SIZE (40000)
  21. // 循环缓存空间
  22. class FrameQueue {
  23. public:
  24. bool Init(int channelNums, int sampleRate, AVSampleFormat fmt, int nbSamples);
  25. Frame<MediaType::AUDIO> Pop();
  26. void Push(uint8_t* data, int length);
  27. bool IsEmpty() const { return _queue.size() < 2; }
  28. auto GetSize() const { return _queue.size(); }
  29. private:
  30. int _front = 0;
  31. AVChannelLayout _layout;
  32. int _sampleRate;
  33. int _nbSamples;
  34. int _usedLinesize;
  35. AVSampleFormat _fmt;
  36. std::queue<Frame<MediaType::AUDIO>> _queue;
  37. };
  38. class Resampler {
  39. public:
  40. bool Open(int inChannelNums, int inSampleRate, AVSampleFormat inFmt,
  41. int outChannelNums, int outSampleRate, AVSampleFormat outFmt, int outNbSample);
  42. bool Convert(uint8_t* data, int size);
  43. void Close();
  44. FrameQueue& GetQueue() { return _toQueue; }
  45. ~Resampler() { Close(); }
  46. private:
  47. AVFrame* _swrFrame = nullptr;
  48. SwrContext* _swrCtx = nullptr;
  49. FrameQueue _fromQueue;
  50. FrameQueue _toQueue;
  51. };
  52. class AudioMixer {
  53. public:
  54. struct AudioInfo {
  55. uint32_t sampleRate;
  56. uint32_t channels;
  57. uint32_t bitsPerSample;
  58. AVSampleFormat format;
  59. std::string name;
  60. std::unique_ptr<Resampler> resampler;
  61. float volume = 0;
  62. float scale = 1;
  63. int callTime = 0;
  64. };
  65. AudioMixer();
  66. virtual ~AudioMixer();
  67. // 添加音频输入通道
  68. bool AddAudioInput(uint32_t index, uint32_t sampleRate, uint32_t channels,
  69. uint32_t bitsPerSample, AVSampleFormat format);
  70. // 添加音频输出通道
  71. bool AddAudioOutput(const uint32_t sampleRate, const uint32_t channels,
  72. const uint32_t bitsPerSample, const AVSampleFormat format);
  73. AVFrame* Convert(uint32_t index, uint8_t* inBuf, uint32_t size);
  74. bool SetOutFrameSize(int outputFrameSize = 1024);
  75. int GetOutFrameSize() const { return _outFrameSize; };
  76. bool Close();
  77. AudioInfo* GetInputInfo(uint32_t index);
  78. private:
  79. bool _inited = false;
  80. std::mutex _mutex;
  81. // 输入
  82. std::unordered_map<uint32_t, AudioInfo> _audioInputInfos;
  83. // 转换格式
  84. AudioInfo _audioOutputInfo;
  85. AVFrame* _outputFrame = nullptr;
  86. bool _AdjustVolume();
  87. int _outFrameSize = 0;
  88. };
  89. #endif // AUDIOMIXER_H