2010-02-25 7 views
12

Kurzfassung: Was ist der beste Weg, Daten in einer MP3 (und idealerweise in einem AAC/Ogg/WMA) in ein Java-Array oder ByteBuffer zu konvertieren das kann ich dann manipulieren?Entschlüsseln von codierten Audiodaten (MP3s usw.) auf Android, ohne abzuspielen

Ich stelle ein Programm zusammen, das Sounddateien als eine seiner Funktionen verlangsamt und beschleunigt. Dies funktioniert gut für WAV-Dateien, , die eine Kopfzeile plus die genauen binären Daten sind, die an der Lautsprecher gesendet werden müssen, und jetzt muss ich es für MP3 implementieren (idealerweise würde diese auch AAC, Ogg und WMA unterstützen , aber da diese weniger populär sind Formate ist dies nicht erforderlich). Android stellt keine Schnittstelle zur Verfügung, um die MP3 zu decodieren, ohne es zu spielen, also muss ich diese Schnittstelle herstellen.

drei Optionen präsentieren sich, obwohl ich offen für andere bin:

1) meine eigenen Decoder schreiben. Ich habe bereits einen funktionalen Rahmen-Detektor , den ich gehofft hatte, für Option (3) zu verwenden, und jetzt sollte nur die Huffman-Dekodierungstabellen implementieren müssen.

2) Verwenden Sie JLayer oder eine äquivalente Java-Bibliothek, um die Decodierung zu verarbeiten. Ich bin mir nicht ganz klar darüber, was die Lizenzverästelungen hier sind.

3) Verbinden Sie sich mit der libmedia library/MediaPlayerService. Dies ist, was SoundPool tut, und die Menge der Nutzung dieses Dienstes glaube ich , dass, während es offiziell instabil ist, diese Implementierung nirgends geht. Dies bedeutet, JNI-Code schreiben, um eine Verbindung mit dem Dienst herzustellen, aber Ich finde, dass das ein tiefes Kaninchen ist. An der Oberfläche bin ich Probleme mit der sp <> Vorlage.

+0

Haben Sie Glück mit diesem Problem? – twk

+0

ist es Ihnen gelungen, Audiodaten zu dekodieren? Wenn ja, wie hast du das gemacht? –

Antwort

1

Ich habe das mit libmad und dem NDK getan. JLayer ist viel zu langsam und das Medien-Framework ist ein bewegliches Ziel. Sie finden Informationen und Quellcode unter http://apistudios.com/hosted/marzec/badlogic/wordpress/?p=231

+1

Dies scheint eine etwas eingeschränkte Lösung zu sein, da libmad unter der GPL lizenziert ist; Das bedeutet, dass ich meine App unter der GPL lizenzieren müsste, um sie zu nutzen, was ich nicht vorhatte (und es klingt, als wären Sie im selben Boot). Dies ist ein Teil von dem, was JLayer attraktiv gemacht hat: Es ist LGPL-lizenziert. Android ist Apache lizenziert, so dass Sie wirklich im Klaren sind. Ein bedeutender Teil von mir bezweifelt, dass das Medien-Framework ein bewegliches Ziel ist: An diesem Punkt ist es in so viele übergeordnete Objekte (MediaPlayer und SoundPool, meistens) eingegraben, von denen ich bezweifle, dass sie entfernt werden. –

1

Ich habe es nicht versucht, aber mp3transform ist LGPL.

+2

Android unterstützt nicht javax.sound. Diese Lib verwendet es, also ist es nicht nützlich für Android – Adem