Как воспроизвести аудиофайл с помощью Java
В этой статье мы увидим, как мы можем воспроизвести аудиофайл на чистом java, здесь чистый означает, что мы не собираемся использовать какую-либо внешнюю библиотеку. Вы можете создать свой собственный музыкальный проигрыватель с помощью этой статьи. Встроенные библиотеки Java поддерживают только форматы AIFC, AIFF, AU, SND и WAVE.
Для этой цели можно использовать 2 разных интерфейса - Clip и SourceDataLine. В этой статье мы обсудим воспроизведение аудиофайла только с помощью Clip и рассмотрим различные методы клипа. Мы рассмотрим следующие операции:
- Начинать.
- Пауза.
- Резюме.
- Запустить снова.
- Стоп
- Переход к определенной позиции воспроизведения.
Воспроизведение аудио с помощью клипа
Clip - это java-интерфейс, доступный в пакете javax.sound.sampled и представленный в Java7.
Для воспроизведения объекта-клипа необходимо выполнить следующие шаги.
- Создайте объект AudioInputStream с помощью AudioSystem.getAudioInputStream (файл-файл). AudioInputStream преобразует аудиофайл в поток.
- Получите объект ссылки на клип из AudioSystem.
- Выполните потоковую передачу входного аудиопотока, из которого аудиоданные будут считаны в клип, используя метод open () интерфейса Clip.
- Установите требуемые свойства для клипа, такие как положение кадра, цикл, положение в микросекундах.
- Начать клип
// Java program to play an Audio // file using Clip Object import java.io.File; import java.io.IOException; import java.util.Scanner; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class SimpleAudioPlayer { // to store current position Long currentFrame; Clip clip; // current status of clip String status; AudioInputStream audioInputStream; static String filePath; // constructor to initialize streams and clip public SimpleAudioPlayer() throws UnsupportedAudioFileException, IOException, LineUnavailableException { // create AudioInputStream object audioInputStream = AudioSystem.getAudioInputStream( new File(filePath).getAbsoluteFile()); // create clip reference clip = AudioSystem.getClip(); // open audioInputStream to the clip clip.open(audioInputStream); clip.loop(Clip.LOOP_CONTINUOUSLY); } public static void main(String[] args) { try { filePath = "Your path for the file" ; SimpleAudioPlayer audioPlayer = new SimpleAudioPlayer(); audioPlayer.play(); Scanner sc = new Scanner(System.in); while ( true ) { System.out.println( "1. pause" ); System.out.println( "2. resume" ); System.out.println( "3. restart" ); System.out.println( "4. stop" ); System.out.println( "5. Jump to specific time" ); int c = sc.nextInt(); audioPlayer.gotoChoice(c); if (c == 4 ) break ; } sc.close(); } catch (Exception ex) { System.out.println( "Error with playing sound." ); ex.printStackTrace(); } } // Work as the user enters his choice private void gotoChoice( int c) throws IOException, LineUnavailableException, UnsupportedAudioFileException { switch (c) { case 1 : pause(); break ; case 2 : resumeAudio(); break ; case 3 : restart(); break ; case 4 : stop(); break ; case 5 : System.out.println( "Enter time (" + 0 + ", " + clip.getMicrosecondLength() + ")" ); Scanner sc = new Scanner(System.in); long c1 = sc.nextLong(); jump(c1); break ; } } // Method to play the audio public void play() { //start the clip clip.start(); status = "play" ; } // Method to pause the audio public void pause() { if (status.equals( "paused" )) { System.out.println( "audio is already paused" ); return ; } this .currentFrame = this .clip.getMicrosecondPosition(); clip.stop(); status = "paused" ; } // Method to resume the audio public void resumeAudio() throws UnsupportedAudioFileException, IOException, LineUnavailableException { if (status.equals( "play" )) { System.out.println( "Audio is already " + "being played" ); return ; } clip.close(); resetAudioStream(); clip.setMicrosecondPosition(currentFrame); this .play(); } // Method to restart the audio public void restart() throws IOException, LineUnavailableException, UnsupportedAudioFileException { clip.stop(); clip.close(); resetAudioStream(); currentFrame = 0L; clip.setMicrosecondPosition( 0 ); this .play(); } // Method to stop the audio public void stop() throws UnsupportedAudioFileException, IOException, LineUnavailableException { currentFrame = 0L; clip.stop(); clip.close(); } // Method to jump over a specific part public void jump( long c) throws UnsupportedAudioFileException, IOException, LineUnavailableException { if (c > 0 && c < clip.getMicrosecondLength()) { clip.stop(); clip.close(); resetAudioStream(); currentFrame = c; clip.setMicrosecondPosition(c); this .play(); } } // Method to reset audio stream public void resetAudioStream() throws UnsupportedAudioFileException, IOException, LineUnavailableException { audioInputStream = AudioSystem.getAudioInputStream( new File(filePath).getAbsoluteFile()); clip.open(audioInputStream); clip.loop(Clip.LOOP_CONTINUOUSLY); } } |
В приведенной выше программе мы использовали AudioInputStream, который является классом в Java для чтения аудиофайла в виде потока. Как и любой поток Java, если он будет использоваться снова, его необходимо сбросить.
- Чтобы приостановить воспроизведение, мы должны остановить проигрыватель и сохранить текущий кадр в объекте. Чтобы при возобновлении мы могли его использовать. При возобновлении нам просто нужно снова сыграть игрока с последней позиции, которую мы оставили.
Метод clip.getMicrosecondPosition () возвращает текущую позицию аудио, а clip.setMicrosecondPosition (длинная позиция) устанавливает текущую позицию аудио. - Чтобы остановить воспроизведение, вы должны закрыть клип, иначе он останется открытым. Я также использовал clip.loop (Clip.LOOP_CONTINOUSLY) для тестирования. Поскольку файлы wav, как правило, маленькие, я воспроизводил свои в цикле.
Важные точки:
- Всегда закрывайте открытый поток и ресурсы перед выходом из программы.
- Вы должны остановить клип перед его повторным воспроизведением. Так что проводите надлежащие проверки.
- Если AudioInputStream будет использоваться снова, его необходимо сбросить.
Эта статья предоставлена Вишалом Гаргом . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.