MediaPlayer 和 AudioTrack 不输出相同的声音

Posted

技术标签:

【中文标题】MediaPlayer 和 AudioTrack 不输出相同的声音【英文标题】:MediaPlayer and AudioTrack don't output the same sound 【发布时间】:2013-04-20 18:53:47 【问题描述】:

我有一个名为“new.wav”的 wav 文件,我想通过 android 中的 MediaPlayer 和 AudioTrack 播放它:

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName = "new.wav";
File f = new File(baseDir + File.separator + fileName);
byte[] b = null;

try 
    b=this.readFile(f);
 catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();


Log.i("123"," "+"length is "+b.length);
truncated=new byte[b.length-44];
truncated=Arrays.copyOf(b, b.length-44);
at=new AudioTrack(AudioManager.STREAM_MUSIC, 48000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, truncated.length /* 1 second buffer */, AudioTrack.MODE_STREAM);
at.write(truncated, 0, truncated.length);
at.play();

mp = new MediaPlayer();

try 
    mp.setDataSource(baseDir + File.separator + fileName);
 catch (IllegalArgumentException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
 catch (SecurityException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
 catch (IllegalStateException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
 catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();


try 
    mp.prepare();
 catch (IllegalStateException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
 catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();

两种方法都试过后,我发现他们的声音不一样,AudioTrack没有输出wav文件中的原声。我认为我的采样率很好,有人可以帮我解决这个问题吗?谢谢!

【问题讨论】:

我认为音轨正在以较低的频率播放。顺便说一句 看起来如果我将选项更改为 AudioFormat.CHANNEL_OUT_STEREO,它会产生相同的输出。不知道为什么 【参考方案1】:

正如我在上面的 cmets 中所说,问题在于渠道的选择。

【讨论】:

以上是关于MediaPlayer 和 AudioTrack 不输出相同的声音的主要内容,如果未能解决你的问题,请参考以下文章

AudioTrack、SoundPool 或 MediaPlayer 我应该使用哪个?

Android 自定义音频播放器,用 libPd 或 OpenSL ES 或 AudioTrack 替换 MediaPlayer

Android音频系统AudioTrack使用方法详解

Android使用AudioTrack播放WAV音频文件

Android 音频播放——AudioTrack直接播PCMMediaPlayer播媒体文件可以是audio

在静态模式下使用 AudioTrack 的正确方法是啥?