Java'da .mp3 ve .wav mı oynuyorsunuz?


105

Java uygulamamda bir .mp3ve bir .wavdosyasını nasıl oynatabilirim ? Swing kullanıyorum. Şu örnek için internete bakmayı denedim:

public void playSound() {
    try {
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("D:/MusicPlayer/fml.mp3").getAbsoluteFile());
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
        clip.start();
    } catch(Exception ex) {
        System.out.println("Error with playing sound.");
        ex.printStackTrace();
    }
}

Ama bu sadece oynayacak .wav dosyaları .

Ile aynı:

http://www.javaworld.com/javaworld/javatips/jw-javatip24.html

Hem .mp3dosyaları hem de dosyaları .wavaynı yöntemle oynatabilmek istiyorum .


1
Görünüşe göre bazı türden bir eklentiye ihtiyacınız olacak. JMF ihtiyacınız olanı almalı. oracle.com/technetwork/java/javase/tech/index-jsp-140239.html
Otra

Bunları nasıl kullanacağımdan emin değilim, daha önce hiç kullanmadım. Nasıl uygulayabilirim, nasıl kullanabilirim?
Stan

JFM, 2003 yılında terk edildi. Kullanmanız tavsiye edilmez.
joshreesjones

3
Bir mainyöntemde, Thread.sleepsesi duymak için a eklemek gerektiğini , aksi takdirde programın bundan önce sona ereceğini belirtmek gerekir. Bunu yapmanın yararlı bir yolu:Thread.sleep(clip.getMicrosecondLength() / 1000);
André Valenti

Yanıtlar:


119

Java FX, mp3 dosyalarını çalacak Mediave MediaPlayersınıflara sahiptir.

Örnek kod:

