【问题标题】:precision of Android MediaPlayer seekToAndroid MediaPlayer seekTo 的精度
【发布时间】:2015-03-06 13:29:39
【问题描述】:

我有许多 mp3 文件,我使用 Android MediaPlayer 从特定偏移量播放。

使用 seekTo() 似乎停止在正确的位置。 player.getCurrrentPosition() 返回正确的偏移量,但在某些情况下,实际位置会关闭多达 200 毫秒。这些文件大约需要 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();

【问题讨论】:

    标签: android audio android-mediaplayer


    【解决方案1】:

    我没有找到为什么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 标签中存储帧数和长度(以毫秒为单位)(或再次通过并计算帧数)。然后在启动MediaPlayer时,比较MediaPlayer.getDuration()(MediaPlayer估计)与存储在MP3标签中的持续时间。然后调整帧大小:

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

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

    我试图看看这是否是因为 Android 播放录制的速度更快(所以它估计“实时”,而不是根据帧大小和帧计数的时间)。看来它确实播放得更快。但甚至比它自己的估计还要快。比如1小时左右的录音:

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

    实际播放时间比 MediaPlayer 自己的估计短 6 秒 (0.25%)。对不同样品的另一次尝试给出了相同的百分比差异。然而,AudacityFoobar 并不总是符合我的估计,这并不能让我把所有的责任都归咎于 MediaPlayer。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多