【问题标题】:How to write 24 bit pcm samples in sndfile?如何在 sndfile 中写入 24 位 pcm 样本?
【发布时间】:2014-10-31 15:53:01
【问题描述】:

我有用SF_FORMAT_WAV|SF_FORMAT_FLOAT 打开的文件,但有24 位格式的样本。 Sndfile 文档说调用程序使用的数据类型和文件的数据格式不需要相同,因此使用 sf_write_int() 我可以编写 32 位整数样本和库转换为动态浮点数。 但是 24 位呢?我是否将其打包到int 中,然后使用sf_write_int() 或其他内容编写。

【问题讨论】:

    标签: c++ libsndfile


    【解决方案1】:

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

    这是一个示例,其中我读取了一个带有浮点 32 位数据的文件(一个简单的 0.5 秒正弦,FS 为 44100 Hz 设计,采用 Audacity 设计)。我的数据也在内部浮动。然后我写了一个 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 2014-06-25
        • 1970-01-01
        相关资源
        最近更新 更多