Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 使用QAudioOutput播放ulaw文件_Qt_Audio - Fatal编程技术网

Qt 使用QAudioOutput播放ulaw文件

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

我试图建立一个简单的工作示例来播放.raw文件,但音频似乎失真了。当.raw文件播放时,我仍然可以辨认出所有内容,它只是相当失真,就像听一个超出范围的广播电台

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。这听起来应该是一个单独的堆栈溢出问题。