CarGuo / GSYRecordWave

MP3音频录制,支持类似IOS原生的单边或者双边波形显示,低版本音频权限兼容,本地或者在线音频播放的波形显示,录制波形和播放波形会根据声音频率变色的功能,边播边缓存功能,简书入口http://www.jianshu.com/p/2448e2903b07
Apache License 2.0
932 stars 200 forks source link

如何根据网络地址显示出波形图 #1

Closed appdev closed 7 years ago

appdev commented 7 years ago

一个音频的网络地址,如何根据这个获取它的波形图,或者一个本地文件也行啊

CarGuo commented 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();
appdev commented 7 years ago

谢谢!我先看看

CarGuo commented 7 years ago

忘记说了,如果是MP3格式之类的,需要对应解码后才能用audioTrack,因为audioTrack只支持PCM原始数据,可以参考系ttp://blog.csdn.net/conowen/article/details/7799155

CarGuo commented 7 years ago

加上了,可以看一下1.0.1