gpt4 book ai didi

android - Android MediaPlayer seekTo 的精度

转载 作者:行者123 更新时间:2023-11-29 00:17:02 27 4
gpt4 key购买 nike

我有许多 mp3 文件,我将它们与 Android MediaPlayer 一起使用以从特定偏移量播放。

使用 seekTo() 似乎会停在正确的位置。 player.getCurrrentPosition() 返回正确的偏移量,但在某些情况下,实际位置会偏离多达 200 毫秒。这些文件大约有 3 分钟的记录值(value),不正确的偏移量似乎出现在最后。一些文件。

我尝试使用 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();

最佳答案

我没能找到 MediaPlayer 以不同方式解释一组 MP3 文件的偏移量 (seekTo) 的规则。例如,当使用 Audacity+Lame 的相同参数(MPEG1,第三层,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 标签中存储帧计数和以毫秒为单位的长度(或再次通过并计算帧数)。然后当启动 MediaPlayer 时,将 MediaPlayer.getDuration()(MediaPlayer 估计值)与存储在 MP3 标签中的持续时间进行比较。然后调整边框大小:

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

在我的例子中(对于偏移量不正确的文件)调整后的帧长度始终在 26.08 到 26.09 毫秒之间(而不是 26.12245)。

我试着看看这是否是因为 Android 播放录音的速度更快(所以它估计“实时”,而不是根据帧大小和帧数估计的时间)。似乎它确实播放得更快。但比它自己的估计还要快。例如一段约 1 小时的录音:

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

实际播放时间比 MediaPlayer 自己的估计少 6 秒 (0.25%)。对不同样本的另一次尝试给出了相同的百分比差异。然而,AudacityFoobar 并不总是与我的估计一致,这并不能让我把所有的责任都推到 MediaPlayer 身上。

关于android - Android MediaPlayer seekTo 的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com