600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > android 字节转wav android开发:把一个byte数组转换成wav音频文件 并且播放

android 字节转wav android开发:把一个byte数组转换成wav音频文件 并且播放

时间:2019-06-02 06:48:30

相关推荐

android 字节转wav android开发:把一个byte数组转换成wav音频文件 并且播放

============问题描述============

如题,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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。