============问题描述============
如题,byte数组转换成wav音频文件,并且播放,下面代码能生成data/data/com.example.playwav/cache/temp.wav
但是在播放的时候报异常。
我把代码和Log贴在下面了。
我分析,原因应该是wav文件格式的编解码问题,不能这么随随便便把任意的一个byte数组就转化为了wav
希望了解wav编解码开发的童鞋给点解决办法
byte[]a={52,51,48,28,58,64,98,-127,56,52,51,48,28,58,64,98,
64,98,13,2,56,-4,62,-116,0,-59,39,-116,0,-84,
64,98,13,2,56,-4,62,-116,0,-59,39,-116,0,-84,
64,98,13,2,56,-4,62,-116,0,-59,39,-116,0,-84,
64,98,13,2,56,-4,62,-116,0,-59,39,-116,0,-84,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-65};
playWav(a);
publicvoidplayWav(byte[]byteWav){
Stringpath=this.getCacheDir().getParent()+File.separator;
try{
Filefile=newFile(path);
if(!file.exists()){
file.mkdirs();
}
FiletempWav=newFile(file,"temp.wav");
if(!tempWav.exists())
tempWav.createNewFile();
FileOutputStreamfos=newFileOutputStream(tempWav);
fos.write(byteWav);
fos.flush();
fos.close();
MediaPlayermediaPlayer=newMediaPlayer();
FileInputStreamfis=newFileInputStream(tempWav);
mediaPlayer.setDataSource(fis.getFD());
mediaPlayer.prepare();
mediaPlayer.start();
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
报异常:10-1711:16:42.726:E/MediaPlayer(20944):Unabletotocreatemediaplayer
10-1711:16:42.726:D/String(20944):string=java.io.IOException:setDataSourceFDfailed.:status=0x80000000
10-1711:16:42.726:W/System.err(20944):java.io.IOException:setDataSourceFDfailed.:status=0x80000000
10-1711:16:42.726:W/System.err(20944):atandroid.media.MediaPlayer.setDataSource(NativeMethod)
10-1711:16:42.726:W/System.err(20944):atandroid.media.MediaPlayer.setDataSource(MediaPlayer.java:780)
10-1711:16:42.726:W/System.err(20944):atcom.example.playwav.MainActivity.playTempWav(MainActivity.java:56)
10-1711:16:42.726:W/System.err(20944):atcom.example.playwav.MainActivity$1.onClick(MainActivity.java:39)
10-1711:16:42.736:W/System.err(20944):atandroid.view.View.performClick(View.java:2486)
10-1711:16:42.736:W/System.err(20944):atandroid.view.View$PerformClick.run(View.java:9130)
10-1711:16:42.736:W/System.err(20944):atandroid.os.Handler.handleCallback(Handler.java:587)
10-1711:16:42.736:W/System.err(20944):atandroid.os.Handler.dispatchMessage(Handler.java:92)
10-1711:16:42.736:W/System.err(20944):atandroid.os.Looper.loop(Looper.java:130)
10-1711:16:42.736:W/System.err(20944):atandroid.app.ActivityThread.main(ActivityThread.java:3703)
10-1711:16:42.736:W/System.err(20944):atjava.lang.reflect.Method.invokeNative(NativeMethod)
10-1711:16:42.736:W/System.err(20944):atjava.lang.reflect.Method.invoke(Method.java:507)
10-1711:16:42.736:W/System.err(20944):atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
10-1711:16:42.736:W/System.err(20944):atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
10-1711:16:42.736:W/System.err(20944):atdalvik.system.NativeStart.main(NativeMethod)
============解决方案1============
我做的一个项目的一部分,是个网络摄像头的播发,就是从网络收到被adpcm编码过的音频包,然后我用adpcm的codec解码,直接交由AudioTrack来进行播放
简单的流程就是经过adpcm编码的byte[]解码成byte,然后由AudioTrack进行播放。
希望对你有所启发。理论上来说,最后的声音播放,就是二进制数据,进入音频I/O设备,然后调用硬件发出声音。
AudioTrack你可以去看下。
原文:/llj1985522/p/4047417.html