2

サウンドに関するJavaのチュートリアルを読みましたが、どういうわけか、初心者には複雑すぎます。
ここにあります
私の目的はこれです:

  • すべてのオーディオ入力および出力デバイスを検出します
  • ユーザーに音声入力デバイスを選択させる
  • ユーザーの発言をキャプチャする
  • デフォルトのオーディオ出力デバイスに出力します
  • さて、どうすればそれを行うことができますか?
    より良いチュートリアルがありますか?
    私が試したこと:

    import javax.sound.sampled.*;
    public class SoundTrial {
        public static void main(String[] args) {
            Mixer.Info[] info = AudioSystem.getMixerInfo();
            int i =0;
            for(Mixer.Info print : info){
    
                System.out.println("Name: "+ i + " " + print.getName());
                i++;
            }
        }
    }  
    

    出力:

    Name: 0 Primary Sound Driver
    Name: 1 Speakers and Headphones (IDT High Definition Audio CODEC)
    Name: 2 Independent Headphones (IDT High Definition Audio CODEC
    Name: 3 SPDIF (Digital Out via HP Dock) (IDT High Definition Audio CODEC)
    Name: 4 Primary Sound Capture Driver
    Name: 5 Integrated Microphone Array (ID
    Name: 6 Microphone (IDT High Definition
    Name: 7 Stereo Mix (IDT High Definition
    Name: 8 Port Speakers and Headphones (IDT Hi
    Name: 9 Port SPDIF (Digital Out via HP Dock)
    Name: 10 Port Integrated Microphone Array (ID
    Name: 11 Port Microphone (IDT High Definition
    Name: 12 Port Stereo Mix (IDT High Definition
    Name: 13 Port Independent Headphones (IDT Hi
    
    4

    1 に答える 1

    3

    このコードはあなたを助けるかもしれません。これは、次のリンクから取得されていることに注意してください:オーディオビデオ。Google検索を使用して見つけたので、リンクが古くなった場合に備えて、ここにコードを投稿しました。

    インポートjavax.media。*;
    importjavax.media.format。*;
    importjavax.media.protocol。*;
    importjava.util。*;
    
    / ************************************************* ******************************
     *ユーザーがデバイスを介してオーディオまたはビデオをキャプチャできるようにするシンプルなアプリケーション
     *PCに接続されています。コマンドライン引数を介して、ユーザーは次のことを指定します。
     *オーディオ(-a)またはビデオ(-v)キャプチャ、キャプチャの期間(-d)
     *秒、およびメディアを書き込むファイル(-f)。
     *
     *アプリケーションが制御を提供する場合、アプリケーションははるかに便利で用途が広いでしょう
     *キャプチャされたオーディオとビデオのフォーマット、およびコンテンツタイプ
     *出力の。
     *
     *クラスは、特定のデフォルトをサポートするキャプチャデバイスを検索します
     *トラックフォーマット:オーディオの場合はリニア、ビデオの場合はCinepak。フォールバック2として
     *デバイス名は、方法の例としてアプリケーションにハードコードされています
     *デバイスの名前がわかっているときにDeviceInfoを取得します。ユーザーは強制的に
     * -k(既知のデバイス)フラグを使用してこれらの名前を使用するアプリケーション。
     *
     *クラスは静的ですが、以前のLocation2Locationの例を使用して
     *すべてのプロセッサおよびDataSink関連の作業を実行します。したがって、アプリケーション
     *主にCaptureDevice関連の操作が含まれます。
     *
     * @author Michael(Spike)Barlow
     ************************************************** **************************** /
    パブリッククラスSimpleRecorder{
    
      ////////////////////////////////////////////////// ///////////
      //上のオーディオおよびビデオキャプチャデバイスの名前
      //作成者のシステム。これらはシステムごとに異なりますが、
      //フォールバックとしてのみ使用されます。
      ////////////////////////////////////////////////// ///////////
      private static final String AUDIO_DEVICE_NAME = "DirectSoundCapture";
    
      private static final String VIDEO_DEVICE_NAME = "vfw:Microsoft WDM Image Capture:0";
    
      ////////////////////////////////////////////////// /////////
      //出力を書き込むファイルのデフォルト名
      //ユーザーが提供していない場合。
      ////////////////////////////////////////////////// ////////
      private static final String DEFAULT_AUDIO_NAME = "file://./captured.wav";
    
      private static final String DEFAULT_VIDEO_NAME = "file://./captured.avi";
    
      ///////////////////////////////////////////
      //ユーザーが要求したキャプチャのタイプ。
      //////////////////////////////////////////
      private static final String AUDIO = "audio";
    
      private static final String VIDEO = "video";
    
      private static final String BOTH="オーディオとビデオ";
    
      ////////////////////////////////////////////////// //////////////////
      //特定のアプリケーションが使用する唯一のオーディオおよびビデオ形式
      //サポートします。より良いプログラムは、ユーザーがフォーマットを選択できるようにするでしょう
      //ただし、小さな例のサイズを超えて大きくなります。
      ////////////////////////////////////////////////// //////////////////
      private static final Format AUDIO_FORMAT = new AudioFormat(
          AudioFormat.LINEAR);
    
      private static final Format VIDEO_FORMAT = new VideoFormat(
          VideoFormat.CINEPAK);
    
      public static void main(String [] args){
    
        ////////////////////////////////////////////////// ////
        //の処理とシンクを処理するオブジェクト
        //デバイスからキャプチャされたデータ。
        ////////////////////////////////////////////////// ////
        Location2Locationキャプチャ;
    
        /////////////////////////////////////
        //オーディオおよびビデオキャプチャデバイス。
        ////////////////////////////////////
        CaptureDeviceInfo audioDevice = null;
        CaptureDeviceInfo videoDevice = null;
    
        ////////////////////////////////////////////////// ///////////
        //デバイスの「場所」に加えての名前と場所をキャプチャします
        //宛先。
        ////////////////////////////////////////////////// ///////////
        MediaLocatorcaptureLocation = null;
        MediaLocator destinationLocation;
        文字列destinationName=null;
    
        ////////////////////////////////////////////////// //////////
        //プロセッサ(Location2Location内)が一致する必要があるフォーマット。
        ////////////////////////////////////////////////// //////////
        Format [] format = new Format [1];
    
        ///////////////////////////////////////////////
        //オーディオまたはビデオキャプチャのコンテンツタイプ。
        //////////////////////////////////////////////
        ContentDescriptor audioContainer = new ContentDescriptor(
            FileTypeDescriptor.WAVE);
        ContentDescriptor videoContainer = new ContentDescriptor(
            FileTypeDescriptor.MSVIDEO);
        ContentDescriptorコンテナ=null;
    
        ////////////////////////////////////////////////// //////////////////
        //記録の期間(秒単位)とその後待機する期間
        ////////////////////////////////////////////////// /////////////////
        ダブルデュレーション=10;
        int waitFor = 0;
    
        //////////////////////////
        //オーディオまたはビデオキャプチャ?
        //////////////////////////
        選択された文字列=AUDIO;
    
        ////////////////////////////////////////////////// //////
        //問題のフォーマットをサポートするすべてのデバイス。
        //プログラムが異なる上で動作することを「保証」する手段
        //異なるキャプチャデバイスを備えたマシン。
        ////////////////////////////////////////////////// //////
        ベクターデバイス;
    
        ////////////////////////////////////////////////// ////////
        //をサポートするキャプチャデバイスを検索するかどうか
        //名前がすでにあるデバイスをフォーマットまたは使用する
        //アプリケーションに認識されています。
        ////////////////////////////////////////////////// ////////
        boolean useKnownDevices = false;
    
        ////////////////////////////////////////////////// ///////
        //オーディオまたはビデオに関するコマンドラインオプションを処理します。
        //期間、および保存するファイル。
        ////////////////////////////////////////////////// ///////
        for(int i = 0; i 0 &&!useKnownDevices){
            audioDevice =(CaptureDeviceInfo)devices.elementAt(0);
          } そうしないと
            audioDevice = CaptureDeviceManager.getDevice(AUDIO_DEVICE_NAME);
          if(audioDevice == null){
            System.out.println( "適切なオーディオデバイスが見つかりません。終了します");
            System.exit(1);
          }
          CaptureLocation = audioDevice.getLocator();
          format [0] = AUDIO_FORMAT;
          if(destinationName == null)
            destinationName = DEFAULT_AUDIO_NAME;
          コンテナ=audioContainer;
        }
        ////////////////////////////////////////////////// ///////////////
        //ビデオキャプチャのセットアップを実行します。適切なものを見つけることを含みます
        //デバイス、MediaLocatorを取得し、コンテンツを設定します
        // タイプ。
        ////////////////////////////////////////////////// //////////////
        else if(selected.equals(VIDEO)){
          デバイス=CaptureDeviceManager.getDeviceList(VIDEO_FORMAT);
          if(devices.size()> 0 &&!useKnownDevices)
            videoDevice =(CaptureDeviceInfo)devices.elementAt(0);
          そうしないと
            videoDevice = CaptureDeviceManager.getDevice(VIDEO_DEVICE_NAME);
          if(videoDevice == null){
            System.out.println( "適切なビデオデバイスが見つかりません。終了します");
            System.exit(1);
          }
          CaptureLocation = videoDevice.getLocator();
          format [0] = VIDEO_FORMAT;
          if(destinationName == null)
            destinationName = DEFAULT_VIDEO_NAME;
          コンテナ=videoContainer;
        } else if(selected.equals(BOTH)){
          CaptureLocation = null;
          format = new Format [2];
          format [0] = AUDIO_FORMAT;
          format [1] = VIDEO_FORMAT;
          コンテナ=videoContainer;
          if(destinationName == null)
            destinationName = DEFAULT_VIDEO_NAME;
        }
    
        ////////////////////////////////////////////////// //////////////////
        //必要なすべてのプロセッサとDataSinkの準備を
        //Location2Locationクラス。
        ////////////////////////////////////////////////// //////////////////
        destinationLocation = new MediaLocator(destinationName);
        System.out.println( "キャプチャの構成。お待ちください。");
        キャプチャ=新しいLocation2Location(captureLocation、destinationLocation、
            フォーマット、コンテナ、1.0);
    
        ////////////////////////////////////////////////// ///////////////////////////
        //録音を開始し、ユーザーに伝えます。の長さを指定します
        // 録音。次に、最大4倍の期間待機します。
        // 録音
        //(データのシンク/書き込みに時間がかかる可能性があるため、少し待つ必要があります)。
        ////////////////////////////////////////////////// ///////////////////////////
        System.out.println("記録を開始しました"+継続時間+"秒数"
            +選択済み+"...");
        Capture.setStopTime(new Time(duration));
        if(waitFor == 0)
          waitFor =(int)(4000 *期間);
        そうしないと
          waitFor * = 1000;
        int waited = fetch.transfer(waitFor);
    
        ////////////////////////////////////////////////// ///////
        //記録の成功(またはその他)について報告します。
        ////////////////////////////////////////////////// ///////
        int state = fetch.getState();
        if(state == Location2Location.FINISHED)
          System.out.println(選択済み
              +「キャプチャは約で成功しました」
              +((int)((waited + 500)/ 1000))
              +"秒。"+destinationNameに書き込まれるデータ);
        else if(state == Location2Location.FAILED)
          System.out.println(選択済み
              +「キャプチャは約後に失敗しました」
              +((int)((waited + 500)/ 1000))+ "秒");
        そうしないと {
          System.out.println(選択済み
              +「キャプチャは約後も進行中です」
              +((int)((waited + 500)/ 1000))+ "秒");
          System.out.println( "プロセスが失敗した可能性があります");
        }
    
        System.exit(0);
      }
    }
    
    
    于 2012-12-20T07:24:27.383 に答える