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);

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)

============解决方案1============

我做的一个项目的一部分,是个网络摄像头的播发,就是从网络收到被adpcm编码过的音频包,然后我用adpcm的codec解码,直接交由AudioTrack来进行播放

简单的流程就是   经过adpcm编码的 byte[]  解码成byte,然后由AudioTrack进行播放。

希望对你有所启发。理论上来说,最后的声音播放,就是二进制数据,进入音频I/O设备,然后调用硬件发出声音。

AudioTrack你可以去看下。

时间: 2024-10-15 18:20:13

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

java的byte数组转换成在[0,255]范围内

C#的byte    是 0-255java的byte  是 -128-127  java的byte数组转换成在[0,255]范围内int data[]= new int[bytes.length];for(int i=0;i<bytes.length;i++) { data[i] = bytes[i] & 0xff;}

C#中如何把byte[]数组转换成其他类型

http://bbs.csdn.net/topics/20447859 byte[] bytes = new byte[256]; //receive some stream from network int a,b,c,d; string theStr; a = (int)bytes[0]; b = (int)bytes[1]; c = (int)bytes[2]; d = (int)bytes[3]; byte[] newBytes = byte[bytes.Length-4]; for( 

android中的byte数组转换

/** * 将一个单字节的byte转换成32位的int * * @param b * byte * @return convert result */ public static int unsignedByteToInt(byte b) { return (int) b & 0xFF; } /** * 将一个单字节的Byte转换成十六进制的数 * * @param b * byte * @return convert result */ public static String byteToH

PHP二维数组转换成一维数组,一个变量多个二维数组转换成一维数组,PHP二维数组(或任意维数组)转换成一维数组的方法汇总,array_reduce(); array_walk_recursive(); array_map();

方法汇总: 1. array_reduce函数法 //用array_reduce()函数是较为快捷的方法: $result = array_reduce($user, function ($result, $value) { return array_merge($result, array_values($value)); }, array()) 2. array_walk_recursive函数法 //用array_walk_recursive()函数就非常灵活,可以把任意维度的数组转换成一

【游戏开发】Excel表格批量转换成lua的转表工具

一.简介 在上篇博客<[游戏开发]Excel表格批量转换成CSV的小工具> 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用.实际在Unity开发中,很多游戏都是使用Lua语言进行开发的.如果要用Lua直接读取CSV文件的话,又要写个对应的CSV解析类,不方便的同时还会影响一些加载速度,牺牲游戏性能.因此我们可以直接将Excel表格转换为lua文件,这样就可以高效.方便地在Lua中使用策划配置的数据了.在本篇博客中,马三将会和大家一起,用C#语言实现一个Exce

php json_encode 将数组转换成json格式数据出错

当用php 的 json_encode 函数将数组转换成json格式的时候,如果该数组是一个索引数组而且数组的索引的顺序不是按照0,1,2...排序的话,在转换成json数据的时候就不能得到你所想要的json数组,而是一个json对象 这个问题是在开发app接口的时候发现的,因为php和app之前是通过json数据格式进行数据通讯的,而app那边对json的数组和对象类型很敏感,本来是数组格式的,可是突然变对象了,导致出错,后来就发现,php这边的索引数组的键名没有按照顺序排序的,导致转成jso

C#字节数组转换成字符串

C#字节数组转换成字符串 如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了.为了进行这样的转换,我们不得不借助另一个类:System.Text.Encoding.该类提供了 bye[] GetBytes(string) 方法将字符串转换成字节数组,还提供了 string GetString(byte[]) 方法将C#字节数组转换成字符串. System.Text.Encoding 类似乎没有可用的构造函数,但我们可以找到几个默认的 Encodin

LeetCode OJ:Convert Sorted Array to Binary Search Tree(将排序好的数组转换成二叉搜索树)

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 讲一个排序好的数组转换成二叉搜索树,这题没想出来,基本上是参考别人的,边界条件应该注意一下: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * T

C# byte数组转成Bitmap对象

方法一: /// <summary> /// 将数组转换成彩色图片 /// </summary> /// <param name="rawValues">图像的byte数组</param> /// <param name="width">图像的宽</param> /// <param name="height">图像的高</param> /// <