[英]How to write 24 bit pcm samples in sndfile?
我有使用SF_FORMAT_WAV|SF_FORMAT_FLOAT
打開的文件,但具有24位格式的樣本。 Sndfile文檔說,調用程序使用的數據類型和文件的數據格式不必相同,因此使用sf_write_int()
可以編寫32位整數樣本,並且庫轉換可以即時進行浮點運算。 但是24位呢? 我是否將其打包為int
,然后使用sf_write_int()
或其他方式編寫。
應該可以將其縮放至256以使其成為32位並使用sf_write_int
。 如果您期望libsndfile為您做任何抖動或某事,那將是個壞主意,但據我所知,這不在其職務說明中。
您必須將輸出文件的格式定義為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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.