Точный поиск в MP3-файлах на Android - PullRequest
0 голосов
/ 12 декабря 2018

Я создаю приложение, в котором важно иметь точный поиск в файлах MP3.

В настоящее время я использую ExoPlayer следующим образом:

public void playPeriod(long startPositionMs, long endPositionMs) {

    MediaSource mediaSource = new ClippingMediaSource(
            new ExtractorMediaSource.Factory(mDataSourceFactory).createMediaSource(mFileUri),
            startPositionMs * 1000,
            endPositionMs * 1000
    );

    mExoPlayer.prepare(mediaSource);
    mExoPlayer.setPlayWhenReady(true);

}

В некоторых случаях при таком подходе смещения составляют 1-3 секунды относительно ожидаемого времени воспроизведения.

Я обнаружил эту проблему на github ExoPlayer .Похоже, что это внутреннее ограничение ExoPlayer с форматом Mp3, и оно не будет исправлено.

Я также нашел этот вопрос , который, по-видимому, предполагает, что такая же проблема существует в родном Android-устройстве MadiaPlayerи MediaExtractor.

Есть ли способ выполнить точный поиск в локальных (например, на устройстве) файлах Mp3 на Android?Я более чем готов принять любой взлом или обходной путь.

1 Ответ

0 голосов
/ 12 декабря 2018

MP3-файлы по своей природе не доступны для поиска.Они не содержат меток времени.Это просто серия кадров MPEG, одна за другой.Это делает это сложно.Существует два метода поиска MP3, каждый из которых имеет некоторые компромиссы.

Самый распространенный (и самый быстрый) метод - считывание битрейта из заголовка первого кадра (или, возможно, среднего битрейта из первых нескольких кадров).заголовки), возможно, 128к.Затем возьмите длину в байтах всего файла, разделите ее на этот битрейт, чтобы оценить длительность файла.Затем позвольте пользователю искать в файле.Если они ищут 1:00 в файле 2:00, разделите размер файла в байтах до отметки 50% и «иголку» в поток.Читайте файл, пока не появится слово синхронизации для следующего заголовка кадра, а затем начните декодирование.

Как вы можете себе представить, этот метод не точен.В лучшем случае вы будете в среднем в половине кадра от цели.С размерами кадра 576 образцов, это довольно точно.Тем не менее, существуют проблемы с вычислением точки падения иглы в первую очередь.Наиболее распространенная проблема заключается в том, что теги ID3 и такие добавляют размер файла, отбрасывая расчеты размера.Более серьезная проблема - файл с переменным битрейтом (VBR).Если у вас есть музыка, закодированная с помощью VBR, и начало дорожки беззвучно или иным образом легко кодируется, начало может быть 32 кбит / с, тогда как одна секунда может быть 320 кбит / с.10-кратная ошибка в расчете длительности файла!

Второй метод - декодировать весь файл в необработанные сэмплы PCM.Это означает, что вы можете гарантировать поиск с точностью до выборки, но вы должны декодировать по крайней мере до точки поиска.Если вы хотите установить правильное время для полной дорожки, вы должны декодировать весь файл.Около 20 лет назад это было мучительно медленно.Поиск трека займет почти столько же времени, сколько и прослушивание трека до той точки, к которой вы стремились!В наши дни для коротких файлов вы, вероятно, можете декодировать их так быстро, что это не имеет большого значения.

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

...