2 Stimmen

Api zur Erfassung der Stimme vom Mikrofon mit Lautstärkeregelung

Ich versuche, eine Anwendung auf qt mit der Fähigkeit, Sprachanrufe über ein GSM-Modem zu tätigen, zu erstellen. Jetzt bin ich auf der Suche nach Bibliothek, die Stimme von Mikro erfassen kann und hat die Fähigkeit, Stimme Volumen zu regulieren. Qt's phonon haben Stimme Regelung, aber nicht die Fähigkeit, Daten vom Mikrofon zu erfassen.

Auf der anderen Seite gibt es QtMultimedia, das solche Daten erfassen kann, aber die Lautstärke nicht regulieren kann.

Gibt es irgendeine Lib für C++, die beide Aufgaben erledigen könnte, und ist portabel durch win|mac|linux?

4voto

Raiv Punkte 5581

Schließlich habe ich dies mit QtMultimedia + Unterklassifizierung QIODevice getan.

Am Eingang und Ausgang habe ich pcm-Format, vorzeichenbehaftet, so dass ich einfach multiplizieren Byte-Wert der Eingabe \output Stream mit einem Float-Wert, um die Lautstärke einzustellen, danach schreibe ich die Daten in das Gerät, das ich brauche.

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;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X