Wie kann ich Java Sound zum Laufen bringen?


8

Ich habe einen Java-basierten MP3-Player, der auf dem JLayer / BasicPlayer-Framework basiert und den ich gerne auf dem Pi zum Laufen bringen möchte. Ich habe das OpenJDK auf dem aktuellsten Raspbian installiert. Der BasicPlayer öffnet die Zeile korrekt, bekommt jedoch nur bei der Wiedergabe einer Datei stotternde Geräusche.

Die Wiedergabe von Sound mit dem Befehlszeilentool mpg123 funktioniert einwandfrei.

Stimmt etwas mit der Java Sound-Implementierung des ARM OpenJDK nicht?

Ich bin dankbar für Hinweise in die richtige Richtung.

Dies ist der Code:

BasicPlayer pl = new BasicPlayer();
try {
    String path = "/home/pi/Music/testmp3.mp3";
    File file = new File(path);
    pl.open(file);
    pl.play();
} catch (Exception e) {
    CubeLog.logException(e);
}

Vielen Dank.


Ich würde vermuten, dass dies bedeuten würde, dass die mp3Dekodierung in Software stattfinden würde. Ich bezweifle ernsthaft, dass der Pi dazu in der Lage wäre.
Jivings

Ein möglicher Grund könnte die Verwirrung zwischen Bigendian und Littleendian im Decoder sein.
Thorbjørn Ravn Andersen

Thorbjørn: Interessant, wird das zu stotternden, verzerrten Geräuschen führen?
Nanoman

Antworten:


5

Ich habe nicht genug Punkte, um Kommentare abzugeben. Also werde ich hier posten:

1- "Nicht genug CPU" - Ich habe in einer Sparc-Station mit einer 35-MHz-CPU MP3-Decodierung per Software durchgeführt. Wenn dieser Decoder nicht ernsthaft fehlerhaft ist, sollte er funktionieren.

Können Sie eine Datei vollständig dekodieren? Wenn ja, messen Sie die Zeit, die es dauert. Wenn es weniger als die Gesamtlaufzeit des Songs ist, sind Sie im Geschäft. Kopieren Sie anschließend die Undecode-Datei auf einen anderen Computer und prüfen Sie, ob die WAV in Ordnung ist.

[BEARBEITEN]:

Ich habe einige Tests mit JLayer1.0.1 auf meinem RPI durchgeführt und es ist langsam:

Zeit java -cacao -classpath jl1.0.1.jar javazoom.jl.converter.jlc file.mp3 -p out.wav

Das Dekodieren dauert dreimal länger als die Laufzeit des Songs.

[EDIT 2]:

Mit Java SE Embedded 6 konnte eine MP3-Datei in kürzerer Zeit als zur Laufzeit dekodiert werden. Http://www.oracle.com/technetwork/java/embedded/downloads/javase/index.html :

pi @ raspbmc: ~ / java / JLayer1.0.1 $ rm out.wav; Zeit ../ejre1.7.0_04/bin/java -classpath jl1.0.1.jar javazoom.jl.converter.jlc Gill \ Scott-Heron- \ Die \ Revolution \ Will \ Not \ Be \ Televised.mp3 -p out. wav FileName = Gill Scott-Heron- Die Revolution wird nicht im Fernsehen übertragen.mp3

real 0m57.624s Benutzer 0m49.900s sys 0m2.320s

Auf 3 Minuten wav.

Problem ist, dass es auf Raspbian nicht funktioniert:

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=66&t=11671


Vielen Dank für die Erklärung - welche Distribution verwenden Sie?
Nanoman

Diese Tests wurden mit raspbmc rc3 durchgeführt. Aber es lief kein xbmc oder X.
Gfelisberto

4

Hier ist dein Problem:

von MartenR »Do 05.07.2012 11:09 Uhr

Sound wird immer auf der CPU für andere Codecs als die kostenlosen Codecs ausgeführt. Es wurden keine Lizenzen für die Sounddecodierung für MPEG-Audio oder AC3 gekauft.

Der Raspberry Pi ist einfach nicht leistungsfähig genug, um die MP3-Datei in Echtzeit in Software zu dekodieren, wenn sie auf der JVM ausgeführt wird.

Sie können ein paar Dinge ausprobieren, damit es funktioniert:

  • Erhöhen Sie den für die CPU verfügbaren Speicher
  • Versuchen Sie, einen Player zu betreiben, der nicht durch die JVM eingeschränkt ist (obwohl ich keine Ahnung habe, ob dies zu einer Verbesserung führt ...)

    Runtime.getRuntime().exec("omxplayer [filename]");

Das sollte keine statischen, sondern schleifenförmigen Fragmente ergeben.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen: Ist das für meine Antwort relevant? Mit Ausnahme des Java-Teils?
Jivings

Ja, wenn das Symptom auf etwas anderes hinweist.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen: Ich verstehe nicht, was du meinst. Können Sie erklären?
Jivings

Statisch tritt auf, wenn die falschen Bytes der Tonschaltung zugeführt werden. Wenn die Software langsam ist, werden die richtigen Bytes eingespeist, aber nicht schnell genug, sodass die verwendeten Puffer veraltete Daten enthalten, wodurch der Sound im Puffer eine Schleife erhält. Zumindest habe ich dieses Symptom auf anderen Systemen so gesehen.
Thorbjørn Ravn Andersen

2

Wenn eine Anwendung mit der CPU einen reibungslosen Sound wiedergeben kann, sollten alle Anwendungen ihn problemlos wiedergeben können.

OpenJDK 6 hat Probleme mit ALSA (spielt beispielsweise nicht auf dem "Standard" -Gerät), verwenden Sie also stattdessen OpenJDK 7. Außerdem verwenden beide OpenJDK-Versionen den Zero-Interpreter, der sehr langsam ist. Sie sollten eine JVM verwenden, die JITs wie CACAO in einer Soft-Float-Distribution oder Avian JVM in einer Hard-Float-Distribution (wie Raspbian) verwenden.


Aber kann irgendetwas MP3s reibungslos abspielen? Keine meiner Anwendungen kann
Jivings

0

Tolle Neuigkeiten - ich habe es geschafft!

Ich habe das neue Softfloat-Debian-Keuchbild installiert und dann das gerade veröffentlichte JDK 7 Update 6 darauf installiert , und es läuft einwandfrei. Stellen Sie einfach sicher, dass Sie dieses JDK auf einer Softfloat-basierten Distribution installieren.

Der CPU-Verbrauch während der Wiedergabe eines MP3-Geräts liegt konstant bei etwa 45%.


Es war also ein JVM-Problem.
Jivings
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.