10

ここ数日、これを機能させるために少し問題がありました。しかし、ネットワーク経由で生データを送信するアプリケーションが必要です。次に、このバイナリ データを読み取り、wav (任意のオーディオ) ファイルに保存します。後で圧縮を見るかもしれません。

したがって、問題のあるコード:

byte[] allBytes = ...
InputStream b_in = new ByteArrayInputStream(allBytes);

try
{
     AudioFormat format = new AudioFormat(8000f, 16, 1, true, true);
     AudioInputStream stream = new AudioInputStream(b_in, format, allBytes.length);
     //AudioInputStream stream = AudioSystem.getAudioInputStream(b_in);                

上記のステートメントも使用しようとしましたが、例外が発生しました: javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from stream. 私のストリームは生のオーディオ データであり、ウェーブ ヘッダーがないため、例外がスローされていると思いますか?

File newPath = new File(SystemConfiguration.getLatest().voiceNetworkPathDirectory + currentPhoneCall.fileName);
if (!AudioSystem.isFileTypeSupported(Type.WAVE, stream))
{
    Logger.error("Audio System file type not supported");
}

AudioSystem.write(stream, Type.WAVE, newPath);

ファイルは正常に書き込みますが、すべて静的です。このようなものを使用して、出力にウェーブ ヘッダーを作成する必要がありますか。出力された wav ファイルをメモ帳で見ると、「RIFF」で始まるヘッダーがあるように見えます。

入力ストリームに偽のヘッダーを追加する必要がありますか? 独自の出力ヘッダーを作成し、バイナリ ライターで保存する必要がありますか?

4

3 に答える 3

6

だから私はそれが機能するようになりましたが、理由はよくわかりませんが、これは機能しているコードです:

InputStream b_in = new ByteArrayInputStream(resultArray);
try {
        DataOutputStream dos = new DataOutputStream(new FileOutputStream(
                "C:\\filename.bin"));
        dos.write(resultArray);
        AudioFormat format = new AudioFormat(8000f, 16, 1, true, false);
        AudioInputStream stream = new AudioInputStream(b_in, format,
                resultArray.length);
        File file = new File("C:\\file.wav");
        AudioSystem.write(stream, Type.WAVE, file);
        Logger.info("File saved: " + file.getName() + ", bytes: "
                + resultArray.length)

したがって、署名付き/未署名/リトルエンディアンの設定だったに違いありません。私がやったことは、データをバイナリファイルに保存することでした。次に、そのファイルを生データとして audacity にインポートします。これは、私がすでに新しいレートを除いてすべてを教えてくれました。私が今持っている唯一の問題は、ヘッダーの計算を行うことです。4 秒の wav を生成するバイナリ データを保存しますが、2 秒のサウンドしかありません。私のヘッダーが間違って計算されているかのようです。LiuYanが言及したフレームの長さと関係があるかどうかはわかりません.

配列の長さが 160 の場合、これはフレーム長が 10 であることを意味しますか? 160 / 1 / 16. これを行うと、バイナリ ファイルに 10 バイトのデータしか格納できません。

于 2012-06-14T00:00:30.053 に答える
1

説明からエラーがどこにあるかを知るのは難しいですが、質問に答えるために、ファイルを開いたときに「RIFF」が表示された場合、それはヘッダーがあることを意味します。独自のヘッダーを作成することは可能ですが、少し時間がかかります(ヘッダーがあるので不要です)。

これで、読み取るときに、手動で指定するよりも、ファイル自体から形式を取得するのが最も安全です。これにより、エラーが発生しにくくなります。そのためのサンプルコードがここにあります:

http://www.jsresources.org/examples/SimpleAudioPlayer.java.html

書くとき、あなたは「ファイルはうまく書きますが、それはすべて静的です」と言います-あなたはあなた自身のJavaコード以外のものでそれを確認しましたか?正しく理解していないかもしれませんが、新しいJavaコードを使用してWAVファイルを録音および再生しようとしているようです。その場合、録音または再生に問題があるかどうかを判断するのは困難です。

メディアプレーヤーやQuickTimeなどでファイルを開き、録音が機能したことを確認できるように、バニラ形式(16ビット、ステレオ、非圧縮、44,100 kHz)から始める必要があります。それが機能したら、SRなどを変更してみることができます。録音用のサンプルコードを次に示します。それから始めて、それが機能することを確認してから、より複雑なものに移ります。

http://www.jsresources.org/examples/SimpleAudioRecorder.java.html

于 2012-06-12T15:05:55.557 に答える