У меня есть файл, который открывается с 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
…), ваш выходной файл будет записан в запрошенном формате.
Вот пример, где я читаю файл (простой 0,5-секундный синус при FS 44100 Гц, разработанный с 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;
}
Консольный вывод:
Формат выходного файла: 0x10003
Что значит SF_FORMAT_WAV|SF_FORMAT_PCM_24
,