簡體   English   中英

停止錄制聲音-Java

[英]Stop recording sound - Java

當我按“控制台停止”時,我編寫的代碼不會停止記錄。 我不明白我做錯了什么。 您能否看一下下面的代碼,並建議我的錯誤在哪里?

這里是:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class Main {

    final static int MONO = 1;
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;

    public static void main(String[] args) {
        AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                16000, 16, MONO, 2, 16000, true);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        int numb = 1;
        String files = "C:\\test\\music\\lala" + numb + "." + fileType;
        File fileOut = new File(files);

        if (!AudioSystem.isLineSupported(info)) {
            System.out.println("Line nit supporot!");
        }
        System.out.println("To stop recording a sound lead - stop");
        Scanner sc = new Scanner(System.in);
        String scc;
        TargetDataLine mike = null;
        try {
            mike = (TargetDataLine) AudioSystem.getLine(info);
            mike.open(format);
            AudioInputStream sound = new AudioInputStream(mike);
            mike.start();
            AudioSystem.write(sound, fileType, fileOut);

            scc = sc.nextLine();
            if (scc.equals("stop")) {
                System.out.println("recording is stopped!");
                mike.stop();
                sound.close();
                System.exit(0);
            }
        } catch (LineUnavailableException e) {
            System.out.println("line not avaible");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

這是行不通的:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class Main implements Runnable {

    final static int MONO = 1;
    private static AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
    private static TargetDataLine mike;
    private static AudioInputStream sound;

    public static void main(String[] args) {
        AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                16000, 16, MONO, 2, 16000, true);
        DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
        int numb = 1;
        String files = "C:\\test\\music\\lala" + numb + "." + fileType;
        File fileOut = new File(files);

        if (!AudioSystem.isLineSupported(info)) {
            System.out.println("Line nit supporot!");
        }
        System.out.println("Для остановки записи звука введите - g");
        try {
            mike = (TargetDataLine) AudioSystem.getLine(info);
            mike.open(format);
            sound = new AudioInputStream(mike);
            mike.start();
            AudioSystem.write(sound, fileType, fileOut);

        } catch (LineUnavailableException e) {
            System.out.println("line not avaible");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        Scanner sc = new Scanner(System.in);
        String scc;

        scc = sc.nextLine();
        if (scc.equals("g")) {
            System.out.println("Запись звука остановлена");
            mike.stop();
            try {
                sound.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.exit(0);
        }

    }
}

據我所知,您的上述實現缺少主要的代碼部分。 您似乎正在捕獲該行(我沒有嘗試運行或調試上面的內容),但是沒有任何顯示您實際從該行讀取數據的位置!

如果您查閱Java教程中的示例,則教程“捕獲音頻”中標題為從TargetDataLine讀取數據的部分顯示了此過程的代碼。 注意使用布爾值“!stopped”。 該布爾值可用於停止while循環,以便從外部線程進行讀取,例如按下按鈕的結果。 為了獲得最佳性能,應將布爾值指定為volatile,並提供一個公共方法,該方法允許您將其值設置為“ false”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM