gpt4 book ai didi

c++ - 如何在 sndfile 中写入 24 位 pcm 样本?

转载 作者:太空宇宙 更新时间:2023-11-04 13:43:58 27 4
gpt4 key购买 nike

我有一个用 SF_FORMAT_WAV|SF_FORMAT_FLOAT 打开的文件,但有 24 位格式的样本。Sndfile 文档说调用程序使用的数据类型和文件的数据格式不需要相同所以使用 sf_write_int() 我可以写 32 位整数样本和库转换为 float 在飞行中。但是24位呢?我是否将其打包到 int 中,然后使用 sf_write_int() 或其他方式写入。

最佳答案

您必须将输出文件的格式定义为 SF_FORMAT_WAV|SF_FORMAT_PCM_24;。当您这样做时,无论您的内部数据是什么(floatint16...),您的输出文件都将以请求的格式写入。

这是一个示例,我读取了一个包含浮点 32 位数据的文件(一个简单的 0.5 秒正弦波,FS 为 44100 Hz,使用 Audacity 设计)。我的数据也在内部 float 。然后我写一个 24 位 PCM 文件。

#include <stdio.h>
#include <stdlib.h>
#include "sndfile.h"

#define DATA_TO_CONVERT 22050

int main(void)
{
char *inFileName, *outFileName;
SNDFILE *inFile, *outFile;
SF_INFO inFileInfo, outFileInfo;

float dataBuffer[DATA_TO_CONVERT];

// Input file 32 bit float
inFileName = "sine_32.wav";
inFile = sf_open(inFileName, SFM_READ, &inFileInfo);

// Output file 24 bit
outFileName = "sine_24.wav";
outFileInfo.frames = inFileInfo.frames;
outFileInfo.samplerate = inFileInfo.samplerate;
outFileInfo.channels = inFileInfo.channels;
outFileInfo.format = SF_FORMAT_WAV|SF_FORMAT_PCM_24; // Wanted output format
outFile = sf_open(outFileName, SFM_WRITE, &outFileInfo);

sf_read_float(inFile, dataBuffer, DATA_TO_CONVERT);
sf_write_float(outFile, dataBuffer, DATA_TO_CONVERT);
sf_close(inFile);
sf_close(outFile);

// Check Output file
sf_open(outFileName, SFM_READ, &outFileInfo);
printf("Output File format : 0x%x\n", outFileInfo.format);

return 0;
}

控制台输出为:

Output File format : 0x10003

这意味着 SF_FORMAT_WAV|SF_FORMAT_PCM_24

关于c++ - 如何在 sndfile 中写入 24 位 pcm 样本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com