Java — микширование аудиофайлов создает нежелательный белый шум

Недавно я экспериментировал с микшированием AudioInputStreams. Прочитав это сообщение или, что более важно, ответ Джейсона Олсона, я пришел с этим кодом:

private static AudioInputStream mixAudio(ArrayList audio) throws IOException{
    ArrayList<byte[]> byteArrays = new ArrayList();
    long size = 0;
    int pos = 0;
    for(int i = 0; i < audio.size(); i++){
        AudioInputStream temp = (AudioInputStream) audio.get(i);
        byteArrays.add(convertStream(temp));
        if(size < temp.getFrameLength()){
            size = temp.getFrameLength();
            pos = i;
        }
    }

    byte[] compiledStream = new byte[byteArrays.get(pos).length];
    for(int i = 0; i < compiledStream.length; i++){
        int byteSum = 0;
        for(int j = 0; j < byteArrays.size(); j++){
            try{
                byteSum += byteArrays.get(j)[i];
            }catch(Exception e){
                byteArrays.remove(j);
            }
        }
        compiledStream[i] = (byte) (byteSum / byteArrays.size());
    }

    return new AudioInputStream(new ByteArrayInputStream(compiledStream), ((AudioInputStream)audio.get(pos)).getFormat(), ((AudioInputStream)audio.get(pos)).getFrameLength());
}

private static byte[] convertStream(AudioInputStream stream) throws IOException{
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int numRead;

    while((numRead = stream.read(buffer)) != -1){
        byteStream.write(buffer, 0, numRead);
    }

    return byteStream.toByteArray();
}

Этот код очень хорошо работает для микширования аудиофайлов. Однако кажется, что чем больше аудиофайлов микшируется, тем больше белого шума появляется в возвращаемом AudioInputStream. Все объединяемые файлы идентичны, когда дело доходит до форматирования. Если у кого есть предложения\советы, заранее спасибо.


person Pojo226    schedule 21.06.2011    source источник
comment
Если у кого-то есть какие-либо предложения\советы,... Опубликуйте SSCCE. Либо сделайте горячую ссылку на несколько небольших звуков, либо сгенерируйте их в коде. ..заранее спасибо. Пожалуйста.   -  person Andrew Thompson    schedule 21.06.2011


Ответы (1)


Я могу ошибаться, но я думаю, что ваша проблема связана с тем, что вы возитесь с байтами, а не с тем, что байты означают. Например, если вы работаете с 16-битной частотой дискретизации, 2 байта образуют число, соответствующее амплитуде, а не только 1 байт. Таким образом, вы в конечном итоге получаете что-то близкое, но не совсем правильное.

person gvd    schedule 06.08.2012
comment
Я знаю, что это давно мертвый пост, но для всех, кто наткнется на него: gvd был прав в том, что я неправильно решил проблему. С тех пор я узнал больше о цифровом звуке, чтение о преобразовании аналогового звука в цифровое является отличной отправной точкой для всех, кому это интересно. - person Pojo226; 08.10.2013