2

最近、私は 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 に現れるホワイト ノイズが多くなるようです。結合されるすべてのファイルは、フォーマットに関しては同一です。提案やアドバイスがあれば、よろしくお願いします。

4

1 に答える 1

0

私は間違っているかもしれませんが、あなたの問題は、バイトの意味ではなく、バイトをいじっているという事実に関係していると思います。たとえば、16 ビットのサンプリング レートで作業している場合、振幅に対応する数値は 1 バイトではなく 2 バイトで形成されます。そのため、最終的には近いものになりますが、完全には正しくありません。

于 2012-08-06T16:43:05.933 に答える