libogg libvorbis: правильный способ поиска в загрузке ogg файла - PullRequest
0 голосов
/ 02 ноября 2018

В проекте Android я использую библиотеки libogg и libvorbis для извлечения аудиосэмплов на лету из файла ogg (чтобы я мог обработать их и перенаправить на аудиовыход), используя этот пример, Это работает хорошо, и я также могу искать в файле без проблем.

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

Вот как я открываю файл ogg (для простоты я его сократил):

OggVorbis_File vorbisFile;
FILE *audioFile = fopen("/local/path/to/the/file.ogg", "r");
ov_open_callbacks(audioFile, &vorbisFile, NULL, 0, OV_CALLBACKS_NOCLOSE);
if (ov_seekable(&vorbisFile) == 0)
{
    // file not seekable (never happened, even if currently downloading):
    exit(1);
}

А вот как я ищу в ogg-файле:

ov_pcm_seek(&vorbisFile, seekPosition);

Вот что я нашел: После некоторых тестов я решил проверить длину файла при вызове функции ov_pcm_seek(), благодаря ov_pcm_total(&vorbisFile, -1). И я обнаружил, что размер, возвращаемый этой функцией, всегда равен размеру файла, когда он был впервые открыт. Так что же происходит, что, когда я ищу в файле позицию, которой не было к моменту открытия файла, она не работает.

Вот мое (уродливое?) Решение: Единственное решение, которое я получил до сих пор, - это непосредственно перед поиском, в основном, закрыть и снова открыть аудиофайл:

ov_clear(&vorbisFile);
fclose(audioFile);
audioFile = fopen(cheminFichier.c_str(), "r");
ov_open_callbacks(audioFile, &vorbisFile, NULL, 0, OV_CALLBACKS_NOCLOSE);

Пока что все работает хорошо, но выглядит не очень ...

Мой вопрос: Есть ли лучший способ открывать и искать аудиофайл, который в данный момент загружается?

Спасибо за вашу помощь.

...