Closed appdev closed 7 years ago
https://github.com/FireZenk/AudioWaves 网络的话和本地不大一样,截图参考这个,MediaPlayer只支持Visualizer这种方式提取波形。 目前这个库RecordWave是通过录制的时候直接就从AudioRecord获取了波形数据。 播放本地音频获取波形你可以通过AudioTrack,这个类使用比较灵活,还可以做到边录边放,write就可以发出声音。 这是很久很久以前写过的,这里没怎么整理,思路就是线程里不断的去读,配置好频率什么的,读的时候就会有声音波形的数据,记得分块。如果需要后面我加上。
int musicLength = (int)(file.length()/2);
int AVbuffer = musicLength / timeLength;
short[] music;
byte[] TmpBuffer = new byte[(int)file.length()];
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
int bufferSize = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
8000,
AudioFormat.CHANNEL_OUT_MONO ,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize,
AudioTrack.MODE_STREAM);
audioTrack.setStereoVolume(AudioTrack.getMaxVolume(), AudioTrack.getMaxVolume());
audioTrack.play();
dis.read(TmpBuffer);
if(BigorLittle){
music = byteArray2ShortArrayLittle(TmpBuffer, musicLength);
}else{
music = byteArray2ShortArrayBig(TmpBuffer, musicLength);
}
int playOffset = Offset * AVbuffer;
boolean playnow = true;
if((musicLength - playOffset) < 200){
playnow = false;
}
playFLag = true;
if(playnow){
for(int j = playOffset; j < musicLength; j += 200 ){
audioTrack.write(music, j, 200);
}
}
dis.close();
audioTrack.stop();
谢谢!我先看看
忘记说了,如果是MP3格式之类的,需要对应解码后才能用audioTrack,因为audioTrack只支持PCM原始数据,可以参考系ttp://blog.csdn.net/conowen/article/details/7799155
加上了,可以看一下1.0.1
一个音频的网络地址,如何根据这个获取它的波形图,或者一个本地文件也行啊