4

私は Java を初めて使用し、構文と構造をマスターしましたが、マイクから処理されたデジタル オーディオ サンプルを取得するのに苦労しています。

私が達成しようとしているのは非常に単純ですが、長期的には非常に単純なスペクトログラムを作成しようとしていますが、オーディオ操作プロセスを理解/習得するために、ゼロから始めようとしています。


これが私の問題です

マイクが 1 回のビープ音または何らかの音を検出したら、そのバイナリ データをキャプチャし、そのままの形式で表示したいと考えています。


JAVA にそれを求めるのは本当に多すぎるのでしょうか?

アナログ/デジタル信号、FFT、matlab について読んだことがあり、次のような多くのリンクを検索しました。

Web ページからのストリーミング ブロードキャストのオーディオを録音する方法はありますか?

Java でオーディオを操作する

OpenAL 再生キャプチャ オーディオ データ c++

オラクルからの有名な紹介

http://docs.oracle.com/javase/tutorial/sound/capturing.html

これは実際には良いチュートリアルですhttp://www.developer.com/java/other/article.php/3380031/Spectrum-Analysis-using-Java-Sampling-Frequency-Folding-Frequency-and-the-FFT-Algorithm .htm

しかし、それらはすべて、私の答えに対する解決策を提供するには不十分です。

コードを要求しているわけではありませんが、すべての行を読んで関連するメカニズムを理解するだけでも素晴らしいでしょうが、簡単なヒントも同様に素晴らしいでしょう.


wavそして、これはバイトをキャプチャするための簡単なコードですが、既存のファイルからのみです

import java.io.FileInputStream;
import java.io.IOException;

public class Boo{
    public static void main(String[] arguments){
        try {
            FileInputStream file = new FileInputStream("beep.wav");
            boolean eof = false;
            int count = 0;
            while(!eof){
                int input = file.read();
                System.out.print(input + "");
                if(input == -1)
                    eof = true;
                else 
                    count++;
            }
            file.close();
            System.out.println("\nBytes read: " + count);
        }catch (IOException e){
            System.out.println("Error - " + e.toString());
        }
    }
}

バウンティ後

-より分かりやすくするために-

マイクから読み取るだけの簡単なプログラムにしようとしています。キャプチャしたサウンドのバイナリ データをリアルタイムで表示します。

スペクトログラムのようなものだと考えてください。音がキャプチャされると、さまざまな信号レベルに応じてグラフが上下しますが、この場合、バイナリ データをオーディオ グラフに変換する必要はなく、生の音を表示するだけです。データそのもの。ファイルを読み書きする必要はありません。マイクからキャプチャして、マイクから読み取ったものを表示するだけです。

上記の方法が難しい場合は、ウェブ全体を検索しても役立つものが見つからなかったので、ガイド/指示を教えてください..ありがとう

4

4 に答える 4

8

javax.sound.sampledパッケージには、必要なものがすべて含まれている必要があります。

例:

    int duration = 5; // sample for 5 seconds
    TargetDataLine line = null;
    // find a DataLine that can be read
    // (maybe hardcode this if you have multiple microphones)
    Info[] mixerInfo = AudioSystem.getMixerInfo();
    for (int i = 0; i < mixerInfo.length; i++) {
        Mixer mixer = AudioSystem.getMixer(mixerInfo[i]);
        Line.Info[] targetLineInfo = mixer.getTargetLineInfo();
        if (targetLineInfo.length > 0) {
            line = (TargetDataLine) mixer.getLine(targetLineInfo[0]);
            break;
        }
    }
    if (line == null)
        throw new UnsupportedOperationException("No recording device found");
    AudioFormat af = new AudioFormat(11000, 8, 1, true, false);
    line.open(af);
    line.start();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buf = new byte[(int)af.getSampleRate() * af.getFrameSize()];
    long end = System.currentTimeMillis() + 1000 * duration;
    int len;
    while (System.currentTimeMillis() < end && ((len = line.read(buf, 0, buf.length)) != -1)) {
        baos.write(buf, 0, len);
    }
    line.stop();
    line.close();
    baos.close();

その後、バイト配列出力ストリームからバイトを掘り出すことができます。もちろん、必要に応じてwhileループ内で処理することもできます。

于 2013-07-02T19:14:33.843 に答える