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

友谊路一霸 2014-10-17 11:21:39
如题,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);
public void playWav(byte[] byteWav) {
String path = this.getCacheDir().getParent() + File.separator;
try {
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
File tempWav = new File(file, "temp.wav");
if (!tempWav.exists())
tempWav.createNewFile();
FileOutputStream fos = new FileOutputStream(tempWav);
fos.write(byteWav);
fos.flush();
fos.close();
MediaPlayer mediaPlayer = new MediaPlayer();
FileInputStream fis = new FileInputStream(tempWav);
mediaPlayer.setDataSource(fis.getFD());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

报异常:10-17 11:16:42.726: E/MediaPlayer(20944): Unable to to create media player
10-17 11:16:42.726: D/String(20944): string = java.io.IOException: setDataSourceFD failed.: status=0x80000000
10-17 11:16:42.726: W/System.err(20944): java.io.IOException: setDataSourceFD failed.: status=0x80000000
10-17 11:16:42.726: W/System.err(20944): at android.media.MediaPlayer.setDataSource(Native Method)
10-17 11:16:42.726: W/System.err(20944): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:780)
10-17 11:16:42.726: W/System.err(20944): at com.example.playwav.MainActivity.playTempWav(MainActivity.java:56)
10-17 11:16:42.726: W/System.err(20944): at com.example.playwav.MainActivity$1.onClick(MainActivity.java:39)
10-17 11:16:42.736: W/System.err(20944): at android.view.View.performClick(View.java:2486)
10-17 11:16:42.736: W/System.err(20944): at android.view.View$PerformClick.run(View.java:9130)
10-17 11:16:42.736: W/System.err(20944): at android.os.Handler.handleCallback(Handler.java:587)
10-17 11:16:42.736: W/System.err(20944): at android.os.Handler.dispatchMessage(Handler.java:92)
10-17 11:16:42.736: W/System.err(20944): at android.os.Looper.loop(Looper.java:130)
10-17 11:16:42.736: W/System.err(20944): at android.app.ActivityThread.main(ActivityThread.java:3703)
10-17 11:16:42.736: W/System.err(20944): at java.lang.reflect.Method.invokeNative(Native Method)
10-17 11:16:42.736: W/System.err(20944): at java.lang.reflect.Method.invoke(Method.java:507)
10-17 11:16:42.736: W/System.err(20944): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
10-17 11:16:42.736: W/System.err(20944): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
10-17 11:16:42.736: W/System.err(20944): at dalvik.system.NativeStart.main(Native Method)
...全文
1089 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34800306 2016-06-14
  • 打赏
  • 举报
回复
楼主解决了没,请指教djj094812453@163.com
rdgrr 2015-01-13
  • 打赏
  • 举报
回复
解决了吗?想请教你一下,可以吗? qq673140304
友谊路一霸 2014-10-17
  • 打赏
  • 举报
回复
引用 2 楼 ppdayz 的回复:
或者你试试直接用AudioTrack来播放,而不是用MediaPlayer 来播放
嗯,我试用MediaPlayer ,不行,后来试用SoundPool播放,报异常W/SoundPool(28830): sample 1 not READY 正好在看AudioTrack是怎么播放的
ppdayz 2014-10-17
  • 打赏
  • 举报
回复

我做的一个项目的一部分,是个网络摄像头的播发,就是从网络收到被adpcm编码过的音频包,然后我用adpcm的codec解码,直接交由AudioTrack来进行播放
简单的流程就是 经过adpcm编码的 byte[] 解码成byte,然后由AudioTrack进行播放。
希望对你有所启发。理论上来说,最后的声音播放,就是二进制数据,进入音频I/O设备,然后调用硬件发出声音。
AudioTrack你可以去看下。
ppdayz 2014-10-17
  • 打赏
  • 举报
回复
或者你试试直接用AudioTrack来播放,而不是用MediaPlayer 来播放
ppdayz 2014-10-17
  • 打赏
  • 举报
回复
网上找个wav的codec,对byte进行编码就可以了

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