3

サーバーからバイト配列を受け取りましたが、これは完全に接続して送信します。バイト配列からサウンドを再生しようとしたときです。

これが私がサウンドを再生しなければならないものです。

SourceDataLine speaker = null;
try {
    DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class, getAudioFormat(samplerate));
    speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
} catch (LineUnavailableException e) {
    e.printStackTrace();
}
int nBytesRead = 0;
    while (nBytesRead != -1) {
    if (nBytesRead >= 0) {
         speaker.write(bytes, 0, nBytesRead);
    }
}

getAudioFormat:

private AudioFormat getAudioFormat(float sample) {
    int sampleSizeBits = 16;
    int channels = 1;
    boolean signed = true;
    boolean bigEndian = false;
    return new AudioFormat(sample, sampleSizeBits, channels, signed, bigEndian);
}

から音楽を再生するにはどうすればよいbyte[]ですか?

4

3 に答える 3

2

whileループのサウンドバイト配列からどこを読み取っているのかわかりません。彼らはあなたがセットアップされている方法で、おそらくこれらの線に沿って何かがあるはずです:

while (nBytesRead = soundDataArray.read(bytes) != 1)

...「bytes」というバッファがreadコマンドからデータを受信するようにreadメソッドが設定されていると仮定します。次に、write()メソッドには、送信するために「バイト」が繰り返し入力されます。

もちろん、「bytes」はwhileループでのみ使用されるバッファーであり、ソースサウンドを含むバイト配列ではありません。

次のように、readメソッドに2つの入力がある場合があります。.read(bufferArray, bytesToRead); ここで、akまたは数kの範囲の値が一般的です。(bufferArray.length == bytesToRead)

于 2013-02-19T21:15:28.037 に答える
0

少し前に、httpを介して音楽をストリーミングする小さなサーバーを作成しました。Javaを使用してhttpを介してループで音楽をストリーミングします。

そこに行くと、それが再生される方法で、指定されたリンクに移動します。つまり、私の場合はwww.localhost:8080 / testに移動すると、ブラウザーが音楽をストリーミングします。

たぶん、私の結果のいくつかをあなたの結果と組み合わせることで解決策を見つけることができるでしょう。

実際には、bytearrayを返すリンクはすべて、データ型などに応じてブラウザによってストリーミングされます。

于 2013-02-18T22:34:19.700 に答える
0

このようにして、Byte[]からサウンドを再生できます。

それが他の人に役立つことを願っています。

import javax.sound.sampled.*;
import java.io.*;

public class PlaySoundFromByteArr {

  public static void main(String[] args) throws IOException, UnsupportedAudioFileException {
    String FILE_PATH = "resources/wav-1.wav";

    byte[] byteArr = getByte(FILE_PATH);
    AudioFormat format = getFormat(FILE_PATH);
    playAudioUsingByteArray(byteArr, format);
  }

  private static byte[] getByte(String FILE_PATH) {
    byte[] byteArr = new byte[0];

    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      AudioInputStream in =  AudioSystem.getAudioInputStream(new File(FILE_PATH));

      int numOfBytes;
      byte[] buffer = new byte[1024];

      while( (numOfBytes = in.read(buffer)) > 0 ){
        out.write(buffer, 0,numOfBytes);
      }
      out.flush();
      byteArr = out.toByteArray();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (UnsupportedAudioFileException e) {
      e.printStackTrace();
    }

    return byteArr;
  }

  private static AudioFormat getFormat(String FILE_PATH) throws IOException, UnsupportedAudioFileException {
    AudioInputStream in =  AudioSystem.getAudioInputStream(new File(FILE_PATH));
    return in.getFormat();
  }

  private static void playAudioUsingByteArray(byte[] byteArr, AudioFormat format) {
    try (Clip clip = AudioSystem.getClip()) {
      clip.open(format, byteArr, 0, byteArr.length);
      clip.start();
      clip.drain();
      Thread.sleep(clip.getMicrosecondLength());
    }
    catch (LineUnavailableException | InterruptedException e) {
      e.printStackTrace();
    }
  }

}
于 2021-02-08T04:11:34.340 に答える