String bip = "bip.mp3";
Media hit = new Media(new File(bip).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();

Aşağıdaki ithalat ifadelerine ihtiyacınız olacak:

import java.io.File;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

5
nihai URL kaynağı = getClass (). getResource ("a.mp3");
Neil

44
bu benim için hiç çalışmıyor. ithalatın olmadığını söylüyor. ve ben java 7 çalıştırıyorum ...
PulsePanda

9
stackoverflow.com/questions/15149547/… Eclipse kullanıyorsanız, javafx kitaplığını Java 7 klasörünün içinden manuel olarak eklemeniz gerektiği anlaşılıyor.
Gyurme

7
Teknik olarak Mediave Java sınıfları MediaPlayerdeğil , JavaFX sınıflarıdır. OS X veya Windows'ta Java'ya mp3 desteği eklemek için SampledSP'ye bakmak isteyebilirsiniz . Ve evet - o kütüphaneleri ben yazdım.
Hendrik 13

8
Bunun çalışması için javaFX'i de başlatmanız gerektiğini unutmayın. stackoverflow.com/questions/14025718/…
user738048


18

.wav'ı yalnızca java API ile oynayabilirsiniz:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

kod:

AudioInputStream audioIn = AudioSystem.getAudioInputStream(MyClazz.class.getResource("music.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();

Ve jLayer ile .mp3 oynatın


4
Bu yanlış. Java, wav'ın yanı sıra diğer kapsayıcı formatlarını oynatacaktır. Dahası, wav, mp3 içerebilen bir kapsayıcı formatıdır. Yani Java tüm wav dosyalarını oynatamaz.
Radiodef

15

Kullanmayalı uzun zaman oldu, ancak JavaLayer MP3 çalmak için harika


Evet, çok güzel. Basit ve platforma bağlı görünmüyor. Arka planda iyi oynuyor ve bir iş parçacığının nasıl durdurulacağını bulmanız yeterli.
James P.

14

Tek bir Maven bağımlılığı olan standart javax.sound API kullanarak, tamamen Açık Kaynak ( Java 7 gereklidir):

pom.xml

 <!-- 
    We have to explicitly instruct Maven to use tritonus-share 0.3.7-2 
    and NOT 0.3.7-1, otherwise vorbisspi won't work.
   -->
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>tritonus-share</artifactId>
  <version>0.3.7-2</version>
</dependency>
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>mp3spi</artifactId>
  <version>1.9.5-1</version>
</dependency>
<dependency>
  <groupId>com.googlecode.soundlibs</groupId>
  <artifactId>vorbisspi</artifactId>
  <version>1.0.3-1</version>
</dependency>

Kod

import java.io.File;
import java.io.IOException;

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

import static javax.sound.sampled.AudioSystem.getAudioInputStream;
import static javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED;

public class AudioFilePlayer {

    public static void main(String[] args) {
        final AudioFilePlayer player = new AudioFilePlayer ();
        player.play("something.mp3");
        player.play("something.ogg");
    }

    public void play(String filePath) {
        final File file = new File(filePath);

        try (final AudioInputStream in = getAudioInputStream(file)) {

            final AudioFormat outFormat = getOutFormat(in.getFormat());
            final Info info = new Info(SourceDataLine.class, outFormat);

            try (final SourceDataLine line =
                     (SourceDataLine) AudioSystem.getLine(info)) {

                if (line != null) {
                    line.open(outFormat);
                    line.start();
                    stream(getAudioInputStream(outFormat, in), line);
                    line.drain();
                    line.stop();
                }
            }

        } catch (UnsupportedAudioFileException 
               | LineUnavailableException 
               | IOException e) {
            throw new IllegalStateException(e);
        }
    }

    private AudioFormat getOutFormat(AudioFormat inFormat) {
        final int ch = inFormat.getChannels();

        final float rate = inFormat.getSampleRate();
        return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
    }

    private void stream(AudioInputStream in, SourceDataLine line) 
        throws IOException {
        final byte[] buffer = new byte[4096];
        for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {
            line.write(buffer, 0, n);
        }
    }
}

Referanslar:


Hem mp3 hem de ogg için bu hatayı alıyorum: DesteklenmeyenAudioFileException: giriş dosyasından ses girişi akışı alınamadı
David Winiecki

Kodu bir Maven modülüne koydum. Kesinlikle işe yarıyor: search.maven.org/…
odoepner

sürüm numaralarını şu şekilde yükseltebilirim: <dependency> <groupId> com.googlecode.soundlibs </groupId> <artifactId> tritonus-share </artifactId> <version> 0.3.7.4 </version> </dependency> <dependency> <groupId> com.googlecode.soundlibs </groupId> <artifactId> mp3spi </artifactId> <version> 1.9.5.4 </version> </dependency> <dependency> <groupId> com.googlecode.soundlibs </groupId> < artifactId> vorbisspi </artifactId> <version> 1.0.3-2 </version> </dependency>
tibi

sadece en son olan verbisspi 1.0.3.3 çalışmadı.
tibi

Bu harika, kutudan çıktığı anda MP3 ve WAV için çalışıyor!
Miles Henrichs

13

BasicPlayerAPI kullanmanızı tavsiye ederim. Açık kaynaklıdır, çok basittir ve JavaFX gerektirmez. http://www.javazoom.net/jlgui/api.html

Zip dosyasını indirip çıkardıktan sonra aşağıdaki jar dosyalarını projenin inşa yoluna eklemelisiniz:

  • basicplayer3.0.jar
  • lib dizinindeki tüm kavanozlar (BasicPlayer3.0 içinde)

Minimalist bir kullanım örneği:

String songName = "HungryKidsofHungary-ScatteredDiamonds.mp3";
String pathToMp3 = System.getProperty("user.dir") +"/"+ songName;
BasicPlayer player = new BasicPlayer();
try {
    player.open(new URL("file:///" + pathToMp3));
    player.play();
} catch (BasicPlayerException | MalformedURLException e) {
    e.printStackTrace();
}

Gerekli ithalatlar:

import java.net.MalformedURLException;
import java.net.URL;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerException;

Müzik çalmaya başlamak için ihtiyacınız olan tek şey bu. Oynatıcı kendi oynatma dizisini başlatıyor ve yönetiyor ve oynatma , duraklatma, devam ettirme, durdurma ve arama işlevleri sağlıyor.

Daha gelişmiş bir kullanım için jlGui Müzik Çalara bir göz atabilirsiniz. Açık kaynaklı bir WinAmp klonudur: http://www.javazoom.net/jlgui/jlgui.html

Bakılacak ilk sınıf PlayerUI olacaktır (javazoom.jlgui.player.amp paketinin içinde). BasicPlayer'ın gelişmiş özelliklerini oldukça iyi gösteriyor.


Teşekkürler, mevcut bir uygulamaya mp3 desteği eklemeye çalıştığım en kolay yol bu. java yakınlaştırma sitesinden mp3spi1.9.4.jarile değiştirilmelidir mp3spi1.9.5.jar.
Yaşlı Badman Grey

Sonra ana başlığınızı uyumayı unutmayın player.play() , yoksa hiç ses duymayabilirsiniz.
jeremyjjbrown

7

Bulduğum en kolay yol, JLayer jar dosyasını http://www.javazoom.net/javalayer/sources.html adresinden indirip Jar kitaplığına eklemekti http://www.wikihow.com/Add-JARs- Proje-İnşa-Yolları-Tutulma-% 28Java% 29

İşte sınıfın kodu

public class SimplePlayer {

    public SimplePlayer(){

        try{

             FileInputStream fis = new FileInputStream("File location.");
             Player playMP3 = new Player(fis);

             playMP3.play();

        }  catch(Exception e){
             System.out.println(e);
           }
    } 
}

ve işte ithalatlar

import javazoom.jl.player.*;
import java.io.FileInputStream;

1
Evet, bu videoya göz atıyor [ youtube.com/… , durdur ve duraklat gibi tüm işlevleri yerine getiriyor.
Vlad

1
Oldukça basit göründükleri için zaten bu işlevleri içermesi gerektiğini düşünüyorum. Her neyse, başka bir kitaplıkla başka bir çözüm buldum, cevabınız için teşekkürler :)
N3sh 10'14

5

Okuyuculara başka bir alternatif sunmak için, çapraz platform java mp3 oynatıcı olan JACo MP3 Player kitaplığını öneriyorum.

Özellikleri:

  • çok düşük CPU kullanımı (~% 2)
  • inanılmaz küçük kitaplık (~ 90 KB)
  • JMF'ye (Java Media Framework) ihtiyaç duymaz
  • herhangi bir uygulamaya entegre edilmesi kolay
  • herhangi bir web sayfasına (uygulama olarak) entegre edilmesi kolaydır.

Yöntemlerinin ve özniteliklerinin tam listesi için belgelerine buradan bakabilirsiniz .

Basit kod:

import jaco.mp3.player.MP3Player;
import java.io.File;

public class Example1 {
  public static void main(String[] args) {
    new MP3Player(new File("test.mp3")).play();
  }
}

Daha fazla ayrıntı için, burada indirilebilir bir kaynak kodu içeren basit bir eğitim oluşturdum .


WOW, bu inanılmaz basitti.
Wesos de Queso

kaynak kodu indirmesi kitaplığa gerçek kaynak kodunu vermiyor mu?
a8_

4

Kullanılması MP3 Dekoder / oyuncu / çevirici Maven Bağımlılık.

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class PlayAudio{

public static void main(String[] args) throws FileNotFoundException {

    try {
        FileInputStream fileInputStream = new FileInputStream("mp.mp3");
        Player player = new Player((fileInputStream));
        player.play();
        System.out.println("Song is playing");
        while(true){
            System.out.println(player.getPosition());
        }
    }catch (Exception e){
        System.out.println(e);
    }

  }

}

2

Önce JMF'yi kurmanız gerekir ( bu bağlantıyı kullanarak indirin )

File f = new File("D:/Songs/preview.mp3");
MediaLocator ml = new MediaLocator(f.toURL());
Player p = Manager.createPlayer(ml);
p.start();

JMF jar dosyalarını eklemeyi unutmayın


5
JMF'nin Sun / Oracle tarafından uzun zaman önce terk edildiğini unutmayın.
Hendrik 13

1

JAVE (Java Audio Video Encoder anlamına gelir) Kitaplığı için freshmeat.net'te bir arama yapın ( buraya bağlantı ). Bu tür şeyler için bir kütüphane. Java'nın yerel bir mp3 işlevi olup olmadığını bilmiyorum.

Her iki tür dosyayı da çalıştırmak için bir yöntem istiyorsanız, muhtemelen mp3 işlevini ve wav işlevini kalıtım ve basit bir sarmalayıcı işlevi kullanarak bir araya getirmeniz gerekecektir.


Özel kitaplıkları nasıl kullanacağım konusunda hiçbir fikrim yok, herhangi bir yardım var mı?
Stan

Kitaplığı indirin ve kodunuza bir include ifadesi yazın. Kütüphane kullanımı ile ilgili talimatlar dahil edilmelidir. Genellikle bir işlev çağrısı yeterlidir, ancak önce bir nesneyi bildirmeniz gerekebilir. Ardından, girişinin dosya uzantısını kontrol eden ve istediğiniz kitaplık işlevini çağıran bir işlev oluşturun.
Spencer Rathbun

0

Java Sesi'ne MP3 okuma desteği eklemek için mp3plugin.jar, JMF'nin değerini uygulamanın çalışma zamanı sınıf yoluna ekleyin .

ClipSınıfın, birkaç saniyeden fazla yüksek kaliteli ses için uygun olmayan bellek sınırlamaları olduğunu unutmayın .


2
JMF, 2003 yılında terk edildi. Kullanmanız tavsiye edilmez.
joshreesjones

@ mathguy54 İnsanlara kullanmamalarını tavsiye ettiğimde, bunun nedeni yeterince farklı medya türlerini desteklememesidir. Yine de, MP3 kodunu çözmek için hala tamamen yeterlidir.
Andrew Thompson

0

Bunun için başka yöntemlerim var, ilki:

public static void playAudio(String filePath){

    try{
        InputStream mus = new FileInputStream(new File(filePath));
        AudioStream aud = new AudioStream(mus);
    }catch(Exception e){
        JOptionPane.showMessageDialig(null, "You have an Error");
    }

İkincisi ise:

try{
    JFXPanel x = JFXPanel();
    String u = new File("021.mp3").toURI().toString();
    new MediaPlayer(new Media(u)).play();
} catch(Exception e){
    JOPtionPane.showMessageDialog(null, e);
}

Ve eğer bu sese döngü yapmak istiyorsak bu yöntemi kullanıyoruz.

try{
    AudioData d = new AudioStream(new FileInputStream(filePath)).getData();
    ContinuousAudioDataStream s = new ContinuousAudioDataStream(d);
    AudioPlayer.player.start(s);
} catch(Exception ex){
    JOPtionPane.showMessageDialog(null, ex);
}

bu döngüyü durdurmak istersek, bu kitaplıkları try:

AudioPlayer.player.stop(s);

bu üçüncü yöntem için aşağıdaki ithalatı ekliyoruz:

import java.io.FileInputStream;
import sun.audio.AudioData;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.