| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #ifndef AV_CODEC_AUDIO_DECODER_H
- #define AV_CODEC_AUDIO_DECODER_H
- #include "codec_abstract_codec.h"
- #include <vector>
- #include <string>
- #include <memory>
- #include <mutex>
- #include <functional>
- #include <chrono>
- extern "C" {
- #include <libavcodec/avcodec.h>
- #include <libavutil/samplefmt.h>
- #include <libswresample/swresample.h>
- }
- 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<void(const AVFramePtr&)>;
-
- 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<AVFramePtr>& frames) override;
-
- /**
- * 完成解码,刷新解码器缓冲区
- * @param frames 输出剩余的音频帧
- * @return 错误码
- */
- ErrorCode finishDecode(std::vector<AVFramePtr>& 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<std::string> 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<AudioDecoder> create(const std::string& codecName);
-
- /**
- * 创建最佳解码器
- * @return 解码器实例
- */
- static std::unique_ptr<AudioDecoder> createBest();
- };
-
- protected:
- bool validateParams(const CodecParams& params) override;
-
- private:
- // 内部实现方法
- ErrorCode initDecoder();
- ErrorCode setupDecoderParams();
- ErrorCode decodeFrame(const AVPacketPtr& packet, std::vector<AVFramePtr>& frames);
- ErrorCode receiveFrames(std::vector<AVFramePtr>& 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<std::string> 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
|