如何在sndfile中写入24位pcm样本



我有一个用SF_FORMAT_WAV|SF_FORMAT_FLOAT打开的文件,但有24位格式的样本。Sndfile-docs表示,调用程序使用的数据类型和文件的数据格式不需要相同,因此使用sf_write_int() i可以写入32位整数样本,并将库转换为浮动。但是24比特呢。我是不是把它打包到int中,然后用sf_write_int()或其他东西写。

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

这里有一个例子,我读取了一个带有浮点32位数据的文件(用Audacity设计的44100Hz FS下的简单0.5秒正弦)。我的数据也是内部浮动的。然后我写了一个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%xn", outFileInfo.format);
  return 0;
}

控制台输出为:

输出文件格式:0x10003

意思是SF_FORMAT_WAV|SF_FORMAT_PCM_24

应该可以将其缩放256,使其成为32位并使用sf_write_int。如果你希望libsndfile为你做任何抖动或其他事情,这将是一个坏主意,但据我所知,这不在它的工作描述中。

最新更新