在单通道中播放单声道wav文件

时间:2016-02-13 14:55:44

标签: c++ audio

我只能通过一个频道播放声音。 目前我已经从单声道wav文件读取数据,通过libsndfile,并将其写为立体声wav文件,用零交替数据(因此一个通道必须是纯静音)。然后我试图通过QAudioOutput播放它。一个频道响亮,但两个频道仍然有声音。通过媒体播放器播放文件会产生同样的效果。我做错了吗?

    SNDFILE *sf;
    SF_INFO info;
    int num_channels;
    int num, num_items;
    int f,sr,c;

    /* Open the WAV file. */
    info.format = 0;
    sf = sf_open("file.wav",SFM_READ,&info);
    f = info.frames;
    sr = info.samplerate;
    c = info.channels;
    num_items = f*c;
    QVector<int> buf;
    buf.resize(num_items);
    num = sf_read_int(sf,buf.data(),num_items);


    QVector<int> out;
    for(uint j = 0; j < buf.size(); j++)
    {
        out.push_back(buf[j]);
        out.push_back(0);
    }
    sf_close(sf);

    SF_INFO out_info = info;
    out_info.channels = 2;
    sf = sf_open("file2.wav",SFM_WRITE,&out_info);
    sf_write_int(sf,out.data(),num_items*2);
    sf_close(sf);

    QFile sourceFile;
    QAudioOutput* audio;
    sourceFile.setFileName("file2.wav");
    sourceFile.open(QIODevice::ReadOnly);

    QAudioFormat format;
    // Set up the format, eg.
    format.setSampleRate(out_info.samplerate);
    format.setChannelCount(out_info.channels);
    format.setSampleSize(8);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);

    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
    audio = new QAudioOutput(format, 0);
    audio->start(&sourceFile);

1 个答案:

答案 0 :(得分:0)

问题在于音频驱动程序。 Creative CMSS 3D导致声音泄漏。因此,这样的wav文件似乎更容易在一个频道中播放声音。

UPD:将该方法更改为BASS库,允许设置输出通道标志。如果有任何3D模拟驱动程序设置,它仍然无法工作。