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:
- Comienzo.
- Pausa.
- Reanudar.
- Reiniciar.
- Deténgase
- 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.
- Cree un objeto de AudioInputStream usando AudioSystem.getAudioInputStream (archivo). AudioInputStream convierte un archivo de audio en flujo.
- Obtenga un objeto de referencia de clip de AudioSystem.
- 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.
- Establezca las propiedades requeridas para el clip como posición de cuadro, bucle, posición de microsegundos.
- 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:
- Siempre cierre su flujo y recursos abiertos antes de salir del programa.
- Tienes que detener el clip antes de volver a reproducirlo. Así que mantenga los controles adecuados.
- 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