Я пытаюсь реализовать функцию паузы / возобновления для моего модуля аудиозаписи в 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()
, хотя я включилкод целиком для полноты.
Может ли кто-нибудь указать мне правильное направление относительно того, почему это может происходить?Любая помощь будет высоко ценится.