我正在创建一个应用程序,在静态模式下通过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();
}
}
答案 0 :(得分:0)
读取的第一个字节存储在元素
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个字节,采样率,通道数......)