В проекте 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);
Пока это действительно хорошо работает, но выглядит не очень хорошо …
Мой вопрос: Есть ли лучший способ открыть и искать в аудиофайле, который в данный момент загружается?
Спасибо за вашу помощь.
Задача ещё не решена.
Других решений пока нет …