Wie wird InputStream einer Audiodatei wiedergegeben, die sich nicht in einer URL oder einem Speicher befindet?

8

Hintergrund

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.

Das Problem

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.

Was ich versucht habe

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.

Die Frage

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?

    
android developer 11.04.2016, 15:02
quelle

4 Antworten

2

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.

    
CommonsWare 24.04.2016 23:00
quelle
1

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")

einfügen %Vor%

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

abrufen %Vor%

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)

einen Byte-Stream über diesen Server an MediaPlayer übertragen     
isabsent 10.09.2017 14:07
quelle
0

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 Ссылка

    
greatape 08.09.2017 11:00
quelle
-1

Wenn Sie nach Media Player fragen, der unseren Audio-Pfad eingestellt hat, kann dieser Code vielleicht helfen.

%Vor%
    
Dato' Sapik 16.07.2017 05:08
quelle