MP3-Decodierung auf Android

Wir implementieren ein Programm für Android-Handys, die Audio aus dem Internet gestreamt spielt. Hier ist ungefähr was wir tun:

  1. Laden Sie ein benutzerdefiniertes verschlüsseltes Format herunter.
  2. Entschlüsseln, um Chunks von regelmäßigen MP3-Daten zu erhalten.
  3. Decodieren von MP3-Daten in rohe PCM-Daten in einem Speicherpuffer.
  4. Pip die Roh-PCM-Daten an einen AudioTrack

Unsere Zielgeräte sind bisher Droid und Nexus One. Alles funktioniert super auf Nexus One, aber die MP3-Decodierung ist zu langsam auf Droid. Die Audiowiedergabe beginnt zu überspringen, wenn wir den Droid unter Last setzen. Wir sind nicht berechtigt, die MP3-Daten auf SD-Karte zu dekodieren, aber ich weiß, das ist nicht unser Problem sowieso.

  • Wie kann ich mehrere Textzeilen auf einer Schaltfläche anzeigen
  • ClassNotFoundException nach ADT-Aktualisierung
  • Bild in Canvas mit Touch Events
  • Wie man Spinner-Textfarbe ändert
  • Hintergrund Service getötet in Android
  • Android Studio Update 0.4.0 konnte nicht gefunden werden buildConfig ()
  • Wir haben nicht unseren eigenen MP3-Decoder geschrieben, sondern verwendet MPADEC ( http://sourceforge.net/projects/mpadec/ ). Es ist kostenlos und war einfach mit unserem Programm zu integrieren. Wir kompilieren es mit dem NDK.

    Nach ausführlicher Analyse mit diversen Profiling-Tools sind wir überzeugt, dass es dieser Decoder ist, der hinterher kommt.

    Hier sind die Optionen, an die wir denken:

    1. Finden Sie einen anderen MP3-Decoder, den wir mit dem Android NDK kompilieren können. Dieser MP3-Decoder müsste entweder optimiert werden, um auf mobilen ARM-Geräten laufen zu lassen oder vielleicht nur Integer-Mathematik oder andere Optimierungen zu verwenden, um die Leistung zu erhöhen.

    2. Da der eingebaute Android MediaPlayer Service URLs übernimmt, können wir in der Lage sein, einen kleinen HTTP Server in unserem Programm zu implementieren und den MediaPlayer mit den entschlüsselten MP3s zu bedienen. So können wir den eingebauten MP3-Decoder nutzen.

    3. Erhalten Sie Zugang zum eingebauten MP3-Decoder durch das NDK. Ich weiß nicht, ob das möglich ist.

    Hat jemand irgendwelche Vorschläge, was wir tun können, um unsere MP3-Decodierung zu beschleunigen?

    – Rob Sz

  • Wie bekomme ichPackageManager im Fragment Android
  • Wie mache ich einen Teil des Textes Bold in android zur Laufzeit?
  • Warum ist Android Studio Reporting "URI ist nicht registriert"?
  • Android Schatten anzeigen
  • Warten auf andere Animationsende
  • Kitkat kills: Nicht erlaubt, lokale Ressource zu laden: file: ///android_asset/webkit/android-weberror.png
  • 3 Solutions collect form web for “MP3-Decodierung auf Android”

    Der richtige Weg, dies zu tun ist, um Ihre eigene Firmware zu bauen und die Entschlüsselung als Teil eines benutzerdefinierten OpenCORE-Codecs zu machen. Das wird natürlich Sie auf Geräte beschränken, in denen Sie diese Firmware installieren können.

    Denken Sie daran, dass der Rest davon etwas spekulativ ist. Ich habe eigentlich die Notwendigkeit, etwas Ähnliches zu tun, was du beschreibst, aber ich habe keine Zeit, um das Problem für ein paar Monate anzugehen. Also, ich werde das in der Art und Weise beschreiben, wie ich mich dem Problem näherte.

    Eine Lösung ist die, die in der Antwort von twk beschrieben ist. Sie müssen nicht die SD-Karte verwenden, aber Sie müssen wahrscheinlich eine Welt lesbare temporäre Datei in Ihrem App-lokalen Dateispeicher ( getFilesDir() ) haben. Laden Sie das erste Chunk herunter, entschlüsseln Sie es, schreiben Sie es als komplette Weltlesbare MP3-Datei (aber mit einem entsprechend obskuren Verzeichnis / Pfad) und übergeben Sie es einem setDataSource() über setDataSource() . Während das spielt, laden oder entschlüsseln Sie eine zweite MediaPlayer Instanz, die die Wiedergabe startet, sobald die erste beendet ist, so nahtlos ein Übergang wie möglich. Sie setzen dann den ersten MediaPlayer und verwenden ihn mit deinem dritten Chunk, Ping-Ponging zwischen den beiden.

    Eine verwandte Lösung wäre in Jleedev's Kommentar. Es ist so ziemlich das Gleiche, außer dass du einen FileDescriptor über einen ContentProvider Verfügung ContentProvider . Dies hat eine Option, damit Sie einen Socket verwenden können , mit dem Sie die temporäre Datei vermeiden können. Allerdings muss der ContentProvider selbst öffentlich zugänglich sein, und so könnte die temporäre Datei mit einem obskuren Verzeichnis tatsächlich privater sein.

    Wenn Sie sich Sorgen um die Tatsache machen, dass diese Dinge von anderen Prozessen gelesen werden können, verstehen Sie bitte, dass MediaPlayer selbst (oder vielmehr das OpenCORE-Subsystem) in einem anderen Prozess ist. Auch dein vorgeschlagener HTTP-Server ist auch auf dem Gerät weltlich lesbar. Also, Sicherheit durch Dunkelheit ist Ihre einzige lebensfähige Option, wenn Sie gehen zu lassen MediaPlayer tun die Dekodierung.

    AFAIK, die NDK gewährt keinen Zugang zu OpenCORE, obwohl ich gestehe, dass ich eingeschränkte NDK-Erfahrung habe, also kann ich mich irren Es gibt sicherlich andere MP3-Decoder zur Verfügung ( ffmpeg / mplayer , etc.), obwohl, wie leicht diese in eine NDK-Bibliothek umgewandelt werden konnte, ist unklar.

    Also, es kocht wirklich, wer du versuchst zu verteidigen. Wenn du versuchst, gegen den Benutzer zu verteidigen, musst du dich wahrscheinlich selbst entschuldigen.

    MAD ist eine Integer-Arithmetik-Decoder-Bibliothek, die gut zu sehen scheint.

    (Würde die Decodierung der Daten auf der SD-Karte nicht verlangsamen?)

    Ich habe das nicht ausprobiert, aber ich glaube, du kannst dem Media Player einen Dateideskriptor geben:

     public void setDataSource (FileDescriptor fd, long offset, long length) 

    Vielleicht könntest du das entschlüsselte mp3 in eine Datei schreiben und es mit dem Dateideskriptor abspielen. Dies könnte sogar für Streaming arbeiten vorausgesetzt, Sie kennen die Dateilänge vor der Zeit. Wenn es funktioniert, wäre es viel einfacher als ein localhost Webserver zu tun.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.