我有许多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();
答案 0 :(得分:2)
我无法找到规则为什么 MediaPlayer 为一组MP3文件不同地解释偏移量( seekTo )。例如,当从Audacity + Lame(MPEG1,Layer III,44100 Hz,192 Kb / s)创建具有相同参数的新MP3文件时,它可以完美地工作。
但是:
背景 - 为了告诉 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小时的录音:
真正的游戏时间比 MediaPlayer 自己估计的时间少6秒(0.25%)。对不同样品的另一次尝试给出了相同的百分比差异。然而, Audacity 和 Foobar 的事实并不总是与我的估计一致,并不能让我把所有责任归咎于MediaPlayer。