Экспорт волнового файла поврежден

Я написал две функции, которые должны экспортировать аудио-плавающий буфер в .wav-файл, но у меня проблемы с воспроизведением экспортированного файла. Audacity воспроизводит его так, как должно (звучит точно так же, как в моем приложении), однако, Ableton (DAW-software), кажется, неправильно интерпретирует некоторую часть wav, поэтому он звучит действительно искаженным. (как искажение-эффект)

Я полагаю, что каким-то образом в поле допускается неправильная глубина выборки (меньшая), поэтому действительные выборки выходят за пределы.

У меня есть две функции, одна создает int32_t буфер из двух float-буферов (смешивание левого и правого в один буфер), другая функция записывает .wav-файл, включая чанк формата и т. д. Я предполагаю, что где-то есть проблема.

члены класса / структуры

// static I use in the export function
static const int FORMAT_PCM = 1;
static const int CHANNEL_COUNT = 2;    // fix stereo
static const int BYTES_PER_SAMPLE = 4; // fix bytes per sample, 32bit audio

// a function I found in the internet, helps writting the bytes to the file
template <typename T>
static void write(std::ofstream& stream, const T& t) {
stream.write((const char*)&t, sizeof(T));
};

// used "structure" to store the buffer
class StereoAudioBuffer {
public:
StereoAudioBuffer(int length) : sizeInSamples(2*length){
samples = new int32_t[2*length];
};
~StereoAudioBuffer() {delete samples;};

int32_t *samples;
const int sizeInSamples;
};

функция преобразования

StereoAudioBuffer* WaveExport::convertTo32BitStereo(
float *leftSamples,
float*rightSamples,
int length)
{
StereoAudioBuffer *buffer = new StereoAudioBuffer(length);
float max = 0;

// find max sample
for(int i = 0; i < length; i++) {
if(abs(leftSamples[i]) > max) {
max = abs(leftSamples[i]);
}
if(abs(rightSamples[i]) > max) {
max = abs(rightSamples[i]);
}
}// normalise and scale to size(int32_t)

float factor = 2147483000.0f / max;

for(int i = 0; i < length; i++) {
buffer->samples[2*i] = leftSamples[i] * factor ;
buffer->samples[2*i+1] = rightSamples[i] * factor;
}
return buffer;
}

функция экспорта (часть этого кода взята из интернета, к сожалению, я не могу найти источник больше

void WaveExport::writeStereoWave(
const char *path,
StereoAudioBuffer* buffer,
int sampleRate)
{
std::ofstream stream(path, std::ios::binary);

// RIFF
stream.write("RIFF", 4);

// FILE SIZE
write<int>(stream, 36 + buffer->sizeInSamples * BYTES_PER_SAMPLE); // 32 bits -> 4 bytes

// WAVE
stream.write("WAVE", 4);

// FORMAT CHUNK
stream.write("fmt ", 4);

write<int>(stream, 16);

write<short>(stream, FORMAT_PCM);                                       // Format
write<short>(stream, CHANNEL_COUNT);                                    // Channels
write<int>(stream, sampleRate);                                         // Sample Rate
write<int>(stream, sampleRate * CHANNEL_COUNT * BYTES_PER_SAMPLE);      // Byterate
write<short>(stream, CHANNEL_COUNT * BYTES_PER_SAMPLE);                 // Frame size
write<short>(stream, 8 * BYTES_PER_SAMPLE);                             // Bits per sample

int dataChunkSize = buffer->sizeInSamples * BYTES_PER_SAMPLE;
// SAMPLES
stream.write("data", 4);
stream.write((const char*)&dataChunkSize, 4);
stream.write((const char*)buffer->samples, BYTES_PER_SAMPLE*buffer->sizeInSamples);
}

Кто-нибудь знает, как писать файлы .wav и, может быть, может сказать мне, что я сделал неправильно или пропустил?
Спасибо!

0

Решение

Там не было никаких проблем. Я использовал 32-битный .wav, который просто не поддерживался в приложении, я использовал для воспроизведения.

Я изменил функции экспорта, чтобы использовать int16_t, 16-битная глубина, и он отлично работает.

0

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


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