मैं जावा में ध्वनि कैसे खेल सकता हूं?


173

मैं अपने कार्यक्रम में ध्वनि फ़ाइलों को चलाने में सक्षम होना चाहता हूं। मुझे कहाँ देखना चाहिए?


1
इस वर्ग पर एक नज़र डालें: github.com/dberm22/DBoard/blob/master/src/com/dberm22/utils/… आप इसे (नए थ्रेड (नए MediaPlayer (POSHTOFILE))) से शुरू कर सकते हैं ();
dberm22

जवाबों:


133

मैंने निम्नलिखित कोड लिखा जो ठीक काम करता है। लेकिन मुझे लगता है कि यह केवल .wavप्रारूप के साथ काम करता है ।

public static synchronized void playSound(final String url) {
  new Thread(new Runnable() {
  // The wrapper thread is unnecessary, unless it blocks on the
  // Clip finishing; see comments.
    public void run() {
      try {
        Clip clip = AudioSystem.getClip();
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
          Main.class.getResourceAsStream("/path/to/sounds/" + url));
        clip.open(inputStream);
        clip.start(); 
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
    }
  }).start();
}

7
यादृच्छिक समय पर क्लिप को बंद करने से बचने के लिए, एक लाइनलिस्टर की आवश्यकता होती है। एक नज़र है: stackoverflow.com/questions/577724/trouble-playing-wav-in-java/…
yanchenko

3
सार्वजनिक API का उपयोग करने वाले समाधान के लिए +1। हालांकि एक नया धागा अनावश्यक (अनावश्यक) नहीं बना रहा है?
जातरो

4
थैंक्स .. क्या यह बेमानी है? मैंने इसे एक नए धागे में बनाया ताकि मैं पहले क्लिप के समाप्त होने से पहले फिर से ध्वनि बजा सकूं।
जेक

4
मुझे पता है कि क्लिप.स्टार्ट () एक नया धागा पैदा करता है, इसलिए मुझे पूरा यकीन है कि यह अनावश्यक है।
जतरो

44
1) Threadअनावश्यक है 2) उपयोग करने के एक अच्छे उदाहरण के लिए Clip, JavaSound जानकारी देखें पेज । 3) यदि किसी विधि को एक URL(या File) की आवश्यकता होती है, तो उसे एक खतरा देना चाहिएURLFile तो उसे स्वीकार करने के बजाय (या ) दें Stringजो एक का प्रतिनिधित्व करता है। (सिर्फ एक व्यक्तिगत 'मेरे बोनट में मधुमक्खी'।) 4) e.printStackTrace();से कम टाइपिंग के साथ अधिक जानकारी प्रदान करता है System.err.println(e.getMessage());
एंड्रयू थॉम्पसन

18

एक बुरा उदाहरण:

import  sun.audio.*;    //import the sun.audio package
import  java.io.*;

//** add this into your application code as appropriate
// Open an input stream  to the audio file.
InputStream in = new FileInputStream(Filename);

// Create an AudioStream object from the input stream.
AudioStream as = new AudioStream(in);         

// Use the static class member "player" from class AudioPlayer to play
// clip.
AudioPlayer.player.start(as);            

// Similarly, to stop the audio.
AudioPlayer.player.stop(as); 

13
java.sun.com/products/jdk/faq/faq-sun-packages.html sun.audio का उपयोग करने के लिए सार्वजनिक API विकल्प हैं।
मैकडॉवेल

4
@GregHurlman सूरज नहीं है। * पैकेज हमारे डेवलपर्स द्वारा उपयोग नहीं किया जा सकता है?
टॉम ब्रिटो

36
यह उदाहरण 1997 के जावावर्ल्ड लेख से आया है। तारीख से बाहर, आपको सूरज का उपयोग नहीं करना चाहिए। * पैकेज।
sproketboy

3
क्या आपको कभी "इन" बंद करने की आवश्यकता है?
रॉगरडपैक

