通过 QAudioOutput 播放 wav 文件时只有嗡嗡声

Posted

技术标签:

【中文标题】通过 QAudioOutput 播放 wav 文件时只有嗡嗡声【英文标题】:Only buzzing sound while playing wav file through QAudioOutput 【发布时间】:2016-08-12 10:21:11 【问题描述】:

在 Windows 7 台式机和笔记本电脑上使用 Qt 5.5.1。

我只能听到嗡嗡声,没有别的。请指导。

链接到wav文件,我试过了—— https://www.dropbox.com/s/frfy43d8hznptgf/c.wav?dl=0

我也尝试过使用 mp3 文件。我得到的只是嗡嗡声。

可重现的例子:

#include <QCoreApplication>
#include <QAudioOutput>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    QAudioOutput* audioOutpu;

    QFile sourceFile;
    sourceFile.setFileName("c.wav");
    bool p = sourceFile.open(QIODevice::ReadOnly);
    if (p == false)
        qDebug() << "no file";
    else
        qDebug() << "yes file";


    QAudioDeviceInfo d1;
    QList<QAudioDeviceInfo> l1 = d1.availableDevices(QAudio::AudioOutput);

    qDebug() << "======================================================";
    qDebug() << l1.first().supportedCodecs();
    qDebug() << l1.first().supportedChannelCounts();
    qDebug() << l1.first().supportedSampleTypes();
    qDebug() << l1.first().supportedSampleRates();
    qDebug() << l1.first().supportedSampleSizes();

    QAudioFormat desiredFormat1;
    desiredFormat1.setChannelCount(2);
    desiredFormat1.setByteOrder(QAudioFormat::LittleEndian);
    desiredFormat1.setCodec("audio/pcm");
    desiredFormat1.setSampleType(QAudioFormat::SignedInt);
    desiredFormat1.setSampleRate(44100);
    desiredFormat1.setSampleSize(16);

    QAudioDeviceInfo info1(QAudioDeviceInfo::defaultOutputDevice());
    if (!info1.isFormatSupported(desiredFormat1))
    
           qWarning() << "Default format not supported, trying to use the nearest.";
           desiredFormat1 = info1.preferredFormat();
    

    audioOutpu = new QAudioOutput(desiredFormat1);
    audioOutpu->setVolume(1.0);

    audioOutpu->start(&sourceFile);
    qDebug() << "bbbbbbbbbb";
    QEventLoop loop;
    QObject::connect(audioOutpu, SIGNAL(stateChanged(QAudio::State)), &loop, SLOT(quit()));
    do 
        loop.exec();
     while(audioOutpu->state() == QAudio::ActiveState);

    return a.exec();

输出:

【问题讨论】:

一个指向 wav 文件的链接会很棒。 我该怎么做? @Jean-FrançoisFabre 我承认必须链接到像 dropbox 这样的外部链接 @TheIndependentAquarius ,如果这很重要,我在 Windows 7 上运行 Qt5.6.1 的笔记本电脑上进行了尝试,完全没有问题。 . . 那么您是否尝试更新 QT,因为 Mike 显然正在运行更新版本?我认为它很重要的可能性很小,但这是一个消除过程,然后才会有解决方案。 【参考方案1】:

你的 wav 文件并不是真正的WAVE format,这里是与文件关联的MediaInfo 输出:

Format                                   : MPEG Audio
File size                                : 4.67 MiB
Duration                                 : 5mn 6s
Overall bit rate mode                    : Constant
Overall bit rate                         : 128 Kbps
Track name                               : Careless  Whisper
Performer                                : Kenny G
Genre                                    : Instrumental

Audio
Format                                   : MPEG Audio
Format version                           : Version 1
Format profile                           : Layer 3
Mode                                     : Joint stereo
Mode extension                           : MS Stereo
Duration                                 : 5mn 6s
Bit rate mode                            : Constant
Bit rate                                 : 128 Kbps
Channel(s)                               : 2 channels
Sampling rate                            : 44.1 KHz
Compression mode                         : Lossy
Stream size                              : 4.67 MiB (100%)

它是 MPEG 音频压缩文件,这就是为什么你不能使用 "audio/pcm" 编解码器播放它的原因,我将你的音频文件解压缩为 PCM,你的代码能够正确播放。这是 MediaInfo 通过我的文件输出的内容:

Format                                   : Wave
File size                                : 51.6 MiB
Duration                                 : 5mn 6s
Overall bit rate mode                    : Constant
Overall bit rate                         : 1 411 Kbps

Audio
Format                                   : PCM
Format settings, Endianness              : Little
Format settings, Sign                    : Signed
Codec ID                                 : 1
Duration                                 : 5mn 6s
Bit rate mode                            : Constant
Bit rate                                 : 1 411.2 Kbps
Channel(s)                               : 2 channels
Sampling rate                            : 44.1 KHz
Bit depth                                : 16 bits
Stream size                              : 51.6 MiB (100%)

如果需要播放压缩音频格式,可以考虑使用QMediaPlayer,看看here。

【讨论】:

非常感谢。我也不能用这个程序玩 flac。你也能解释一下吗? 不客气,FLAC Audio 是另一个无损压缩音频的编解码器,所以可以用来播放未压缩PCM音频的不能用来解压缩和播放弗拉克。再次考虑使用QMediaPlayer 再次非常感谢。我还打算从 USB 图像采集卡接收音频并播放。您对此有何建议? 很抱歉,我不知道您所说的 USB 图像采集卡是什么意思,如果您提供更多详细信息,也许我可以提供帮助。 . . 一个麦克风连接到 USB 图像采集卡。它在 Windows 中被检测为:“Line (2 - USB Device)”

以上是关于通过 QAudioOutput 播放 wav 文件时只有嗡嗡声的主要内容,如果未能解决你的问题,请参考以下文章

用 Qt 的 QAudioOutput 类播放 WAV 音频文件(使用了libsndfile外部库)

Qt:在 linux 上没有播放

Qt音视频开发22-音频播放QAudioOutput

QAudioOutput 快进、快退

官方认可的从 Qt5.x 下的资源播放音频的方式

如何通过在 JavaScript 中构造 AudioBuffer 来正确播放 WAV 文件?