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. 读取数据写入音频
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;
}