6
सूर्य का उपयोग करने के लिए +1 । * पैकेज। उनके पास अजीब कीड़े हैं जैसे कि फाइलें न संभालना> 1MB और एक क्लिप को खेलने में सक्षम नहीं होने पर अगर पिछला अभी तक खत्म नहीं हुआ है, आदि
rogerdpack

10

मैं कोड की इतनी सारी पंक्तियाँ नहीं चाहता था कि केवल एक सरल लानत ध्वनि चलाऊं। यदि आपके पास JavaFX पैकेज (पहले से ही मेरे jdk 8 में शामिल) है तो यह काम कर सकता है।

private static void playSound(String sound){
    // cl is the ClassLoader for the current class, ie. CurrentClass.class.getClassLoader();
    URL file = cl.getResource(sound);
    final Media media = new Media(file.toString());
    final MediaPlayer mediaPlayer = new MediaPlayer(media);
    mediaPlayer.play();
}

सूचना: आपको JavaFX को इनिशियलाइज़ करना होगा । ऐसा करने का एक त्वरित तरीका, JFXPanel () के निर्माता को एक बार अपने ऐप में कॉल करना है:

static{
    JFXPanel fxPanel = new JFXPanel();
}

8

जावा में ध्वनि बजाने के लिए, आप निम्न कोड का उल्लेख कर सकते हैं।

import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
import javax.swing.*;

// To play sound using Clip, the process need to be alive.
// Hence, we use a Swing application.
public class SoundClipTest extends JFrame {

