Ich habe erfolgreich eine Audiodatei (3GP) in Google-Drive hochgeladen.
Jetzt möchte ich in der Lage sein, die Datei innerhalb der App abzuspielen.
Die Google Drive-API ermöglicht nur das Abrufen des Eingabedatenstroms der Datei, die dort gespeichert ist.
Alle MediaPlayer-Fähigkeiten von Eingaben sind in meinem Fall nicht verfügbar, was nur InputSteam ist:
Ich weiß, dass ich die Datei vom Google-Laufwerk in den Cache speichern und abspielen kann, aber ich möchte die Speicherbehandlung vermeiden und die Datei im laufenden Betrieb abspielen.
Ich habe versucht, nach diesem Problem zu suchen, und habe nur festgestellt, dass es möglich ist, AudioTrack ( hier ) zu verwenden ). Es könnte auch möglich sein, neue Jelly-Bean-Features zu verwenden (siehe hier ) hier ), aber ich bin mir nicht sicher, da es sich um ein ziemlich niedriges Level handelt.
Leider habe ich mit AudioTrack falsche Sounds abgespielt (Rauschen).
Ich habe auch bemerkt, dass der MediaPlayer die Option hat, die dataSource als MediaDataSource festzulegen ( hier ), aber ich bin mir nicht sicher, wie ich es verwenden soll, es benötigt auch API 23 und höher.
Natürlich habe ich versucht, eine URL zu verwenden, die in Google-Drive angegeben ist. Sie wird jedoch nur für andere Zwecke verwendet und wird nicht an die Audiodatei weitergeleitet, sodass sie nicht mit dem MediaPlayer verwendet werden kann.
Gibt es einen InputStream, ist es möglich, AudioTrack oder etwas anderes zu verwenden, um eine Audio-3GP-Datei abzuspielen?
Gibt es vielleicht eine unterstützende Bibliothekslösung dafür?
Wenn Ihr minSdkVersion
23 oder höher ist, können Sie Verwenden Sie setDataSource(MediaDataSource)
und geben Sie Ihre eigene Unterklasse von abstract
MediaDataSource
class
Bei älteren Geräten sollten Sie in der Lage sein, eine aus ParcelFileDescriptor
erstellte Pipe zu verwenden. Du hättest einen Thread, der Daten an dein Ende der Pipe schreibt und die FileDescriptor
(von getFileDescriptor()
) für das Ende des Players an setDataSource(FileDescriptor)
übergibt.
Das einfachste Beispiel für eine MediaDataSource-Implementierung:
%Vor% Um es mit API & gt; = 23 zu verwenden, müssen Sie streamLength
value angeben und wenn (wenn) MediaPlayer zurückgeht - dh position < lastReadEndPosition
, müssen Sie wissen, wie Sie eine neue Kopie von InputStream
/ p>
Anwendungsbeispiel:
Sie müssen Activity erstellen, MediaPlayer
class initialisieren (es gibt viele Beispiele für die Wiedergabe einer Datei) und folgenden Code anstelle des alten player.setDataSource("/path/to/media/file.3gp")
Wenn Ihre Datei ein Objekt com.google.api.services.drive.model.File
auf Google Drive und com.google.api.services.drive.Drive drive
ist, können Sie
Im Fall von Build.VERSION.SDK_INT < Build.VERSION_CODES.M
musste ich den HTTP-Server auf dem lokalen Host eines Android-Geräts einrichten (mittels NanoHTTPd ) >) und über byri - player.setDataSource(this, mediaUri)
Für alle, die sich für die Verwendung einer MediaDataSource-Implementierung interessieren, habe ich eine erstellt, die vorauslesen und Datenpuffer zwischenspeichern kann. Es funktioniert von jedem InputStream, ich habe es hauptsächlich zum Lesen von Netzwerkdateien mit JCIFS SmbFile erstellt.
Sie finden es unter Ссылка
Wenn Sie nach Media Player fragen, der unseren Audio-Pfad eingestellt hat, kann dieser Code vielleicht helfen.
Tags und Links android playback android-mediaplayer audiotrack inputstream