c++ - 用于从麦克风捕获声音并调节音量的 API

标签 c++ qt

我尝试在 qt 上创建具有通过 GSM 调制解调器进行语音通话功能的应用程序。现在我正在寻找可以从微型捕获语音并能够调节语音音量的库。 Qt 的声子具有语音调节功能,但不具备从麦克风捕获数据的能力。

另一方面,QtMultimedia可以捕获此类数据,但无法调节音量。

是否有任何 C++ 库可以完成这两项任务,并且可以通过 win|mac|linux 进行移植?

最佳答案

最后我使用 QtMultimedia + 子类化 QIODevice 完成了此操作。

在输入和输出上,我具有带符号的 pcm 格式,因此我只需将输入\输出流的字节值与一些浮点值相乘即可设置音量级别,然后将数据写入我需要的设备。

class VOICEIO_EXPORT VoiceIOAdapter : public QIODevice
{
    Q_OBJECT

public:
    VoiceIOAdapter(QObject *parent,QIODevice* dev);
    VoiceIOAdapter(QObject *parent);
    ~VoiceIOAdapter();
    void setUnderlyingDevice(QIODevice* dev);
    QIODevice* getUnderlyingDevice() const;
        ... /*some qiodevice virtual functions reimplemented*/
        ...
    float getOutVolume()const;
    float getInVolume() const;
public slots:
    void setOutVolume(float);
    void setInVolume(float);
protected:
    QIODevice* underlyingDevice;
    virtual qint64  readData ( char * data, qint64 maxSize );
    virtual qint64  writeData ( const char * data, qint64 maxSize );
    void applyVolume(float value, QByteArray& input);
    float outVolume;//1
    float inVolume;//1
};


void VoiceIOAdapter::applyVolume(float value, QByteArray& input)
{
    Q_ASSERT(!(input.size()%2)); //SHORT,Signed,LE
    qint16* data=reinterpret_cast<qint16*>(input.data());
    qint32 tmp;
    for(int i=0;i<input.size()/2;i++)
    {
        tmp=qint32(float(data[i])*value);
        if(tmp>std::numeric_limits<qint16>::max())
        {
            tmp=std::numeric_limits<qint16>::max();
        }
        else if (tmp<std::numeric_limits<qint16>::min())
        {
            tmp=std::numeric_limits<qint16>::min();
        }
        data[i]=tmp;
    }
}

qint64  VoiceIOAdapter::readData ( char * data, qint64 maxSize )
{
    if(!underlyingDevice)
    {
        return -1;
    }
        QByteArray decoded(maxSize ,0);
    qint64 result=underlyingDevice->read(decoded.data(),maxSize);
    if(result>0)
    {
                decoded.resize(result);
        applyVolume(inVolume,decoded);
        memcpy(data,decoded.data(),decoded.size());
    }
    return result;
}

qint64  VoiceIOAdapter::writeData ( const char * data, qint64 maxSize )
{
    if(!underlyingDevice)
    {
        return -1;
    }
    QByteArray encoded(data,maxSize);
    applyVolume(outVolume,encoded);
    qint64 result=underlyingDevice->write(encoded.data(),maxSize );
    return result;
}

关于c++ - 用于从麦克风捕获声音并调节音量的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5993045/

相关文章:

c++ - 比较流

C++ openssl - 生成 RSA key 对并读取

c++ - Qt Creator - C++ 库,找不到可执行文件?

c++ - 在 c/c++ 代码中使用什么宏来识别 Mavericks OSX 10.9?

c++ - 更改对象的类:可能使用 std::move?

c++ - 包含源中的 Qt undefined reference

c++ - 如何在c++项目中访问Qt的资源文件?

c++ - 如何在 Qt GUI 中显示原始图像文件?

c++ - vector map - 怎么做

c++ - QML渲染引擎: frame refresh event