2014-09-12 42 views
1

我有一些mp3文件,我使用Android MediaPlayer來播放某些偏移量。精確的Android MediaPlayer seekTo

使用seekTo()似乎停在正確的位置。 player.getCurrrentPosition()返回正確的偏移量,但在某些情況下,實際位置關閉多達200毫秒。這些文件大約需要3分鐘的錄製時間,不正確的偏移似乎出現在最後。其中一些文件。

我試着用Android 4.0.3設備或4.3模擬器也有同樣的效果。

任何人都有「微調」的經驗MediaPlayer偏移?任何經驗爲什麼MediaPlayer可能無法正常使用某些文件?他們都是CBR,立體聲,一些採樣頻率爲22050,一些爲44100,不同的比特率。

我設置了另一個節目的偏移量並保存爲mp3標記,然後在有疑問的情況下使用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文件。例如,當用Audacity + Lame(MPEG1,Layer III,44100 Hz,192 Kb/s)創建一個具有相同參數的新MP3文件時,它可以很好地工作。

但是:

  • 這可以被複制 - 撕裂使用的Windows Media Player,設置MP3文件:MP3,192 kb/s的[添加當編輯]
  • 我找到了變通方法,似乎適用於任何錄音。

背景 - 爲了告訴MediaPlayer的從某些玩偏移,我存儲在MP3標籤某些數據。我使用一個單獨的程序來設置回放(以幀爲單位):標籤A,開始幀= 1000,長度= 100幀,標籤B,開始@ 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的:秒(4秒差)
  • Audacity的:2442秒(這裏,我們是在分歧)
  • Foobar的:2448秒(另一名證人,與我的估計:-)
  • 的MediaPlayer,真正發揮時間相一致:小號

真實播放時間比自己估計的MediaPlayer小6秒(0.25%)。對不同樣品的另一次嘗試給出了相同的百分比差異。然而,AudacityFoobar並不總是與我的估計一致,不讓我把所有的責任放在MediaPlayer上。