Аудиозапись LibSNDfile / Obeo Android неправильно записывает заголовок

Я пишу приложение для Android, которое записывает звук с помощью Obeo и записывает волновой файл с помощью libsndfile.

Я проверил правильность данных аудиопотока, отредактировав Subchunk2Size, который указывает размер части данных файла. Это создает воспроизводимый аудиофайл, который говорит мне, что данные записываются, за исключением этой одной переменной.

Итак, вопрос: почему libsndfile не записывает переменную subchunksize (размер данных) в заголовок волны?

Структура заголовка файла Wave

Я открываю файл как 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!

Спасибо.


person Seth    schedule 26.02.2020    source источник


Ответы (1)


Я считаю, что вам нужно указать свойство frames для info struct, которое вы используете. Это позволяет файлу точно знать, насколько большим должен быть файл, когда он выделяется.

i.e.

SF_INFO info;
info.samplerate = SAMPLE_RATE ;
info.frames     = SAMPLE_COUNT ; // 44100 * 4 (4 seconds of 44.1kHz sample rate)
info.channels       = 2 ;
info.format     = (SF_FORMAT_WAV | SF_FORMAT_PCM_24) ;

Это показано в одном из примеров libsndfile. .

person WoodyDev    schedule 29.02.2020