2014-09-12 3 views
1

У меня есть несколько mp3-файлов, которые я использую для Android MediaPlayer для воспроизведения с определенных смещений.точность Android MediaPlayer seekTo

Использование seekTo(), кажется, останавливается в правильном месте. player.getCurrrentPosition() возвращает правильное смещение, но в некоторых случаях реальная позиция выключена на целых 200 мс. Файлы записываются примерно на 3 минуты, и в конце появляются неправильные смещения. Из некоторых файлов.

У меня такой же эффект, как и при использовании устройства Android 4.0.3 или 4.3 эмулятора.

У кого-нибудь есть опыт работы с "finetuning" MediaPlayer смещения? Любой опыт, почему MediaPlayer может не работать корректно с некоторыми файлами? Все они CBR, стерео, у некоторых есть частота дискретизации 22050, около 44100, разные битрейты.

Я устанавливаю смещения из другой программы и сохраняю их в mp3-тегах, а затем в случае сомнений проверяя вручную, используя Audacity. Audacity согласен с моей оценкой правильного смещения, MediaPlayer, похоже, не согласен.

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

Код ничего фантазии:

player.seekTo(start); 
player.start(); 
CountDownTimer timer = new CountDownTimer(length, 100) { 

    @Override 
    public void onTick(long millisUntilFinished) { 
     if (player!=null) setInt(R.id.nLocation, player.getCurrentPosition()); 
    } 

    @Override 
    public void onFinish() { 
     if (player!=null) { 
      if (player.isPlaying()) { 
       player.pause(); 
      } 
      setInt(R.id.nLocation, player.getCurrentPosition()); 
      player.stop(); 
      player.release(); 
      player = null; 
     } 
    } 
}; 
timer.start(); 

ответ

2

мне не удалось найти правило, почему MediaPlayer трактует смещение (seekTo) по-разному для группы файлов MP3. Например, при создании нового файла MP3 с теми же параметрами от Audacity + Lame (MPEG1, Layer III, 44100 Гц, 192 Kb/s) он работал отлично.

Однако:

  • это может быть воспроизведен - копировать файл MP3 с помощью проигрывателя Windows Media, настройки: MP3, 192 кб/с [добавлена ​​ при редактировании]
  • Я нашел обходной путь, который кажется, работает для любой записи.

фона - для того, чтобы сказать MediaPlayer играть с определенного смещения, хранить определенные данные в MP3 тегов. Я использую отдельную программу для настройки воспроизведения (в кадрах): Label A, start frame = 1000, length = 100 frames, Label B, start @ 1500 и т. Д. Теперь, когда мне нужно воспроизвести его, я читаю заголовки MP3 , определите длину кадра, например 26.12245 мс/кадр и вычислите смещение (1000 кадров будут 26122 мс).

Обходной путь заключается в том, чтобы хранить в теге MP3 также количество кадров и длину в мс (или пройти снова и подсчитать кадры). Затем при запуске MediaPlayer, сравните MediaPlayer.getDuration() (оценка MediaPlayer) с длительностью, хранящейся в теге MP3.Затем отрегулируйте размер кадра:

adjustedFrameSizeMs = realFrameSizeMs + (player.getDuration()-storedDurationMs)/storedframeCount; 

В моем случае (для файлов с неправильным смещением) скорректированная длина кадра всегда была между 26.08 и 26.09 мс (вместо 26.12245).

Я попытался попробовать, если это происходит из-за того, что Android быстрее воспроизводит запись (поэтому он оценивает «реальное время», а не время в соответствии с размером кадра и количеством кадров). Кажется, что он действительно играет быстрее. Но даже быстрее, чем его собственные оценки. Например, записи примерно 1 час:

  • моя оценка: сек
  • MediaPlayer: s (разница 4 сек)
  • Audacity: 2442 s (здесь мы не согласны)
  • Foobar: 2448 s (еще один свидетель, что согласуется с моей оценкой :-)
  • MediaPlayer, в режиме реального времени воспроизведения: s

Реальное время воспроизведения составляло 6 с (0,25%) меньше MediaPlayer собственные оценки. Другая попытка на другой выборке дала разную процентную разницу. Однако тот факт, что Audacity и Foobar не всегда соглашался с моими оценками, не позволяет мне возложить всю вину на MediaPlayer.

Смежные вопросы