Как эффективнее использовать часть байта []? - PullRequest
1 голос
/ 26 марта 2011

У меня есть ByteArrayOutputStream стерео аудио данных.В настоящее время я делаю это, что я знаю плохо:

WaveFileWriter wfw = new WaveFileWriter();
AudioFormat format = new AudioFormat(Encoding.PCM_SIGNED, 44100, 16, 1, 2, 44100, false);
byte[] audioData = dataout.toByteArray(); //bad bad bad
int length = audioData.length;
byte[] monoData = new byte[length/2]; //bad bad bad
for(int i = 0; i < length; i+=4){
    monoData[i/2] = audioData[i];
    monoData[1+i/2] = audioData[i+1];
}
ByteArrayInputStream bais = new ByteArrayInputStream(monoData);
AudioInputStream outStream = new AudioInputStream(bais,format,length);

wfw.write(outStream, Type.WAVE,output);

Какой лучший способ сделать это?Могу ли я преобразовать ByteArrayOutputStream в ByteArrayInputStream, чтобы я мог читать с него?

Edit

Хорошо, так что я копался в классе, который даетя ByteArrayOutputStream я работаю с.Он заполняется вызовом:

dataout.write(convbuffer, 0, 2 * vi.channels * bout);

Я могу заменить это на что-то другое, если это поможет, но что мне использовать?

Я попытался заменить его на:

for(int j = 0;j < bout; j += 2){
  dataout.write(convbuffer,2*j,2);
}

но это не сработало, не знаю почему.

Ответы [ 3 ]

3 голосов
/ 26 марта 2011

Разве вы не можете читать аудиоданные по одному семплу за раз и записывать семплы в файл по мере их чтения?

Также кажется, что ваш текущий код бессмысленно перезаписывает monoData. - Спасибо за исправление, @ fredley.

Сначала укажите, что вы делаете на простом английском языке.;это поможет вам понять это, и затем перейдут к коду.

1 голос
/ 26 марта 2011

это то, что я использую вместо ванильного ByteArrayOutputStream. Вы получаете удобный toByteArrayInputStream() + toByteBuffer() (я склонен использовать довольно много байтовых буферов)

Надеемся, что многие найдут код ниже полезным, некоторые методы удалены из исходного класса.

Ура!

public class ByteBufStream extends ByteArrayOutputStream implements Serializable{
    private static final long serialVersionUID = 1L;

  public ByteBufStream(int initSize){
    super(initSize);
  }
//+few more c-tors, skipped here

  public ByteArrayInputStream toByteArrayInputStream(){
    return new ByteArrayInputStream(getBuf(),0, count);
  }

  public ByteBuffer toByteBuffer(){
    return ByteBuffer.wrap(getBuf(), 0 , count);
  }

  public int capacity(){
    return buf.length;
  }


  public byte[] getBuf(){
    return buf;
  } 



    public final int size() {
        return count;
    }
    private void writeObject(java.io.ObjectOutputStream out)  throws java.io.IOException{
        out.defaultWriteObject();
        out.writeInt(capacity());
        out.writeInt(size());

        writeTo(out);
    }

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{
        in.defaultReadObject();
        int capacity = in.readInt();
        int size = in.readInt();
        byte[] b = new byte[capacity];
        for (int n=0;n<size;){
            int read = in.read(b, n, size-n);
            if (read<0) throw new StreamCorruptedException("can't read buf w/ size:"+size);
            n+=read;
        }
        this.buf = b;
        this.count = size;
    }

}

Хотя я обычно воздерживаюсь от преподавания хаков, этот, вероятно, безвреден, веселитесь!

Если вы хотите украсть buf [] из ванильного ByteArrayOutputStream, посмотрите на следующий метод ...

public synchronized void writeTo(OutputStream out) throws IOException {
    out.write(buf, 0, count);
}

Полагаю, вы знаете, что вам нужно делать сейчас:

class ByteArrayOutputStreamHack extends OutputStream{
  public ByteArrayInputStream in;
  public void write(byte b[], int off, int len) {
    in = new ByteArrayInputStream(b, off, len);
  }
  public void write(int b){
   throw new AssertionError();
  }
}
ByteArrayOutputStreamHack hack = new ByteArrayOutputStreamHack()
byteArrayOutputStream.writeTo(hack);
ByteArrayInputStream in = hack.in; //we done, we cool :)
0 голосов
/ 26 марта 2011

Как new ByteArrayInputStream(dataout.toByteArray())?

...