Android MediaPlayer seekTo的精度

时间:2014-09-12 16:52:50

标签: android audio android-mediaplayer

我有许多mp3文件,我使用Android MediaPlayer 来播放某些偏移量。

使用 seekTo()似乎停在正确的位置。 player.getCurrrentPosition()返回正确的偏移量,但在某些情况下,实际位置关闭的时间长达200 ms。这些文件的录制时间约为3分钟,并且最后会出现不正确的偏移量。一些文件。

我尝试使用Android 4.0.3设备或4.3模拟器时效果相同。

任何人都有“微调” 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();

1 个答案:

答案 0 :(得分:2)

我无法找到规则为什么 MediaPlayer 为一组MP3文件不同地解释偏移量( seekTo )。例如,当从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 ms /帧并计算偏移量(1000帧将为26122 ms)。

解决方法是在MP3标签中存储帧数和长度(以ms为单位)(或再次传递并计算帧数)。然后在启动 MediaPlayer 时,将 MediaPlayer.getDuration()(MediaPlayer估计值)与存储在MP3标签中的持续时间进行比较。然后调整帧大小:

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

在我的情况下(对于偏移量不正确的文件),调整后的帧长度始终介于26.08和26.09 ms之间(而不是26.12245)。

我试图尝试看看这是否是因为Android更快地播放录音(因此它估计“实时”,而不是根据帧大小和帧数计算的时间)。它似乎真的打得更快。但比自己的估计更快。例如约1小时的录音:

  • 我的估计: 2448 s
  • MediaPlayer: 2444 s(4秒差异)
  • Audacity:2442 s(我们在意见不一致)
  • Foobar:2448秒(另一位证人同意我的估计: - )
  • MediaPlayer,实际播放时间: 2438 s

真正的游戏时间比 MediaPlayer 自己估计的时间少6秒(0.25%)。对不同样品的另一次尝试给出了相同的百分比差异。然而, Audacity Foobar 的事实并不总是与我的估计一致,并不能让我把所有责任归咎于MediaPlayer。