В моем приложении воспроизводится mp3-файл, передаваемый из сети, некоторые mp3-файлы имеют странное поведение: mediaPlayer.getCurrentPosition() больше, чем mediaPlayer.getDuration() в конце, примерно на 3 секунды.

Файлы mp3 имеют CBR.

Что может быть причиной этого?

7
wong2 24 Апр 2017 в 13:38

2 ответа

Лучший ответ

Наконец-то решили проблему, конвертировав mp3-файлы, вот команду, которую я использую:

lame --mp3input -t -m s -b 128 --cbr input.mp3 output.mp3

5
wong2 5 Май 2017 в 09:08

Есть несколько причин, по которым вы можете получить такое поведение.

Сначала кажется, что у людей были лучшие результаты при использовании mp3-файлов именно в 44100Hz, потому что, очевидно, класс MediaPlayer принимает это значение и соответственно масштабирует время, делая странные значения для файлов, не использующих эту выборку.

Вам также необходимо проверить режим ваших каналов и попробовать использовать Joint Stereo или принудительное L / R Stereo. Соединение должно быть по умолчанию, но ваши файлы могли быть плохо закодированы, поэтому стоит попробовать. Интересно отметить, что Forced L / R Stereo может потерять качество при том же битрейте, что и Joint.

Также было бы полезно проверить выходные данные soxi, который является частью sox пакет (вы также можете сделать это с помощью ffmpeg), который даст вам количество каналов, частоту дискретизации, битрейт и количество каналов.

Также вам может потребоваться проверить необработанное содержимое файла mp3, если вы поработали с ним, используя какое-либо приложение, на наличие содержимого XML мусора, которое могло быть вставлено во время экспорта.

Если у вас есть возможность изменить потоковые mp3-файлы (что звучит так же, как и вы, поскольку вы можете определить битрейт), это то, что я попробую в первую очередь. Если это больше похоже на пользовательскую загрузку, возможно, вам стоит взглянуть на другое решение, например, ExoPlayer которая имеет несколько тысяч звезд и активно развивается. Он все еще оборачивает API MediaPlayer, но стоит попробовать.

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

2
Balthazar 8 Май 2017 в 15:51
43585889