   public SoundClipTest() {
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setTitle("Test Sound Clip");
      this.setSize(300, 200);
      this.setVisible(true);

      try {
         // Open an audio input stream.
         URL url = this.getClass().getClassLoader().getResource("gameover.wav");
         AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
         // Get a sound clip resource.
         Clip clip = AudioSystem.getClip();
         // Open audio clip and load samples from the audio input stream.
         clip.open(audioIn);
         clip.start();
      } catch (UnsupportedAudioFileException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (LineUnavailableException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new SoundClipTest();
   }
}

7

जो भी कारण के लिए, wchargin द्वारा शीर्ष उत्तर मुझे एक अशक्त सूचक त्रुटि दे रहा था जब मैं यह कॉल कर रहा था ।getass ()। GetResourceAsStream ()।

मेरे लिए क्या काम निम्नलिखित था:

void playSound(String soundFile) {
    File f = new File("./" + soundFile);
    AudioInputStream audioIn = AudioSystem.getAudioInputStream(f.toURI().toURL());  
    Clip clip = AudioSystem.getClip();
    clip.open(audioIn);
    clip.start();
}

और मैं इसके साथ ध्वनि बजाऊंगा:

 playSound("sounds/effects/sheep1.wav");

ध्वनियाँ / प्रभाव / sheep1.wav ग्रहण में मेरी परियोजना के आधार निर्देशिका में स्थित था (इसलिए src फ़ोल्डर के अंदर नहीं)।


हैलो Anrew, आपके कोड ने मेरे लिए काम किया, लेकिन मैंने देखा कि निष्पादन में थोड़ा अतिरिक्त समय लगता है ... लगभग 1,5 सेकंड।

getResourceAsStream()nullयदि संसाधन नहीं मिला है, तो वापस आ जाएगा या यदि अपवाद nameहै null- तो शीर्ष उत्तर की गलती नहीं है यदि दिए गए मार्ग मान्य नहीं हैं
user85421

3

मैंने कुछ समय पहले एंड्रॉइड और डेस्कटॉप पर काम करने के लिए एक गेम फ्रेमवर्क बनाया था, जो ध्वनि को संभालने वाला डेस्कटॉप हिस्सा हो सकता है कि आपको प्रेरणा की जरूरत हो।

https://github.com/hamilton-lima/jaga/blob/master/jaga%20desktop/src-desktop/com/athanazio/jaga/desktop/sound/Sound.java

यहाँ संदर्भ के लिए कोड है।

package com.athanazio.jaga.desktop.sound;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

public class Sound {

    AudioInputStream in;

    AudioFormat decodedFormat;

    AudioInputStream din;

    AudioFormat baseFormat;

    SourceDataLine line;

    private boolean loop;

    private BufferedInputStream stream;

    // private ByteArrayInputStream stream;

    /**
     * recreate the stream
     * 
     */
    public void reset() {
        try {
            stream.reset();
            in = AudioSystem.getAudioInputStream(stream);
            din = AudioSystem.getAudioInputStream(decodedFormat, in);
            line = getLine(decodedFormat);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            line.close();
            din.close();
            in.close();
        } catch (IOException e) {
        }
    }

    Sound(String filename, boolean loop) {
        this(filename);
        this.loop = loop;
    }

    Sound(String filename) {
        this.loop = false;
        try {
            InputStream raw = Object.class.getResourceAsStream(filename);
            stream = new BufferedInputStream(raw);

            // ByteArrayOutputStream out = new ByteArrayOutputStream();
            // byte[] buffer = new byte[1024];
            // int read = raw.read(buffer);
            // while( read > 0 ) {
            // out.write(buffer, 0, read);
            // read = raw.read(buffer);
            // }
            // stream = new ByteArrayInputStream(out.toByteArray());

            in = AudioSystem.getAudioInputStream(stream);
            din = null;

            if (in != null) {
                baseFormat = in.getFormat();

                decodedFormat = new AudioFormat(
                        AudioFormat.Encoding.PCM_SIGNED, baseFormat
                                .getSampleRate(), 16, baseFormat.getChannels(),
                        baseFormat.getChannels() * 2, baseFormat
                                .getSampleRate(), false);

                din = AudioSystem.getAudioInputStream(decodedFormat, in);
                line = getLine(decodedFormat);
            }
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        }
    }

    private SourceDataLine getLine(AudioFormat audioFormat)
            throws LineUnavailableException {
        SourceDataLine res = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class,
                audioFormat);
        res = (SourceDataLine) AudioSystem.getLine(info);
        res.open(audioFormat);
        return res;
    }

    public void play() {

        try {
            boolean firstTime = true;
            while (firstTime || loop) {

                firstTime = false;
                byte[] data = new byte[4096];

                if (line != null) {

                    line.start();
                    int nBytesRead = 0;

                    while (nBytesRead != -1) {
                        nBytesRead = din.read(data, 0, data.length);
                        if (nBytesRead != -1)
                            line.write(data, 0, nBytesRead);
                    }

                    line.drain();
                    line.stop();
                    line.close();

                    reset();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

इस कोड के stream.reset();लिए अग्रणी पर त्रुटि हो सकती है Resetting to invalid mark। इसे ठीक करने के लिए आप क्या करने का प्रस्ताव रखते हैं?
ड्रिमिमा

शायद धारा को फिर से बनाएँ, देखें stackoverflow.com/questions/18573767/…
हैमिल्टन.लिमा

1
मैंने वास्तव में इसे raw.mark(raw.available()+1)इनिशियलाइज़ करने के बाद rawऔर फिर लूप में उपयोग करके हल किया , और फिर raw.reset()इसके बजाय का उपयोग करके stream.reset()। मेरी समस्या अब यह है कि जब यह रीसेट करने के लिए आता है, तो नाटकों के बीच एक अंतर है। मैं एक निरंतर लूप प्राप्त करना चाहता हूं जैसे आप प्राप्त करते हैं Clip। मैं उपयोग नहीं कर रहा हूं Clipक्योंकि MASTER_GAIN जैसे नियंत्रण में हेरफेर करने में ~ 500ms का ध्यान देने योग्य विलंब है। यह शायद इसका अपना प्रश्न होना चाहिए जो मुझे बाद में पूछने के लिए मिलेगा।

नहीं है do { ... } while?
एंड्रियास

2

ध्वनि फ़ाइलों को आयात करने का एक विकल्प है जो ऐपलेट और एप्लिकेशन दोनों में काम करता है: ऑडियो फाइलों को .java फाइलों में परिवर्तित करें और बस उन्हें अपने कोड में उपयोग करें।

मैंने एक उपकरण विकसित किया है जो इस प्रक्रिया को बहुत आसान बनाता है। यह जावा साउंड एपीआई को काफी सरल करता है।

http://stephengware.com/projects/soundtoclass/


मैंने wav फ़ाइल से एक वर्ग बनाने के लिए आपके सिस्टम का उपयोग किया था, हालाँकि, जब मैं my_wave.play () करता हूं; यह ऑडियो नहीं बजाता है .. क्या कोई ऑडियो सिस्टम है जिसे मुझे शुरू करने या कुछ करने की आवश्यकता है? ..
नाथन एफ।

यह वास्तव में अच्छा होगा अगर यह वास्तव में काम करता है। खेलते समय (), ऑडियो लाइन विफल हो जाती है (अपवाद "java.lang.IllegalArgumentException: कोई पंक्ति मिलान इंटरफ़ेस SourceDataLine समर्थन प्रारूप PCM_UNSIGNED 44100.0 हर्ट्ज, 16 बिट, स्टीरियो, 4 बाइट्स / फ़्रेम, लिटिल-एंडियन समर्थित है।") फेंक दिया)। दुखी।
phil294

2

मुझे आश्चर्य है कि किसी ने भी एप्लेट का उपयोग करने का सुझाव नहीं दिया। का उपयोग करें Applet । आपको एक wavफ़ाइल के रूप में बीप ऑडियो फ़ाइल की आपूर्ति करनी होगी , लेकिन यह काम करता है। मैंने उबंटू पर यह कोशिश की:

package javaapplication2;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

public class JavaApplication2 {

    public static void main(String[] args) throws MalformedURLException {
        File file = new File("/path/to/your/sounds/beep3.wav");
        URL url = null;
        if (file.canRead()) {url = file.toURI().toURL();}
        System.out.println(url);
        AudioClip clip = Applet.newAudioClip(url);
        clip.play();
        System.out.println("should've played by now");
    }
}
//beep3.wav was available from: http://www.pacdv.com/sounds/interface_sound_effects/beep-3.wav

2
Appletजावा 9 के रूप में पदावनत किया गया है
Fre_d

0

यह धागा पुराना है लेकिन मैंने एक विकल्प निर्धारित किया है जो उपयोगी साबित हो सकता है।

जावा AudioStreamलाइब्रेरी का उपयोग करने के बजाय आप विंडोज मीडिया प्लेयर या वीएलसी जैसे बाहरी प्रोग्राम का उपयोग कर सकते हैं और इसे जावा के माध्यम से कंसोल कमांड के साथ चला सकते हैं।

String command = "\"C:/Program Files (x86)/Windows Media Player/wmplayer.exe\" \"C:/song.mp3\"";
try {
    Process p = Runtime.getRuntime().exec(command);
catch (IOException e) {
    e.printStackTrace();
}

यह एक अलग प्रक्रिया भी बनाएगा जिससे इसे नियंत्रित किया जा सके।

p.destroy();

बेशक यह एक आंतरिक पुस्तकालय का उपयोग करने की तुलना में निष्पादित करने में अधिक समय लेगा, लेकिन ऐसे कार्यक्रम हो सकते हैं जो संभवतः तेजी से शुरू हो सकते हैं और संभवतः बिना जीयूआई द्वारा कुछ कंसोल कमांड दिए गए हैं।

यदि समय सार का नहीं है तो यह उपयोगी है।


4
हालांकि मुझे लगता है कि यह एक उद्देश्यपूर्ण बुरा समाधान है (विश्वसनीयता, दक्षता और इस तरह के अन्य मैट्रिक्स के संदर्भ में), यह कम से कम एक दिलचस्प है जिसे मैंने नहीं सोचा होगा!
मैक्स वॉन हिप्पेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.