codec_audio_decoder.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #ifndef AV_CODEC_AUDIO_DECODER_H
  2. #define AV_CODEC_AUDIO_DECODER_H
  3. #include "codec_abstract_codec.h"
  4. #include <vector>
  5. #include <string>
  6. #include <memory>
  7. #include <mutex>
  8. #include <functional>
  9. #include <chrono>
  10. extern "C" {
  11. #include <libavcodec/avcodec.h>
  12. #include <libavutil/samplefmt.h>
  13. #include <libswresample/swresample.h>
  14. }
  15. namespace av {
  16. namespace codec {
  17. /**
  18. * 音频解码器参数
  19. */
  20. struct AudioDecoderParams : public CodecParams {
  21. std::string codecName; // 解码器名称 (如 "aac", "mp3", "opus")
  22. int sampleRate = 44100; // 采样率
  23. int channels = 2; // 声道数
  24. AVSampleFormat sampleFormat = AV_SAMPLE_FMT_S16; // 采样格式
  25. int threadCount = 0; // 线程数 (0=自动)
  26. bool lowLatency = false; // 低延迟模式
  27. bool enableResampling = true; // 启用重采样
  28. AudioDecoderParams() {
  29. type = MediaType::AUDIO;
  30. }
  31. };
  32. /**
  33. * 音频解码器类
  34. * 提供音频解码功能,支持多种音频格式
  35. */
  36. class AudioDecoder : public AbstractDecoder {
  37. public:
  38. /**
  39. * 解码统计信息
  40. */
  41. struct DecoderStats {
  42. uint64_t decodedFrames = 0; // 已解码帧数
  43. uint64_t resampledFrames = 0; // 重采样帧数
  44. uint64_t totalSamples = 0; // 总采样数
  45. uint64_t totalBytes = 0; // 总字节数
  46. uint64_t errorCount = 0; // 错误次数
  47. double avgDecodeTime = 0.0; // 平均解码时间(ms)
  48. double totalDecodeTime = 0.0; // 总解码时间(ms)
  49. };
  50. /**
  51. * 帧回调函数类型
  52. */
  53. using FrameCallback = std::function<void(const AVFramePtr&)>;
  54. public:
  55. AudioDecoder();
  56. virtual ~AudioDecoder();
  57. // 基础接口实现
  58. ErrorCode open(const CodecParams& params) override;
  59. void close() override;
  60. ErrorCode flush() override;
  61. ErrorCode reset() override;
  62. // 初始化方法
  63. ErrorCode initialize(const CodecParams& params);
  64. /**
  65. * 解码音频包
  66. * @param packet 输入音频包 (nullptr表示刷新解码器)
  67. * @param frames 输出解码后的音频帧
  68. * @return 错误码
  69. */
  70. ErrorCode decode(const AVPacketPtr& packet, std::vector<AVFramePtr>& frames) override;
  71. /**
  72. * 完成解码,刷新解码器缓冲区
  73. * @param frames 输出剩余的音频帧
  74. * @return 错误码
  75. */
  76. ErrorCode finishDecode(std::vector<AVFramePtr>& frames) override;
  77. /**
  78. * 设置帧回调函数
  79. * @param callback 回调函数
  80. */
  81. void setFrameCallback(const FrameCallback& callback) { frameCallback_ = callback; }
  82. // 状态查询
  83. std::string getDecoderName() const;
  84. bool isResamplingEnabled() const;
  85. DecoderStats getStats() const;
  86. void resetStats();
  87. // 静态工具方法
  88. static std::vector<std::string> getSupportedDecoders();
  89. static bool isDecoderSupported(const std::string& codecName);
  90. static std::string getRecommendedDecoder(const std::string& codecName = "");
  91. /**
  92. * 音频解码器工厂
  93. */
  94. class AudioDecoderFactory {
  95. public:
  96. /**
  97. * 创建指定解码器
  98. * @param codecName 解码器名称
  99. * @return 解码器实例
  100. */
  101. static std::unique_ptr<AudioDecoder> create(const std::string& codecName);
  102. /**
  103. * 创建最佳解码器
  104. * @return 解码器实例
  105. */
  106. static std::unique_ptr<AudioDecoder> createBest();
  107. };
  108. protected:
  109. bool validateParams(const CodecParams& params) override;
  110. private:
  111. // 内部实现方法
  112. ErrorCode initDecoder();
  113. ErrorCode setupDecoderParams();
  114. ErrorCode decodeFrame(const AVPacketPtr& packet, std::vector<AVFramePtr>& frames);
  115. ErrorCode receiveFrames(std::vector<AVFramePtr>& frames);
  116. // 音频格式转换
  117. AVFramePtr convertFrame(AVFramePtr frame);
  118. ErrorCode setupResampler(const AVFrame* inputFrame);
  119. void cleanupResampler();
  120. // 统计更新
  121. void updateStats(bool success, double decodeTime, size_t dataSize, int samples);
  122. // 静态方法
  123. static void findUsableDecoders();
  124. private:
  125. // 解码器相关
  126. const AVCodec* codec_ = nullptr;
  127. AVCodecContextPtr codecCtx_;
  128. AudioDecoderParams audioParams_;
  129. // 音频重采样
  130. SwrContext* swrCtx_ = nullptr;
  131. bool needResampling_ = false;
  132. // 统计信息
  133. mutable std::mutex statsMutex_;
  134. DecoderStats stats_;
  135. // 回调函数
  136. FrameCallback frameCallback_;
  137. // 线程安全
  138. std::mutex decodeMutex_;
  139. // 静态成员
  140. static std::vector<std::string> supportedDecoders_;
  141. static std::once_flag decodersInitFlag_;
  142. public:
  143. // 支持的音频解码器列表
  144. static constexpr const char* AUDIO_DECODERS[] = {
  145. // 常用音频解码器
  146. "aac",
  147. "mp3",
  148. "mp3float",
  149. "opus",
  150. "vorbis",
  151. "flac",
  152. "pcm_s16le",
  153. "pcm_s24le",
  154. "pcm_s32le",
  155. "pcm_f32le",
  156. "pcm_f64le",
  157. "ac3",
  158. "eac3",
  159. "dts",
  160. "truehd",
  161. "wmav1",
  162. "wmav2",
  163. "wmalossless",
  164. "wmapro",
  165. "g722",
  166. "g726",
  167. "adpcm_ima_wav",
  168. "adpcm_ms",
  169. "alac",
  170. "ape",
  171. "wavpack",
  172. nullptr
  173. };
  174. };
  175. } // namespace codec
  176. } // namespace av
  177. #endif // AV_CODEC_AUDIO_DECODER_H