Как воспроизвести аудиофайл с помощью Java

Опубликовано: 14 Июля, 2021

В этой статье мы увидим, как мы можем воспроизвести аудиофайл на чистом java, здесь чистый означает, что мы не собираемся использовать какую-либо внешнюю библиотеку. Вы можете создать свой собственный музыкальный проигрыватель с помощью этой статьи. Встроенные библиотеки Java поддерживают только форматы AIFC, AIFF, AU, SND и WAVE.
Для этой цели можно использовать 2 разных интерфейса - Clip и SourceDataLine. В этой статье мы обсудим воспроизведение аудиофайла только с помощью Clip и рассмотрим различные методы клипа. Мы рассмотрим следующие операции:

  1. Начинать.
  2. Пауза.
  3. Резюме.
  4. Запустить снова.
  5. Стоп
  6. Переход к определенной позиции воспроизведения.

Воспроизведение аудио с помощью клипа

Clip - это java-интерфейс, доступный в пакете javax.sound.sampled и представленный в Java7.
Для воспроизведения объекта-клипа необходимо выполнить следующие шаги.

  1. Создайте объект AudioInputStream с помощью AudioSystem.getAudioInputStream (файл-файл). AudioInputStream преобразует аудиофайл в поток.
  2. Получите объект ссылки на клип из AudioSystem.
  3. Выполните потоковую передачу входного аудиопотока, из которого аудиоданные будут считаны в клип, используя метод open () интерфейса Clip.
  4. Установите требуемые свойства для клипа, такие как положение кадра, цикл, положение в микросекундах.
  5. Начать клип




// 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, как правило, маленькие, я воспроизводил свои в цикле.

    Важные точки:

    1. Всегда закрывайте открытый поток и ресурсы перед выходом из программы.
    2. Вы должны остановить клип перед его повторным воспроизведением. Так что проводите надлежащие проверки.
    3. Если AudioInputStream будет использоваться снова, его необходимо сбросить.


    Эта статья предоставлена Вишалом Гаргом . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

    Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.