Приостановка записи звука на Java - PullRequest
3 голосов
/ 06 марта 2019

Я пытаюсь реализовать функцию паузы / возобновления для моего модуля аудиозаписи в Java.Пока что все, что я нашел на SO, это this , который не дает однозначного ответа - я попробовал предложение ответчика о вызове start() и stop() на TargetDataLine для достижения этого, иЯ знаю, что stop() (из Oracle):

"Останавливает линию. Остановленная линия должна прекратить деятельность ввода-вывода. Однако, если линия открыта и работает, она должна сохранить ресурсытребуется для возобновления активности. Остановленная линия должна сохранять любые аудиоданные в своем буфере, а не сбрасывать их, чтобы при возобновлении ввод-вывод мог продолжаться там, где он был прерван, если это возможно. "

ОднакоЯ обнаружил, что когда я звоню стоп на моем TargetDataLine, затем сплю в течение пяти секунд и звоню start(), чтобы открыть его снова, запись никогда не возобновляется.Вот код:

import java.io.*;
import java.util.Timer;
import java.util.TimerTask;

import javax.sound.sampled.*;
import javax.sound.sampled.AudioFileFormat.Type;

public class AudioRecorder
{
    static TargetDataLine targetLine = null;
    static final long maxRecordingTime = 3600000; // One hour in milliseconds
    static Thread recordThread;

    public static void main(String[] args)
    {
        try
        {
            // Initialise audio format settings and setup data line matching format specification

            initialiseAudioSettings();
        }
        catch (LineUnavailableException e)
        {
            e.printStackTrace();
        }

        // TEST

        startRecording();

        try
        {
            System.out.println("Sleeping for 5s...");
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        System.out.println("About to pause recording...");

        pauseRecording();

        try
        {
            System.out.println("Sleeping for 5s...");
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        System.out.println("About to resume recording...");

        resumeRecording();

        try
        {
            System.out.println("Sleeping for 5s...");
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        System.out.println("About to stop recording...");

        stopRecording();

        System.out.println("Recording stopped...(in theory)");

        // /TEST
    }

    private static void initialiseAudioSettings() throws LineUnavailableException
    {
        // Define audio format as:
        // Encoding: Linear PCM
        // Sample Rate: 44.1 kHz
        // Bit Depth: 16-bit
        // Channel Format: Stereo
        // Data Storage: Signed & Big-Endian

        final AudioFormat audioFormat = new AudioFormat(44100, 16, 2, true, true);

        // Store format metadata in an Info variable 

        final DataLine.Info audioFormatInfo = new DataLine.Info(TargetDataLine.class, audioFormat);

        if (!AudioSystem.isLineSupported(Port.Info.MICROPHONE))
        {
            throw new LineUnavailableException("No microphone has been detected. Please reconnect the microphone and try again.");
        } else
        {
            System.out.println("Microphone detected. Querying target data line...");
        }

        // Use metadata to ascertain whether audio format is supported by default input device

        if (AudioSystem.isLineSupported(audioFormatInfo) == false)
        {
            throw new LineUnavailableException("The default input device does not support the specified audio output format");
        }

        // Get a line matching the specified audio format 

        targetLine = (TargetDataLine)AudioSystem.getLine(audioFormatInfo);

        // Instruct the system to allocate resources to the targetLine and switch it on

        targetLine.open();

        // Prepare line for audio input

        targetLine.start();
    }

    private static void startRecording()
    {
        TimerTask scheduleRecordingEnd = new TimerTask()
                {
                    public void run()
                    {
                        stopRecording();
                    }
                };

        Timer recordingTimer = new Timer("Recording Timer");

        recordingTimer.schedule(scheduleRecordingEnd, maxRecordingTime);

        // Setup recording thread

        recordThread = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                {
                    // Route audio input stream to target data line

                    AudioInputStream audioInputStream = new AudioInputStream(targetLine);

                    // Instantiate output filepath & filename

                    File outputFile = new File("C:/temp/test.wav");

                    // Write input audio to output .wav file

                    try
                    {
                        AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, outputFile);
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        });

        // Start recording

        recordThread.start();
    }

    private static void pauseRecording()
    {
        targetLine.stop();
    }

    private static void resumeRecording()
    {   
        targetLine.start();
    }

    private static void stopRecording()
    {
        // Cease all I/O functions of the line

        targetLine.stop();

        // Close the line, deallocating system resources and deleting metadata

        targetLine.close();

        System.out.println("Stopping recording...");

        recordThread.stop();
    }
}

Частями этого кода, которые должны представлять интерес, являются тесты функций main() и startRecording(), pauseRecording() и resumeRecording(), хотя я включилкод целиком для полноты.

Может ли кто-нибудь указать мне правильное направление относительно того, почему это может происходить?Любая помощь будет высоко ценится.

...