audiotrack,如何跳过波头噪音?

时间:2014-09-12 01:07:56

标签: java android

我正在创建一个应用程序,在静态模式下通过audiotrack类播放.wav文件,但我无法弄清楚如何跳过波形标题,这是我已经完成的代码,我无法看到什么错了!有谁知道如何跳过标题? 谢谢!

公共类MainActivity扩展了ActionBarActivity {

AudioTrack player;
int minBufferSize = 200000;
int waveHeader = 44;
byte[] buffer = new byte[minBufferSize -waveHeader];
InputStream is;
public TextView text;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main);

    player = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STATIC);
    is = getResources().openRawResource(R.raw.crash);
    try {is.read(buffer, waveHeader, minBufferSize);} catch (IOException e)      {e.printStackTrace();}
    try {is.close();} catch (IOException e) {e.printStackTrace();}
    player.write(buffer, 0, minBufferSize);

    Button button1 = (Button) findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            playDrums();
        }});
}

public void playDrums(){
    player.play();
}

}

1 个答案:

答案 0 :(得分:0)

read documentation所示:

  

读取的第一个字节存储在元素b[off]中,下一个字节存入b[off+1],依此类推。读取的字节数最多等于len。设k为实际读取的字节数;这些字节将存储在元素b[off]b[off+k-1]中,使b[off+k]b[off+len-1]元素不受影响。

换句话说,参数off不会从输入流中跳过这些字节,而是在提供的数组中存储偏移量。

要从输入中跳过字节,您可以使用skip

try {is.skip(waveHeader);} catch (IOException e)               {e.printStackTrace();}
try {is.read(buffer, 0, minBufferSize);} catch (IOException e) {e.printStackTrace();}

或者在另一个缓冲区中读取wave标头:

byte[] header = new byte[waveHeader];
try {is.read(header);} catch (IOException e) {e.printStackTrace();}
try {is.read(buffer, 0, minBufferSize);} catch (IOException e) {e.printStackTrace();}

毕竟你可能需要波形头来正确解释数据(例如,每个样本的数据1或2个字节,采样率,通道数......)