我的文件以SF_FORMAT_WAV|SF_FORMAT_FLOAT
打开但是有24位格式的样本。
Sndfile文档说调用程序使用的数据类型和文件的数据格式不需要相同,所以使用sf_write_int()
我可以写32位整数样本,库转换为浮动。
但是24位呢。我将其打包到int
然后使用sf_write_int()
或其他内容进行编写。
答案 0 :(得分:0)
应该可以将其缩放256以使其成为32位并使用sf_write_int
。如果您期望libsndfile为您做任何抖动或某事,那么这将是一个坏主意,但据我所知,它不在其职位描述中。
答案 1 :(得分:0)
您必须将输出文件的格式定义为SF_FORMAT_WAV|SF_FORMAT_PCM_24;
。执行此操作时,无论您的内部数据是什么(float
,int16
...),您的输出文件都将以请求的格式写入。
这是一个示例,其中我读取了一个文件(带有Audacity设计的44100 Hz FS的0.5秒正弦),该文件具有浮点32位数据。我的数据也在内部浮动。然后我写了一个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;
}
控制台输出为:
输出文件格式:0x10003
意思是SF_FORMAT_WAV|SF_FORMAT_PCM_24
。