Frage

Ist Java eine geeignete Alternative zu C / C ++ für Echtzeit-Audio-Verarbeitung?

Ich erwäge eine App mit ~ 100 (bei max) Audiospuren mit Verzögerungsleitungen (30s @ 48kHz), Filtern (512 Punkt FIR?) Und anderen DSP-Typ-Operationen auf jeder Spur gleichzeitig auftreten.

Die Operationen in Gleitkomma umgewandelt und durchgeführt werden würden.

Das System wahrscheinlich ein Quad-Core 3 GHz mit 4 GB RAM wäre, Ubuntu läuft.

Ich habe Artikel gesehen über Java ist viel schneller als früher sein, kommt die Nähe von C / C ++, und jetzt auch Echtzeit-Erweiterungen hat. Ist das Realität? Ist es harten Kern Codierung und Tuning erfordert% 50-% 100 Performance von C einige sind spec'ing?

zu erreichen

Ich bin wirklich der Suche nach einem Sinn, wenn dies möglich ist, und ein Heads für alle gotchas auf.

War es hilfreich?

Lösung

Für eine Audio-Anwendung, die Sie oft nur sehr kleine Teile des Codes, wo die meiste Zeit verbracht wird.

In Java können Sie immer die JNI (Java Native Interface) verwenden und Ihre Rechen schweren Code in eine C-Modul bewegen (oder Baugruppe SSE verwenden, wenn Sie wirklich die Kraft benötigen). Also würde ich verwenden Java sagen, und Ihr Code zum Laufen bringen. Sollte sich herausstellen, dass Sie nicht erfüllen Ihr Leistungsziel JNI verwenden.

90% des Codes wird höchstwahrscheinlich Glue Code und Anwendung Zeug sowieso sein. Aber bedenken Sie, dass Sie einen Teil der Cross-Plattform verlieren auf diese Weise verfügt. Wenn Sie mit dem JNI leben können immer lassen Sie die Tür offen für native Code Leistung.

Andere Tipps

Java ist gut für viele Audioanwendungen. um einige der anderen Plakate Gegenteil, ich Java-Audio eine Freude, mit zu arbeiten finden. Vergleichen Sie die API und Ressourcen zur Verfügung, um Sie zu dem horrenden, kaum dokumentiert mindf * k, der CoreAudio- ist und du wirst ein Gläubiger sein. Java-Audio leidet unter einigen Latenzprobleme, obwohl für viele Anwendungen dies irrelevant ist, und ein Mangel an Codecs. Darüber hinaus gibt es viele Leute, die nie die Mühe gemacht haben, die Zeit zu nehmen, einen guten Audio-Wiedergabe-Motoren (Tipp, nie einen SourceDataLine schließen, stattdessen schreibt Nullen es) zu schreiben und anschließend die Schuld Java für ihre Probleme. Von einer API Sicht ist Java Audio sehr einfach, sehr einfach zu bedienen, und es gibt viele, viele Führung über jsresources .org .

Klar, warum nicht?

Die entscheidenden Fragen (unabhängig von der Sprache, das ist aus der Warteschlangentheorie) sind:

  • , was die maximalen Durchsatz Sie brauchen zu handhaben (Sie haben 100 x 48 kHz angegeben, ist, dass Mono oder Stereo, wie viele Bits äquivalent bei dieser Frequenz?)
  • können Sie Ihre Java-Routinen mit diesem Tempo Schritt halten im Durchschnitt?
  • Was ist die maximal zulässige Latenz?

Wenn Ihr Programm mit dem Durchsatz im Durchschnitt halten, und Sie haben genug Platz für Latenz, dann sollten Sie in der Lage sein, Warteschlangen zu verwenden für Ein- und Ausgänge, und die nur Teile des Programms, das für das Timing kritisch ist die Stücke, die die Daten in die Eingabewarteschlange setzen und sie aus der Ausgabewarteschlange nehmen und es an einen DAC / Lautsprecher / was auch immer senden.

Die Verzögerungsleitungen haben eine geringe Rechenlast, die Sie gerade genug Speicher (+ Speicherbandbreite) müssen ... in der Tat sollten Sie wahrscheinlich die Eingabe / Ausgabe-Warteschlangen für sie verwenden nur, dh starten Daten in die Eingabewarteschlange sofort und Start setzen späteren Daten aus der Ausgabewarteschlange 30s nehmen. Wenn er nicht da ist, das Programm zu langsam ist ...).

FIRs sind teurer, das wird wahrscheinlich der Engpass sein (& was Sie optimieren wollen würden), wenn Sie eine andere hässliche böse Operation im Sinne haben.

