【问题标题】:Why is my MediaPlayer audio distorted/clipping?为什么我的 MediaPlayer 音频失真/削波?
【发布时间】:2019-01-04 15:15:16
【问题描述】:

当我在我的应用程序中播放声音时,它会变得很短且失真。这是一段录音:recording

这是上传到 android studio 的声音文件:success sound cue

这是从 .raw 中调用声音的函数

 public void playCorrectAnswerSound() {
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.correct);
        mp.start();
    }

我是这样称呼它的:

Thread t = new Thread(){
            public void run(){
                playCorrectAnswerSound();
            }
        };
        t.start()

这是我第一次调试与声音相关的问题。我不知道这篇文章中还包括什么,所以如果您需要更多信息,请说出来。

编辑:我被要求记录更多的失真。 Here it is。另外我应该说,经过更多测试,我的物理设备没有声音失真,而声音失真出现在 3 个不同的模拟器上。

【问题讨论】:

  • 是的,我也喜欢。它消失了!
  • 这很有趣。由于您的设备在播放声音时做了太多工作,我倾向于“MediaPlayer 缓冲区不足”。如果您可以再上传 2-3 段坏音频的录音,我会看看它们(我很难仅用一个录音来证明我的缓冲区饥饿理论)。也可以检查 logcat 是否有任何与媒体播放器相关的消息。
  • 1.) 是的,我只想再听 3 遍。它可以是一个录音,只需播放声音 3 次。 2.) 我不确定;只需过滤“媒体播放器”。
  • 我会看看this question,还有this answer(这表明一种可能有效的技术)。可能只是你的模拟器太慢了,所以你不必在生产中担心它。您可以使用模拟器的媒体播放器应用测试您的 .mp3,以增加信心。
  • 关于多线程的事情 - 我相信你的应用程序可能没有过度工作,但很明显,根据你发布的代码,它是多线程的。对于这个用例来说,这实际上有点奇怪。标准方法是让 MediaPlayer 成为成员变量,create() 在应用程序启动期间使用它,并在您全部完成后使用release() 它。您已将其作为Thread.run() 中的局部变量。或者,更好的是,使用 SoundPool,它更适合处理这样的短声音。

标签: android android-mediaplayer


【解决方案1】:

我要说这是由于MediaPlayer's 内部播放缓冲区的欠载(饥饿)而导致卡顿。也就是说,MediaPlayer 无法以足够快的速度提供数据以跟上声音硬件的速度(这表明严重缺乏处理能力)。如果缓冲区耗尽,它将开始播放旧数据(因为它是一个循环缓冲区)。这会导致急剧的相变,听起来像是“咔哒”声。大概MediaPlayer 恢复得足够快,以至于“正确”的声音很快就会恢复播放。

这是 Audacity 的频谱图。 0-4KHz。第一行是干净的.mp3;接下来的四行是失真的录音(没有特别的顺序)。所有行都在时间上对齐,并且幅度大致相同。最后四行中的大垂直条纹代表您听到的失真/咔嗒声。

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多