C++ 如何在SND文件中写入24位pcm样本?

C++ 如何在SND文件中写入24位pcm样本?,c++,libsndfile,C++,Libsndfile,我有一个文件是用SF_FORMAT_WAV | SF_FORMAT_FLOAT打开的,但有24位格式的样本。 Sndfile docs表示,调用程序使用的数据类型和文件的数据格式不需要相同,因此使用sf\u write\u int()我可以动态写入32位整数样本,并将库转换为float。 但是24位呢。我是否将其打包到int中,然后使用sf\u write\u int()或其他方法进行写入。应该可以将其缩放256,使其为32位,然后使用sf\u write\u int。如果您希望libsndfi

我有一个文件是用
SF_FORMAT_WAV | SF_FORMAT_FLOAT
打开的,但有24位格式的样本。 Sndfile docs表示,调用程序使用的数据类型和文件的数据格式不需要相同,因此使用
sf\u write\u int()
我可以动态写入32位整数样本,并将库转换为float。
但是24位呢。我是否将其打包到
int
中,然后使用
sf\u write\u int()
或其他方法进行写入。

应该可以将其缩放256,使其为32位,然后使用
sf\u write\u int
。如果您希望libsndfile为您执行任何抖动或其他操作,这将是一个坏主意,但据我所知,这并不在其工作描述中。

您必须将输出文件的格式定义为
SF\u format\u WAV | SF\u format\u PCM\u 24。执行此操作时,无论内部数据是什么(
float
int16
…),输出文件都将以请求的格式写入

下面是一个例子,我读取一个文件(一个简单的0.5秒正弦,FS为44100 Hz,使用Audacity设计),其中包含浮点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;
}
#包括
#包括
#包括“sndfile.h”
#定义数据\u到\u转换22050
内部主(空)
{
字符*填充名,*输出名;
SND文件*填充文件,*输出文件;
SF_信息填充信息、外流信息;
浮点数据缓冲[数据转换];
//输入文件32位浮点
inFileName=“sine_32.wav”;
inFile=sf_打开(inFileName、SFM_读取和inFileInfo);
//输出文件24位
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;//需要输出格式
outFile=sf_打开(outFileName、SFM_写入和outFileInfo);
sf_读取浮点数(填充、数据缓冲、数据到浮点数转换);
sf_写入浮点数(输出文件、数据缓冲、数据到浮点数转换);
sf_关闭(填充);
sf_关闭(输出文件);
//检查输出文件
sf_打开(输出文件名、SFM_读取和输出文件信息);
printf(“输出文件格式:0x%x\n”,outFileInfo.format);
返回0;
}
控制台输出为:

输出文件格式:0x10003

这意味着
SF_格式| SF_格式"PCM_24