文件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();
}

猜你喜欢

转载自542255641.iteye.com/blog/2396815