Чтение звукового файла ресурса в массив байтов

У меня есть cheerapp.wav или cheerapp.mp3 или какой-то другой формат.

InputStream in = context.getResources().openRawResource(R.raw.cheerapp);       
BufferedInputStream bis = new BufferedInputStream(in, 8000);
// Create a DataInputStream to read the audio data from the saved file
DataInputStream dis = new DataInputStream(bis);

byte[] music = null;
music = new byte[??];
int i = 0; // Read the file into the "music" array
while (dis.available() > 0) {
    // dis.read(music[i]); // This assignment does not reverse the order
    music[i]=dis.readByte();
    i++;
}

dis.close();          

Для music байтового массива, который берет данные из DataInputStream. Я не знаю, какой длины это выделить.

Это необработанный файл из ресурса, а не файл, поэтому я не знаю его размера.


person jason white    schedule 26.02.2013    source источник
comment
Рассмотрите возможность использования Apache Commons.   -  person JJD    schedule 08.10.2013


Ответы (2)


Как видите, у вас есть длина массива байтов:

 InputStream inStream = context.getResources().openRawResource(R.raw.cheerapp);
 byte[] music = new byte[inStream.available()];

И тогда вы можете легко прочитать весь поток в массив байтов.

Конечно, я бы порекомендовал вам проверить размер и использовать ByteArrayOutputStream с меньшим буфером byte[], если это необходимо:

public static byte[] convertStreamToByteArray(InputStream is) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buff = new byte[10240];
    int i = Integer.MAX_VALUE;
    while ((i = is.read(buff, 0, buff.length)) > 0) {
        baos.write(buff, 0, i);
    }

    return baos.toByteArray(); // be sure to close InputStream in calling function
}

Если вы будете выполнять много операций ввода-вывода, я рекомендую вам использовать org.apache.commons .io.IOtils. Таким образом, вам не нужно слишком беспокоиться о качестве вашей реализации ввода-вывода, и как только вы импортируете JAR в свой проект, вы просто сделаете:

byte[] payload = IOUtils.toByteArray(context.getResources().openRawResource(R.raw.cheerapp));
person nikib3ro    schedule 26.02.2013

Надеюсь, это поможет.

Создайте путь к SD-карте:

String outputFile = 
    Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";

Преобразовать как файл и вызвать метод массива байтов:

byte[] soundBytes;

try {
    InputStream inputStream = 
        getContentResolver().openInputStream(Uri.fromFile(new File(outputFile)));

    soundBytes = new byte[inputStream.available()];
    soundBytes = toByteArray(inputStream);

    Toast.makeText(this, "Recordin Finished"+ " " + soundBytes, Toast.LENGTH_LONG).show();
} catch(Exception e) {
    e.printStackTrace();
}

метод:

public byte[] toByteArray(InputStream in) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int read = 0;
    byte[] buffer = new byte[1024];
    while (read != -1) {
        read = in.read(buffer);
        if (read != -1)
            out.write(buffer,0,read);
    }
    out.close();
    return out.toByteArray();
}
person Mahendran Candy    schedule 26.09.2016