在C / C ++中使用Sox录制

问题描述

我正在尝试使用C / C ++中的麦克风和sox库录制声音。

sox_open_read("default",&_input->signal,NULL,NULL)

我正在尝试使用默认输入设备。我遇到了错误

formats: can't open input file `default': No such file or directory

我猜这是由于我没有传递最后一个参数引起的:文件类型和sox尝试查找名称为“默认”的文件。
袜列表:

  • 音频文件格式::8svx aif aifc aiff aiffc al amb au avr caf cdda cdr cvs cvsd cvu dat dvms f32 f4 f64 f8 fap flac fssd gsm gsrt hcom htk ima ircam la lapc lpc10 mat5 maud mp2 mp3 nist ogg opus paf prc pvf raw s1 s16 s2 s24 s24 s3 s32 s4 s8 sb sd2 sds sf ssl sln smp snd sndfile sndr snd su sox sph sw tx u2 u4 u16 w64 wav wavpcm wv wve xa xi
  • 音频设备驱动程序:alsa,oss,ossdsp

作为麦克风的最后一个参数,我应该传递给sox_open_read函数什么?

解决方法

作为用于麦克风输入的sox_open_read函数的最后一个参数,应传递一个音频设备驱动程序。就我而言,是“ alsa”。
示例:

#include <sox.h>
#include <memory>

sox_signalinfo_t _intermediateSignal;
sox_format_t* input;
sox_format_t* output;
sox_effects_chain_t* effectsChain;

void addEffect(std::string effectName,sox_format_t* options) {
    std::unique_ptr<sox_effect_t> effect(sox_create_effect(sox_find_effect(effectName.c_str())));
    char *args[] = {reinterpret_cast<char *>(options)};
    sox_effect_options(effect.get(),1,args);
    sox_add_effect(effectsChain,effect.get(),&_intermediateSignal,&input->signal);
}

int main() {
    if (sox_init() != SOX_SUCCESS)
        throw std::runtime_error("Could not initialise SOX.");

    input = sox_open_read("default",NULL,"alsa");
    output = sox_open_write("recorded.wav",&input->signal,NULL);
    if (!input || !output)
        throw std::runtime_error("SOX I/O error");

    _intermediateSignal = input->signal;

    effectsChain = sox_create_effects_chain(&input->encoding,&output->encoding);

    if (!effectsChain)
        throw std::runtime_error("SOX could not initialize effects chain.");

    addEffect("input",input);
    addEffect("output",output);

    sox_flow_effects(effectsChain,NULL);
    sox_quit();
}

此示例将永远不会结束,因为sox_flow_effects调用会阻止执行。用ctrl + c杀死程序后,recorded.wav会包含录制的音频。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...