#ifndef AV_CODEC_AUDIO_DECODER_H #define AV_CODEC_AUDIO_DECODER_H #include "codec_abstract_codec.h" #include #include #include #include #include #include extern "C" { #include #include #include } namespace av { namespace codec { /** * 音频解码器参数 */ struct AudioDecoderParams : public CodecParams { std::string codecName; // 解码器名称 (如 "aac", "mp3", "opus") int sampleRate = 44100; // 采样率 int channels = 2; // 声道数 AVSampleFormat sampleFormat = AV_SAMPLE_FMT_S16; // 采样格式 int threadCount = 0; // 线程数 (0=自动) bool lowLatency = false; // 低延迟模式 bool enableResampling = true; // 启用重采样 AudioDecoderParams() { type = MediaType::AUDIO; } }; /** * 音频解码器类 * 提供音频解码功能,支持多种音频格式 */ class AudioDecoder : public AbstractDecoder { public: /** * 解码统计信息 */ struct DecoderStats { uint64_t decodedFrames = 0; // 已解码帧数 uint64_t resampledFrames = 0; // 重采样帧数 uint64_t totalSamples = 0; // 总采样数 uint64_t totalBytes = 0; // 总字节数 uint64_t errorCount = 0; // 错误次数 double avgDecodeTime = 0.0; // 平均解码时间(ms) double totalDecodeTime = 0.0; // 总解码时间(ms) }; /** * 帧回调函数类型 */ using FrameCallback = std::function; public: AudioDecoder(); virtual ~AudioDecoder(); // 基础接口实现 ErrorCode open(const CodecParams& params) override; void close() override; ErrorCode flush() override; ErrorCode reset() override; // 初始化方法 ErrorCode initialize(const CodecParams& params); /** * 解码音频包 * @param packet 输入音频包 (nullptr表示刷新解码器) * @param frames 输出解码后的音频帧 * @return 错误码 */ ErrorCode decode(const AVPacketPtr& packet, std::vector& frames) override; /** * 完成解码,刷新解码器缓冲区 * @param frames 输出剩余的音频帧 * @return 错误码 */ ErrorCode finishDecode(std::vector& frames) override; /** * 设置帧回调函数 * @param callback 回调函数 */ void setFrameCallback(const FrameCallback& callback) { frameCallback_ = callback; } // 状态查询 std::string getDecoderName() const; bool isResamplingEnabled() const; DecoderStats getStats() const; void resetStats(); // 静态工具方法 static std::vector getSupportedDecoders(); static bool isDecoderSupported(const std::string& codecName); static std::string getRecommendedDecoder(const std::string& codecName = ""); /** * 音频解码器工厂 */ class AudioDecoderFactory { public: /** * 创建指定解码器 * @param codecName 解码器名称 * @return 解码器实例 */ static std::unique_ptr create(const std::string& codecName); /** * 创建最佳解码器 * @return 解码器实例 */ static std::unique_ptr createBest(); }; protected: bool validateParams(const CodecParams& params) override; private: // 内部实现方法 ErrorCode initDecoder(); ErrorCode setupDecoderParams(); ErrorCode decodeFrame(const AVPacketPtr& packet, std::vector& frames); ErrorCode receiveFrames(std::vector& frames); // 音频格式转换 AVFramePtr convertFrame(AVFramePtr frame); ErrorCode setupResampler(const AVFrame* inputFrame); void cleanupResampler(); // 统计更新 void updateStats(bool success, double decodeTime, size_t dataSize, int samples); // 静态方法 static void findUsableDecoders(); private: // 解码器相关 const AVCodec* codec_ = nullptr; AVCodecContextPtr codecCtx_; AudioDecoderParams audioParams_; // 音频重采样 SwrContext* swrCtx_ = nullptr; bool needResampling_ = false; // 统计信息 mutable std::mutex statsMutex_; DecoderStats stats_; // 回调函数 FrameCallback frameCallback_; // 线程安全 std::mutex decodeMutex_; // 静态成员 static std::vector supportedDecoders_; static std::once_flag decodersInitFlag_; public: // 支持的音频解码器列表 static constexpr const char* AUDIO_DECODERS[] = { // 常用音频解码器 "aac", "mp3", "mp3float", "opus", "vorbis", "flac", "pcm_s16le", "pcm_s24le", "pcm_s32le", "pcm_f32le", "pcm_f64le", "ac3", "eac3", "dts", "truehd", "wmav1", "wmav2", "wmalossless", "wmapro", "g722", "g726", "adpcm_ima_wav", "adpcm_ms", "alac", "ape", "wavpack", nullptr }; }; } // namespace codec } // namespace av #endif // AV_CODEC_AUDIO_DECODER_H