我试图在qt上创建具有通过GSM调制解调器进行语音呼叫的能力的应用程序。现在我正在寻找能够从微音量中捕获声音并具有音量调节能力的库。Qt的声子有声音调节,但没有从麦克风捕获数据的能力。
另一方面,还有QtMultimedia,它可以捕获这些数据,但不能调节音量。
有没有c++库可以同时完成这两个任务,并且可以通过win|mac|linux进行移植?
发布于 2011-07-06 21:09:36
最后,我用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;
}
https://stackoverflow.com/questions/5993045
复制相似问题