Qt 使用QAudioOutput播放ulaw文件
我试图建立一个简单的工作示例来播放.raw文件,但音频似乎失真了。当.raw文件播放时,我仍然可以辨认出所有内容,它只是相当失真,就像听一个超出范围的广播电台Qt 使用QAudioOutput播放ulaw文件,qt,audio,Qt,Audio,我试图建立一个简单的工作示例来播放.raw文件,但音频似乎失真了。当.raw文件播放时,我仍然可以辨认出所有内容,它只是相当失真,就像听一个超出范围的广播电台 QString mResourcePath ="test.raw"; QFile audio_file(mResourcePath); if(audio_file.open(QIODevice::ReadOnly)) { audio_file.seek(4); // skip wav header QByteArra
QString mResourcePath ="test.raw";
QFile audio_file(mResourcePath);
if(audio_file.open(QIODevice::ReadOnly)) {
audio_file.seek(4); // skip wav header
QByteArray audio_data = audio_file.readAll();
audio_file.close();
QBuffer audio_buffer(&audio_data);
audio_buffer.open(QIODevice::ReadOnly);
qDebug() << audio_buffer.size();
QAudioFormat format;
format.setSampleSize(8);
format.setSampleRate(8000);
format.setChannelCount(1);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::BigEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning()<<"raw audio format not supported by backend, cannot play audio.";
return;
}
qDebug() << info.deviceName();
QAudioOutput output(info, format);
output.start(&audio_buffer);
// ...then wait for the sound to finish
QEventLoop loop;
QObject::connect(&output, SIGNAL(stateChanged(QAudio::State)), &loop, SLOT(quit()));
do {
loop.exec();
} while(output.state() == QAudio::ActiveState);
}
QString mResourcePath=“test.raw”;
QFile音频文件(mResourcePath);
if(音频文件.open(QIODevice::ReadOnly)){
音频文件.seek(4);//跳过wav头
QByteArray audio_data=audio_file.readAll();
音频文件.close();
QBuffer音频缓冲区(和音频数据);
音频缓冲区打开(QIODevice::ReadOnly);
qDebug()您问题的标题表示您希望播放u-law音频,即对数PCM
format.setCodec("audio/pcm");
初始化线性PCM的播放。2种可能的解决方案:
使用适当的日志PCM编解码器初始化播放。文档报告将返回支持的编解码器列表
实时将对数PCM样本转换为线性PCM。它的影响非常小,可以使用查找表执行
谢谢你的回答!!如果我使用QAudioDeviceInfo::supportedCodecs(),我只会得到“音频/pcm”我是编程新手,我不知道如何将日志PCM样本实时转换为线性PCM。你能给我一个提示吗。谢谢!!这段源代码可能有一些用处:你有什么想法吗?我如何播放转换后的数据?我试过QAudioOutput::start(),但我得到了“从qint16{aka short int int}到“IODevice”的无效转换”我不精通qt。这听起来应该是一个单独的堆栈溢出问题。