Cómo reproducir un archivo de audio usando Java

En este artículo veremos cómo podemos reproducir un archivo de audio en Java puro, aquí puro significa que no vamos a utilizar ninguna biblioteca externa. Puede crear su propio reproductor de música con la ayuda de este artículo. Las bibliotecas incorporadas de Java solo admiten formatos AIFC, AIFF, AU, SND y WAVE.
Hay 2 interfaces diferentes que se pueden usar para este propósito Clip y SourceDataLine. En este artículo, discutiremos la reproducción de archivos de audio usando solo Clip y veremos los diversos métodos de clip. Cubriremos las siguientes operaciones:

  1. Comienzo.
  2. Pausa.
  3. Reanudar.
  4. Reiniciar.
  5. Deténgase
  6. Salta a una posición específica de la reproducción.

Reproducir audio usando clip

Clip es una interfaz java disponible en el paquete javax.sound.sampled e introducida en Java7.
Se deben seguir los siguientes pasos para reproducir un objeto de clip.

  1. Cree un objeto de AudioInputStream usando AudioSystem.getAudioInputStream (archivo). AudioInputStream convierte un archivo de audio en flujo.
  2. Obtenga un objeto de referencia de clip de AudioSystem.
  3. Transmita un flujo de entrada de audio desde el cual los datos de audio se leerán en el clip utilizando el método open() de la interfaz Clip.
  4. Establezca las propiedades requeridas para el clip como posición de cuadro, bucle, posición de microsegundos.
  5. Iniciar el 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);
    }
  
}

En el programa anterior, hemos utilizado AudioInputStream , que es una clase en Java para leer archivos de audio como una secuencia. Como cada flujo de Java, si se va a utilizar de nuevo, debe reiniciarse.

  • Para pausar la reproducción, debemos detener el reproductor y almacenar el cuadro actual en un objeto. Para que mientras reanudemos podamos usarlo. Al reanudar solo tenemos que volver a jugar el jugador de la última posición que dejamos.
    El método clip.getMicrosecondPosition() devuelve la posición actual del audio y clip.setMicrosecondPosition(long position) establece la posición actual del audio.
  • Para detener la reproducción, debe cerrar el clip; de lo contrario, permanecerá abierto. También he usado clip.loop(Clip.LOOP_CONTINOUSLY) para probar. Debido a que los archivos wav son generalmente pequeños, he reproducido el mío en un bucle.
  • Puntos importantes:

  1. Siempre cierre su flujo y recursos abiertos antes de salir del programa.
  2. Tienes que detener el clip antes de volver a reproducirlo. Así que mantenga los controles adecuados.
  3. Si AudioInputStream se va a utilizar de nuevo, debe restablecerse.

 
Este artículo es una contribución de Vishal Garg . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *