Как записать 24-битные сэмплы в sndfile?

У меня есть файл, который открывается с SF_FORMAT_WAV|SF_FORMAT_FLOAT но есть образцы в 24-битном формате.
Документация Sndfile говорит, что тип данных, используемый вызывающей программой, и формат данных файла не должны быть одинаковыми, поэтому использование sf_write_int() я могу написать 32-битные целочисленные сэмплы и конвертировать библиотеки в плавающие на лету.
Но как насчет 24 бит. Я упаковываю это в int а затем написать с помощью sf_write_int() или что-то другое.

0

Решение

Должно быть возможно просто масштабировать его на 256, сделать его 32-битным и использовать sf_write_int, Если вы ожидаете, что libsndfile сделает что-то для вас, то это будет плохой идеей, но, насколько я могу судить, этого нет в описании его работы.

0

Другие решения

Вы должны определить формат вашего выходного файла, который будет 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,

0

По вопросам рекламы [email protected]