আমি জাভাতে কীভাবে শব্দ বাজাতে পারি?


173

আমি আমার প্রোগ্রামে সাউন্ড ফাইল খেলতে সক্ষম হতে চাই। আমার কোথায় দেখা উচিত?


1
এই শ্রেণীর দিকে একবার দেখুন: github.com/dberm22/DBoard/blob/master/src/com/dberm22/utils/… আপনি এটিকে (নতুন থ্রেড (নতুন মিডিয়াপ্লেয়ার (প্যাথটোফাইল)) দিয়ে কল করতে পারেন start শুরু ();
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
সর্বজনীন এপিআই ব্যবহার করে এমন একটি সমাধানের জন্য +1। নতুন থ্রেড তৈরি করা কি অপ্রয়োজনীয় (রিডানডান্ট) না?
জাটারো

4
থ্যাঙ্কস .. এটি কি নিরর্থক? আমি এটিকে একটি নতুন থ্রেডে তৈরি করেছি যাতে প্রথম ক্লিপ শেষ হওয়ার আগে আমি আবার শব্দটি খেলতে পারি।
পিক

4
আমি জানি ক্লিপ.স্টার্ট () একটি নতুন থ্রেড তৈরি করেছে, তাই আমি নিশ্চিত যে এটি অপ্রয়োজনীয়।
Jataro

44
1) Threadঅপ্রয়োজনীয়। 2) ব্যবহারের একটি ভাল উদাহরণের জন্য Clip, জাভাসাউন্ড তথ্য দেখুন। পৃষ্ঠা । ৩) যদি কোনও পদ্ধতির একটি URL(বা File) প্রয়োজন হয় তবে এটি একটি ডাঙ URL(বা File) দেবে না 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 ব্যবহারের জন্য পাবলিক এপিআই বিকল্প রয়েছে।
ম্যাকডোয়েল

4
@ গ্রেগহর্লম্যান সূর্য নয় কি? * প্যাকেজটি কি আমাদের বিকাশকারীরা ব্যবহার করবেন না?
টম ব্রিটো

36
এই উদাহরণটি 1997 এর একটি জাভাওয়ার্ল্ড নিবন্ধ থেকে এসেছে। পুরানো উপায়, আপনার সূর্য ব্যবহার করা উচিত নয় * * প্যাকেজগুলি।
sproketboy

3
আপনার কি কখনও "ইন" বন্ধ করার দরকার আছে?
রজারডপ্যাক

6
সূর্য ব্যবহার না করার জন্য +1 । * প্যাকেজ। তাদের কাছে অদ্ভুত বাগ রয়েছে যেমন ফাইল> 1 এমবি পরিচালনা না করা এবং একটি ক্লিপ খেলতে না পারা যদি পূর্ববর্তীটি এখনও শেষ না করে থাকে, ইত্যাদি
রজারডপ্যাক

10

আমি কেবল একটি সাধারণ অভিশাপ শোনার জন্য কোডের অনেকগুলি লাইন রাখতে চাইনি। আপনার জাভাএফএক্স প্যাকেজ থাকলে (ইতিমধ্যে আমার জেডকে 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();
}

বিজ্ঞপ্তি: আপনার জাভাএফএক্স শুরু করতে হবে । এটি করার একটি দ্রুত উপায় হ'ল আপনার অ্যাপ্লিকেশনে একবার জেএফএক্সপ্যানেল () এর কনস্ট্রাক্টরকে কল করা:

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

