سؤال

كنت تريد أن تكون قادرة على تشغيل ملفات الصوت في البرنامج.حيث يجب أن ننظر ؟

هل كانت مفيدة؟

المحلول

كتبت البرمجية التالية أن يعمل بشكل جيد.ولكن أعتقد أنه يعمل فقط مع .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();
}

نصائح أخرى

على الصوت درب جافا البرنامج التعليمي يستحق أن يكون نقطة البداية.

مثال سيء:

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); 

لم أكن أريد أن يكون الكثير من الأسطر من التعليمات البرمجية فقط للعب بسيطة اللعنة الصوت.هذا يمكن أن تعمل إذا كان لديك سكريبت حزمة (المدرجة بالفعل في 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();
}

إشعار :تحتاج إلى تهيئة سكريبت.طريقة سريعة للقيام بذلك هو استدعاء منشئ JFXPanel() مرة واحدة في التطبيق الخاص بك :

static{
    JFXPanel fxPanel = new JFXPanel();
}

لتشغيل الصوت في جاوة ، يمكنك الرجوع إلى التعليمات البرمجية التالية.

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();
   }
}

لأي سبب كان, أفضل إجابة من قبل wchargin كان يعطيني خطأ مؤشر فارغة عندما كنت أتصل هذا.getClass().getResourceAsStream().

ما عملت بالنسبة لي هو التالي:

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

وأود أن تشغيل الصوت مع:

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

الأصوات/آثار/sheep1.wav كان يقع في الدليل الأساسي من المشروع في الكسوف (حتى لا داخل مجلد src).

أنا خلقت إطار اللعبة في وقت ما قبل العمل على الروبوت سطح المكتب, سطح المكتب جزء التعامل مع الصوت ربما يمكن أن تستخدم بمثابة الإلهام إلى ما تحتاج إليه.

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();
        }
    }

}

هناك بديل استيراد ملفات الصوت الذي يعمل في كل من التطبيقات:تحويل الملفات الصوتية إلى .ملفات جافا و ببساطة استخدامها في التعليمات البرمجية الخاصة بك.

يجب وضع أداة التي تجعل هذه العملية أسهل بكثير.فإنه يبسط الصوت جافا API قليلا جدا.

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

أنا مندهش لا أحد اقترح استخدام الصغير. استخدام 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

هذا الموضوع قديمة نوعا ما ولكن يجب تحديد أحد الخيارات التي يمكن أن تكون مفيدة.

بدلا من استخدام جافا AudioStream المكتبة يمكنك استخدام برنامج خارجي مثل Windows Media Player أو VLC وتشغيله مع وحدة القيادة من خلال جافا.

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();

بالطبع هذا سوف يستغرق وقتا أطول لتنفيذ من استخدام داخلي المكتبة ولكن قد يكون هناك البرامج التي يمكن أن يبدأ بشكل أسرع وربما دون واجهة المستخدم الرسومية إعطاء بعض الأوامر وحدة التحكم.

إن الوقت ليس من ذهب ثم وهذا هو المفيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top