【问题标题】:Playing ulaw file with QAudioOutput使用 QAudioOutput 播放 ulaw 文件
【发布时间】:2014-06-20 07:34:08
【问题描述】:

我正在尝试设置一个简单的工作示例来播放 .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);
 }

【问题讨论】:

    标签: qt audio


    【解决方案1】:

    您的问题标题表明您希望播放 u-law 音频,即对数 PCM。然而,这条线

    format.setCodec("audio/pcm");
    

    初始化线性 PCM 的播放。 2 种可能的解决方案:

    1. 使用适当的日志 PCM 编解码器初始化播放。文档报告称QAudioDeviceInfo::supportedCodecs() 将返回支持的编解码器列表。
    2. 将日志 PCM 样本实时转换为线性 PCM。它的影响非常小,可以使用查找表来执行。

    【讨论】:

    • 感谢您的回答!!如果我使用 QAudioDeviceInfo::supportedCodecs() 我只会得到“audio/pcm”,我是编程新手,我不知道如何将日志 PCM 样本实时转换为线性 PCM。你能给我一个提示吗。谢谢!!
    • 这个源代码可能有一些用处:git.videolan.org/?p=ffmpeg.git;a=blob;f=libavcodec/…
    • 您知道如何播放转换后的数据吗?我尝试使用 QAudioOutput::start () 但我得到“从 qint16{aka short int} 到“IODevice”的无效转换”
    • 我不精通qt。这听起来应该是一个单独的 Stack Overflow 问题。
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2016-04-24
    相关资源
    最近更新 更多