ich denke, Latenz Ihr großes Problem sein wird - es ist ziemlich hart Latenz bereits in C / C ++ auf modernen Betriebssystemen zu halten und Java fügt sicherlich auf das Problem (Garbage Collector). Das allgemeine Design für „Echtzeit“ Audioverarbeitung ist Ihre Verarbeitungsthreads zu haben, in Echtzeit ausgeführt wird Scheduling (SCHED_FIFO auf Linux-Kernel, das entspricht auf anderen Betriebssystemen), und diese Fäden sollen niemals blockieren. Dies bedeutet, dass keine Systemaufrufe, keine malloc, kein IO natürlich etc ... Auch Paging ist ein Problem (eine Seite von der Festplatte in dem Speicher bekommen kann leicht mehrere ms dauern), so dass Sie einige Seiten sperren sollten sicher sein, sie sind nie ausgelagert.

Sie können hier die Dinge in Java zu tun, aber Java macht es komplizierter, nicht einfacher. Ich würde schauen in ein gemischtes Design, wobei der Kern in C sein würde und der Rest (GUI, etc ...) in Java wäre, wenn Sie wollen.

Eine Sache, die ich nicht in Ihrer Frage nicht sehen, ob Sie diese verarbeiteten Proben spielen müssen oder wenn Sie mit ihnen etwas anderes tun (kodiert sie in eine Datei, zum Beispiel). Ich würde mehr Sorgen über den Zustand der Java Sound-Engine als in, wie schnell die JVM Proben knirschen kann.

ich ziemlich hart gepuscht auf javax.sound.sampled ein paar Jahre zurück und kam weg tief unbeeindruckt - es nicht vergleichen mit den entsprechenden Frameworks wie OpenAL oder Mac / iPhone Core Audio (die ich beide auf ein verwendet haben ähnliches Intensitätsniveau). javax.sound.sampled erfordert, dass Sie Ihre Proben in einen undurchsichtigen Puffer von unbekannter Dauer zu drücken, die Synchronisation nahezu unmöglich macht. Es ist auch schlecht dokumentiert (sehr schwer Beispiele für Streaming unbestimmte Länge Audio über eine Linie zu finden, wie der In-Memory-Clips zu den trivialen Beispielen Gegensatz) hat nicht umgesetzt Methoden (DataLine.getLevel () ... deren Nichtumsetzung isn‘ t sogar dokumentiert), und um das Ganze abzurunden, ich glaube Sun vor den letzten Javasound Ingenieur Jahren entlassen.

Wenn I had eine Java-Engine verwenden, um Sound-Mixing und Ausgang, würde ich wahrscheinlich versuchen, die JOAL Bindungen zu OpenAL als erste Wahl zu verwenden, da ich zumindest den Motor wüsste wurde zur Zeit von sehr geringer Latenzzeit unterstützt und in der Lage. Obwohl ich auf lange Sicht vermuten, dass Nils korrekt ist und Sie die native Sound-API JNI am Ende zu nennen.

Ja, das ist Java ideal für Audio-Anwendungen. Sie können Java verwenden und Zugriff auf Audio-Schichten über Asio und haben wirklich niedrige Latenz (64 Samples Latenz, die so gut wie nichts ist) auf Windows-Plattform. Es heißt, Sie Lippensynchronisation auf Video / Film haben. Mehr Latenz auf Mac, da es keine Asio auf „Verknüpfung“ die Kombination von OS X und „Java on top“, aber immer noch in Ordnung. Linux auch, aber ich bin mehr unwissend. Siehe soundpimp.com für ein praktisches (und Welt zuerst) Beispiel für Java und Asio in perfekter Harmonie arbeiten. Siehe auch NRK Radio & TV Android App einen sw mp3-Decoder enthält (von Java). Sie tun können, die meisten Audio-Dinge mit Java, und dann eine native Schicht, wenn zusätzliche Zeit kritisch verwenden.

Bibliothek Check out genannt JSyn.

http://www.softsynth.com/jsyn/

Warum nicht einen Tag verbringen und eine einfache Java-Anwendung schreiben, die minimale Verarbeitung tut und validieren, ob die Leistung adaquate ist.

http://www.jsresources.org/faq_performance.html#java_slow

  

Lassen Sie uns etwas ethernal Weisheit sammeln:

     
      
  • Die Erde ist flach.

  •   
  • und, nicht zu vergessen:. Java ist langsam

  •   
     

Wie mehr Anwendungen unter Beweis stellen (siehe Links Abschnitt), Java ist ausreichend   zu bauen Audio-Editoren, mehrspurigen Aufzeichnungssysteme und MIDI   Verarbeitungssoftware. Probieren Sie es aus!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top