#ifndef AV_CAPTURE_AUDIO_CAPTURER_H #define AV_CAPTURE_AUDIO_CAPTURER_H #include "capture_abstract_capturer.h" #include #include #include #include extern "C" { #include #include #include } namespace av { namespace capture { /** * 音频采集器参数 */ struct AudioCaptureParams : public CapturerParams { int sampleRate = 44100; // 采样率 int channels = 2; // 声道数 AVSampleFormat sampleFormat = AV_SAMPLE_FMT_S16; // 采样格式 int bufferSize = 1024; // 缓冲区大小(采样数) // 麦克风特定参数 int micIndex = 0; // 麦克风索引 std::string micFormat; // 麦克风格式 (如 "dshow", "alsa") float volume = 1.0f; // 音量 (0.0-2.0) bool enableNoiseReduction = false; // 降噪 bool enableEchoCancellation = false; // 回声消除 // 系统音频特定参数 bool captureLoopback = false; // 捕获回环音频 std::string audioDevice; // 音频设备名称 AudioCaptureParams(CapturerType type) : CapturerParams(type, MediaType::AUDIO) {} }; /** * 音频设备信息 */ struct AudioDeviceInfo { std::string id; // 设备ID std::string name; // 设备名称 std::string description; // 设备描述 bool isDefault = false; // 是否为默认设备 bool isInput = true; // 是否为输入设备 std::vector supportedSampleRates; // 支持的采样率 std::vector supportedChannels; // 支持的声道数 std::vector supportedFormats; // 支持的采样格式 }; /** * 音频采集器类 * 支持麦克风和系统音频采集 */ class AudioCapturer : public AbstractCapturer { public: AudioCapturer(); virtual ~AudioCapturer(); // 基础接口实现 ErrorCode initialize(const CapturerParams& params) override; ErrorCode start() override; ErrorCode stop() override; ErrorCode pause() override; ErrorCode resume() override; ErrorCode reset() override; ErrorCode close() override; // 设备信息 std::vector getAvailableDevices() const override; std::string getCurrentDevice() const override; /** * 获取详细设备信息 * @return 设备信息列表 */ std::vector getDetailedDeviceInfo() const; /** * 设置音频参数 * @param sampleRate 采样率 * @param channels 声道数 * @param sampleFormat 采样格式 * @return 错误码 */ ErrorCode setAudioParams(int sampleRate, int channels, AVSampleFormat sampleFormat); /** * 设置音量 * @param volume 音量 (0.0-2.0) * @return 错误码 */ ErrorCode setVolume(float volume); /** * 获取当前音量 * @return 音量值 */ float getVolume() const; /** * 设置降噪 * @param enable 是否启用 * @return 错误码 */ ErrorCode setNoiseReduction(bool enable); /** * 设置回声消除 * @param enable 是否启用 * @return 错误码 */ ErrorCode setEchoCancellation(bool enable); /** * 获取当前音频参数 * @return 音频参数 */ AudioCaptureParams getCurrentParams() const; /** * 获取音频电平 * @return 电平值 (0.0-1.0) */ float getAudioLevel() const; /** * 音频采集器工厂 */ class AudioCaptureFactory { public: /** * 创建麦克风采集器 * @param micIndex 麦克风索引 * @return 采集器实例 */ static std::unique_ptr createMicrophone(int micIndex = 0); /** * 创建系统音频采集器 * @param loopback 是否为回环模式 * @return 采集器实例 */ static std::unique_ptr createSystemAudio(bool loopback = false); /** * 创建最佳麦克风采集器 * @return 采集器实例 */ static std::unique_ptr createBestMicrophone(); }; protected: bool validateParams(const CapturerParams& params) override; private: // 内部实现方法 ErrorCode initializeMicrophone(); ErrorCode initializeSystemAudio(); ErrorCode openInputDevice(); ErrorCode setupAudioParams(); ErrorCode setupAudioResampling(); ErrorCode setupAudioProcessing(); // 采集线程 void captureThreadFunc(); ErrorCode captureFrame(); // 音频处理 AVFramePtr processAudioFrame(const AVFramePtr& frame); AVFramePtr resampleAudioFrame(const AVFramePtr& frame); AVFramePtr applyVolumeControl(const AVFramePtr& frame); AVFramePtr applyNoiseReduction(const AVFramePtr& frame); void calculateAudioLevel(const AVFramePtr& frame); // 资源清理 void cleanupResampler(); void cleanupAudioProcessing(); // 设备枚举 std::vector enumerateMicrophones() const; std::vector enumerateSystemAudioDevices() const; // 平台特定实现 #ifdef _WIN32 std::vector enumerateDirectSoundDevices() const; std::vector enumerateWASAPIDevices() const; ErrorCode setupDirectSoundMicrophone(); ErrorCode setupWASAPISystemAudio(); #elif defined(__linux__) std::vector enumerateALSADevices() const; std::vector enumeratePulseAudioDevices() const; ErrorCode setupALSAMicrophone(); ErrorCode setupPulseAudioCapture(); #elif defined(__APPLE__) std::vector enumerateCoreAudioDevices() const; ErrorCode setupCoreAudioMicrophone(); ErrorCode setupCoreAudioSystemCapture(); #endif // 获取平台特定的输入格式 const AVInputFormat* getPlatformInputFormat() const; std::string getPlatformDeviceName() const; private: // 采集参数 AudioCaptureParams audioParams_; // FFmpeg 相关 AVFormatContext* formatCtx_ = nullptr; AVCodecContext* codecCtx_ = nullptr; const AVCodec* codec_ = nullptr; int audioStreamIndex_ = -1; // 音频重采样 SwrContext* swrCtx_ = nullptr; AVFramePtr resampledFrame_; bool needResampling_ = false; // 音频处理 float currentVolume_ = 1.0f; bool noiseReductionEnabled_ = false; bool echoCancellationEnabled_ = false; std::atomic audioLevel_{0.0f}; // 采集线程 std::thread captureThread_; std::atomic shouldStop_{false}; std::condition_variable pauseCondition_; std::mutex pauseMutex_; // 帧缓冲 std::queue frameQueue_; std::mutex queueMutex_; std::condition_variable queueCondition_; static constexpr size_t MAX_QUEUE_SIZE = 20; // 设备信息缓存 mutable std::vector cachedDevices_; mutable std::mutex deviceCacheMutex_; mutable bool devicesCached_ = false; // 音频电平计算 mutable std::mutex levelMutex_; std::chrono::steady_clock::time_point lastLevelUpdate_; static constexpr double LEVEL_UPDATE_INTERVAL = 0.1; // 100ms }; } // namespace capture } // namespace av #endif // AV_CAPTURE_AUDIO_CAPTURER_H