2014-09-12 129 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上。