যে কারণেই হোক না কেন, ডাব্লুচার্জিনের শীর্ষের উত্তরটি যখন আমি এই.জেটক্লাসকে কল করছিলাম তখন আমাকে নাল পয়েন্টার ত্রুটি দিচ্ছিল (get।

আমার জন্য যা কাজ করেছে তা হ'ল:

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

সাউন্ডস / ইফেক্টস / ভেড়া 1.wav আমার প্রকল্পের বেস ডিরেক্টরিতে Eclipse এ অবস্থিত ছিল (সুতরাং src ফোল্ডারের ভিতরে নয়)।


হ্যালো অ্যান্রু, আপনার কোডটি আমার পক্ষে কাজ করেছিল, কিন্তু আমি লক্ষ্য করেছি যে মৃত্যুদন্ড কার্যকর করতে কিছুটা অতিরিক্ত সময় লাগে ... প্রায় 1,5 সেকেন্ড।

getResourceAsStream()nullযদি রিসোর্স না পাওয়া যায় তবে ফিরে আসবে বা যদি ব্যতিক্রম হয় তবে nameতা ছুঁড়ে দিন null- প্রদত্ত পথটি বৈধ না হলে শীর্ষ উত্তরের দোষ নয়
ব্যবহারকারী 8542121

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। এটি ঠিক করার জন্য আপনি কী প্রস্তাব করবেন?
ড্রিমা

স্ট্রিমটি পুনরায় তৈরি করুন, স্ট্যাকওভারফ্লো
হ্যামিলটন.লিমা

1
আমি raw.mark(raw.available()+1)প্রথমে এটি শুরু করার পরে rawএবং তারপরে লুপটিতে এবং তার raw.reset()পরিবর্তে ব্যবহার করে সমাধান করেছি stream.reset()। আমার এখন সমস্যাটি যখন এটি পুনরায় সেট করতে আসে তখন নাটকগুলির মধ্যে ব্যবধান থাকে। আপনি যেমন পেতেন তেমন অবিচ্ছিন্ন লুপটি অর্জন করতে চাই Clip। আমি ব্যবহার করছি না Clipকারণ MASTER_GAIN এর মতো নিয়ন্ত্রণগুলি পরিচালনা করতে। 500ms এর লক্ষণীয় বিলম্ব রয়েছে। এটি সম্ভবত এটির নিজস্ব প্রশ্ন হওয়া উচিত যা আমি পরে জিজ্ঞাসা করতে পারি।
ড্রিমা

না do { ... } while?
আন্দ্রেয়াস

2

সাউন্ড ফাইলগুলি আমদানির বিকল্প রয়েছে যা অ্যাপলেট এবং অ্যাপ্লিকেশন উভয় ক্ষেত্রেই কাজ করে: অডিও ফাইলগুলিকে জাভা ফাইলগুলিতে রূপান্তর করুন এবং সেগুলি কেবল আপনার কোডে ব্যবহার করুন।

আমি একটি সরঞ্জাম তৈরি করেছি যা এই প্রক্রিয়াটিকে অনেক সহজ করে তোলে। এটি জাভা সাউন্ড এপিআইকে বেশ কিছুটা সহজ করে।

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


আমি আপনার সিস্টেমটি ওয়েভ ফাইল থেকে ক্লাস তৈরি করতে ব্যবহার করেছি, তবে আমি যখন আমার_ ওয়েভ.প্লে () করি; এটি অডিওটি প্লে করে না .. আমার কি কোনও অডিও সিস্টেম শুরু করার দরকার আছে বা কিছু? ..
নাথান এফ।

এটি সত্যই কার্যকর যদি এটি কাজ করে। প্লে () চালানোর সময়, অডিও লাইন ব্যর্থ হয় (ব্যতিক্রম "java.lang.IllegalArgumentException: কোন লাইন ম্যাচিং ইন্টারফেস সোর্সডাটালাইন সমর্থনকারী ফর্ম্যাট PCM_UNSIGNED 44100.0 হার্জ, 16 বিট, স্টিরিও, 4 বাইট / ফ্রেম, লিটল-এন্ডিয়ান সমর্থিত নয়" is নিক্ষিপ্ত)। দু: খিত।
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 হিসাবে
অবহিত করা হয়েছে

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
যদিও আমি মনে করি এটি একটি উদ্দেশ্যমূলক খারাপ সমাধান (নির্ভরযোগ্যতা, দক্ষতা এবং এই জাতীয় মেট্রিক্সের ক্ষেত্রে) তবে এটি অন্তত একটি আকর্ষণীয় যা আমি অন্যথায় ভাবিও না!
ম্যাক্স ভন হিপ্পেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.