#ifndef __AUDIO_ENCODER_H__
#define __AUDIO_ENCODER_H__

#include "abstract_encoder.h"
#include <string>
#include <vector>

template<>
class Encoder<MediaType::AUDIO> : public AbstractEncoder
{
public:
    struct Param
    {
        int bitRate;
        // 可选：优先使用的编码器名称，例如 "aac"、"libopus"、"libmp3lame"
        std::string name;
    };
    ~Encoder() { Close(); }

    bool Open(const Param& audioParma, AVFormatContext* fmtCtx);
    virtual void Close() override;
    virtual bool PushFrame(AVFrame* frame, bool isEnd, uint64_t pts) override;
    // 获取可用的音频编码器名称列表（按优先级排序）
    static const std::vector<std::string>& GetUsableEncoders();

private:
    bool _Init(const Param& audioParam, AVFormatContext* fmtCtx);
    static void _FindUsableEncoders();
    static std::vector<std::string> _usableEncoders;
    // 常见音频编码器名称：优先保证与常见容器/推流（flv/mp4/rtmp）兼容
    static constexpr const char* _encoderNames[5] = {
        "aac",         // 通用AAC
        "libfdk_aac", // 可选的高质量AAC
        "libopus",     // Opus
        "opus",        // 有些构建使用此名
        "libmp3lame"   // MP3（不建议用于flv）
    };
};

#endif
