Я пишу приложение для Android, которое записывает звук с помощью Obeo и записывает волновой файл с помощью libsndfile.
Я проверил правильность данных аудиопотока, отредактировав Subchunk2Size, который указывает размер части данных файла. Это создает воспроизводимый аудиофайл, который говорит мне, что данные записываются, за исключением этой одной переменной.
Итак, вопрос: почему libsndfile не записывает переменную subchunksize (размер данных) в заголовок волны?
Я открываю файл как RDWR, потому что звук должен быть добавлен (когда пользователь делает паузу или останавливает звук, он может продолжать запись в тот же файл).
Вот код открытия файла:
Примечание: указатель файла является глобальным, я включил его туда только для того, чтобы показать, что это за структура.
SF_INFO info;
info.channels = channel_count;
info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
info.samplerate = sample_rate;
// info.seekable = SF_TRUE;
SNDFILE * file = sf_open(url.c_str(), SFM_RDWR, &info);
Obeo возвращает данные с помощью обратных вызовов. Это мой обратный вызов, который вызывается всякий раз, когда аудиоустройство заполняет указанный буфер.
DataCallbackResult Recorder::onAudioReady(
oboe::AudioStream * stream, void * audio_data, int32_t num_of_frames){
// __android_log_print(ANDROID_LOG_INFO,
// "AudioEngine", "Callback!.");
sf_seek(file, 0, SEEK_END);
sf_writef_short(file, reinterpret_cast<const short*>(audio_data), num_of_frames);
return DataCallbackResult::Continue;
}
Позже в деконструкции класса я звоню:
sf_write_sync(file);
sf_close(file);
Это шестнадцатеричный код двоичных данных, записанных Libsndfile.
52494646 08000000 57415645 666D7420 10000000 03000200 44AC0000 20620500 08002000 66616374 04000000 00000000 (data) 64617461 (subchunksize) 00000000
Мы очень ценим любую информацию от пользователей, которые использовали libsndfile на Linux или Android!
Спасибо.