pcm音频音量调节

PCM16le双声道数据中左声道和右声道的采样值是间隔存储的。samples=44100Hz,采样位数是16bit,每个声道的一个采样值占用2Byte。“LE”代表Little Endian,代表2 Byte采样值的存储方式为高位存在高地址中。
 

int CTransPic::simplest_pcm16le_halfvalueleft(char* url){
    ifstream infptr;
    infptr.open(url, ios::in | ios::binary);
    ofstream hflfptr;
    hflfptr.open("halfvalueleft.pcm", ios::out | ios::binary);

    int cnt = 0;

    unsigned char* halfbuf = (unsigned char*)malloc(4);
    while (!infptr.eof())
    {
        short *samplenum = NULL;
        infptr.read((char*)halfbuf, 4);
        samplenum = (short*)halfbuf;
        *samplenum = (*samplenum) / 2;
        hflfptr.write((const char*)samplenum, 2);
        hflfptr.write((const char*)halfbuf + 2, 2);
        ++cnt;
    }
    cout << cnt << endl;
    free(halfbuf);
    infptr.close();
    hflfptr.close();

    return 0;
}
 

### 使用 QT 播放 PCM 音频文件并实现音量可调功能 在 Qt 中可以利用 `QAudioOutput` 类来播放 PCM 音频数据,并通过设置音量属性来控制播放音量。以下是具体方法: #### 创建 QAudioOutput 对象 首先,创建一个 `QAudioOutput` 对象实例化所需的音频设备和格式配置。 ```cpp #include <QAudioOutput> #include <QIODevice> // 定义音频格式 QAudioFormat format; format.setSampleRate(44100); // 设置采样率 (Hz) format.setChannelCount(2); // 设置声道数 (立体声) format.setSampleSize(16); // 设置样本大小 (位) format.setCodec("audio/pcm"); // 设置编码方式为 PCM format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); // 获取可用的音频输出设备 QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); if (!info.isFormatSupported(format)) { qWarning() << "Specified audio format is not supported."; } // 初始化 QAudioOutput 和输出设备 QAudioOutput *audioOutput = new QAudioOutput(format); QIODevice *outputDevice = audioOutput->start(); // 开始播放 ``` 上述代码定义了一个适合大多数 PCM 文件的标准音频格式[^3]。如果目标 PCM 数据具有不同的参数,则需调整这些值以匹配实际需求。 #### 加载 PCM 数据 加载本地存储中的 PCM 文件到内存缓冲区中以便后续处理。 ```cpp #include < QFile> #include <QBuffer> QFile pcmFile("path_to_pcm_file.pcm"); if (!pcmFile.open(QIODevice::ReadOnly)) { qCritical() << "Failed to open PCM file"; } QBuffer buffer(&pcmData); buffer.open(QBuffer::ReadWrite); ``` 此部分假设 PCM 文件路径已知且能够成功打开。注意确保文件确实是以原始 PCM 编码保存的数据流。 #### 将 PCM 数据发送至音频输出接口 将读取到的内容写入之前初始化好的 I/O 设备对象完成声音回放操作。 ```cpp connect(audioOutput, &QAudioOutput::stateChanged, [&](QAudio::State state){ if(state == QAudio::IdleState){ outputDevice->write(pcmFile.readAll()); // 当前片段结束时继续下一帧 } }); ``` 这里采用信号槽机制监听状态变化事件,在每次当前队列为空闲(`Idle`)状态下追加新一批待播送资料进去形成连续不间断效果[^4]。 #### 控制音量 最后一步就是加入对于整体响度水平增减的支持能力了。 ```cpp double volumeLevel = 0.5; // 初始默认一半强度 audioOutput->setVolume(volumeLevel); void adjustVolume(double level){ audioOutput->setVolume(level); } ``` 以上函数允许动态改变正在运行期间内的听觉感知强弱程度而无需重新构建整个流程结构即可即时生效修改后的设定数值[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步基

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值