libsndfile库编译和使用

该文指导如何从命令行编译libsndfile库,然后在CMake项目中链接该库,最后展示了一个示例,说明如何将数字数据写入WAV音频文件,涉及音频的采样率、声道数和数据格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 下载编译

git clone https://github.com/libsndfile/libsndfile.git
sudo apt install autoconf autogen automake build-essential libasound2-dev \
  libflac-dev libogg-dev libtool libvorbis-dev libopus-dev libmp3lame-dev \
  libmpg123-dev pkg-config python
autoreconf -vif
./configure --enable-werror
make
make check
mkdir CMakeBuild && cd CMakeBuild
cmake .. && make & make install

2. CMakelist编写

find_package(SndFile REQUIRED)
target_link_libraries(my_application PRIVATE SndFile::sndfile)

3. 读取数据写入音频

#include <vector>
#include <cmath>
#include <iostream>
#include <sndfile.h>

#define SAMPLE_RATE 44100 // 采样率
#define NUM_CHANNELS 1    // 单声道

int main() {
    const char *filename = "output.wav";
    SNDFILE *file;
    SF_INFO sfinfo;
    int num_samples = 90000;

    // 假设您的90000个数字存储在名为data的std::vector中
    std::vector<float> data;

    // 将data中的数字归一化到[-1, 1]范围内(这里使用一个简单的例子将其映射到[-1, 1])
    float max_val = *std::max_element(data.begin(), data.end());
    float min_val = *std::min_element(data.begin(), data.end());
    float scale_factor = 1.0 / std::max(std::abs(max_val), std::abs(min_val));

    for (size_t i = 0; i < data.size(); i++) {
        data[i] *= scale_factor;
    }

    // 设置文件信息
    sfinfo.samplerate = SAMPLE_RATE;
    sfinfo.channels = NUM_CHANNELS;
    sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_24;

    // 打开文件进行写入
    file = sf_open(filename, SFM_WRITE, &sfinfo);
    if (!file) {
        std::cout << "无法打开文件:" << filename << std::endl;
        return 1;
    }

    // 写入数据到文件
    sf_count_t count_written = sf_writef_float(file, data.data(), num_samples);

    // 关闭文件
    sf_close(file);

    if (count_written != num_samples) {
        std::cout << "写入数据时出错!" << std::endl;
        return 1;
    }

    std::cout << "音频数据已成功写入文件:" << filename << std::endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值