文件IO,音频buffer处置
文件IO,音频buffer处理
1,获取一个文件夹下所有文件对象
//获取一个文件夹下所有文件的名字,并保存在list中 public static ArrayList<String> getFileName(String path) { File[] files=new File(path).listFiles(); // 举例File[] files=new File("/sdcard/my/").listFiles(); ArrayList<String> list=new ArrayList<>(); if (files != null) { // 先判断目录是否为空,否则会报空指针 for (File file : files) { String fileName = file.getName(); list.add(fileName); } } return list; }
2.把文件转换为byte[]
private byte[] readWavFile(File file) throws IOException { InputStream is = new FileInputStream(file); //InputStream转换为byte[] byte[] data = new byte[is.available()]; is.read(data); return data; }
3.每次复制一小段数据到buffer中
//每次复制3200byte的数据到buffer中,直到复制完 byte[] data = readWavFile(file); if (data != null && data.length > 0) { mEngine.start(); byte[] buffer = new byte[3200]; //多次分段复制,每次最大只复制3200byte的数据 int i = 0;//已经复制的data的长度 int j = 0;//下次要复制到data长度的数据 (不是要复制的长度,而是要复制到某个位置的长度,比如总长3000,每次复制500,那么第二次j=1000) int dataLength = data.length; while (i < dataLength) { j += 3200; //要复制的长度位置不可能超过数据长度本身 if (j > dataLength) { j = dataLength; } //开始把数据复制到buffer中 System.arraycopy(data, i, buffer, 0, j - i); i += 3200; // 自行feed数据 mEngine.feedData(buffer); try { Thread.sleep(97); if(mEngine == null) return; } catch (InterruptedException e) { e.printStackTrace(); } } mEngine.stopRecording(); }