Android Media Player: Download Datei-und Stream-Datei
Ich bin mit Android MediaPlayer
zur Wiedergabe von MP3-Dateien, die gleichzeitig heruntergeladen aus dem internet über die DownloadManager
. Ich bin mir bewusst, dass der MediaPlayer
's capability stream direkt, aber ich möchte nicht, dass:
Den offensichtlichen Vorteil, den Sie bekommen, durch das herunterladen und gleichzeitige streaming von Datei, die auf diese Weise, die Datei wird gespeichert und steht danach lokal.
- Dies funktioniert im Prinzip - die
MediaPlayer
startet um die Datei zu spielen, auch wenn es nicht vollständig heruntergeladen. (BTW mein problem ist NICHT, dass ich kann nichtMediaPlayer
zu spielen.) - Das problem ist, dass, wenn die
MediaPlayer
bekommt auf der position, wo der download-status war nur noch, Wann es angefangen zu spielen, hört es und ruftonCompletion
. (Klärung: nehmen wir an, die Datei ist 12% heruntergeladen, wenn ich die Wiedergabe starte. Wenn der Spieler die position bei 12%, dann Stoppt es.) - Kurze Randnotiz:
OnBufferingUpdateListener.onBufferingUpdate(...)
wird nicht aufgerufen, wenn etwas angehängt wird, um die MP3-Datei über dieDownloadManager
.
Also die Frage ist: Wie kann ich gleichzeitig laden Sie eine audio-Datei, um die Datei-system und spielen Sie es? (Android 4+ genügt, wenn das einen Unterschied macht.)
- Wie machst du denn das streaming? Durch die Implementierung einer einfachen localhost-server liest Daten aus der Download-Datei und führt es einen MediaPlayer, der eingestellt wurde, um Strom von localhost? In diesem Fall konnte nicht Sie Ihre server return ein Content-Length-entspricht oder übertrifft die gesamte Länge der Datei?
- Gut, ich habe gerade Punkt der MediaPlayer die Datei, die derzeit, und setzen Sie dessen Modus auf STREAM_BLAH (was es eigentlich heißt). Also ich habe keinen server derzeit.
- Hi Hinton, ich haben zu tun die gleiche Sache, die Sie Fragen können Sie eine Antwort(mit einigen Details), wie hast du es so, dass ich umsetzen kann, es auf meiner Seite.
- Ich bin ziemlich beschäftigt im moment, aber ich werde versuchen, die Antwort in ein paar Tagen, wenn Sie immer noch wollen, nachdem Sie dies gelesen habe. Problem: die Sache, Die ich realisiert endlich, ist ziemlich hässlich. Ich habe versucht, Oren Ansatz (das ist natürlich die beste und richtige Lösung), aber es war nicht so wichtig für mich, so dass ich gerade beschlossen, Strom aus der URL standardmäßig und lassen Sie die Benutzer sagen Sie mir, wenn Sie wollte zum download. Im letzteren Fall, würde ich Strom aus der URL beim Download (ja: Verschwendung von Bandbreite), und als der download fertig war, ich würde wechseln vom streaming auf die heruntergeladene Datei, wenn der Benutzer auf pause.
- Weiter: Das funktioniert erstaunlich gut. Das problem ist die Verschwendung von Bandbreite. Wenn Sie dies tun, für einen Kunden, der ist nicht sehr aufmerksam und nicht kompetent über android-Programmierung, Sie werden nie bemerken. Es funktioniert-zumindest als temporäre Lösung - Kunden sagen Sie "ich MÖCHTE dieses feature" - dann ist es natürlich besser zu implementieren, Alles schnell und versuchen, es zu beheben, wenn Sie Zeit haben (= "nie", wenn Sie eine zynische person).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie zeigen sind MediaPlayer die Datei. In diesem Fall glaube ich nicht, es unterstützt das streaming, und es wahrscheinlich überprüft die Größe der Datei und so im Voraus, damit es nicht zu aktualisieren, sich selbst als mehr von der Datei kommt.
Haben Sie zu zeigen, um eine Inhaltsquelle, die Arbeit wird mit streaming, z.B. HTTP.
Ich habe gerade geprüft, wie Sie den "ES File Explorer" funktioniert es (Mit LogCat) - wenn Sie auf eine video-Datei in einer Freigabe remote-Datei, es öffnet sich ein lokaler HTTP-server, und sendet der MediaPlayer eine HTTP-Uri, um Ihre lokalen server, der auch den remote-Pfad.
Wann wird Sie die Anfrage über HTTP, wird der lokale server gestartet wird, Lesen Sie die Datei von einem remote-Standort, und bietet es lokal zu MediaPlayer über HTTP.
Sie können wahrscheinlich das gleiche tun, und neben der Bereitstellung via HTTP auch auf der Festplatte speichern.
Es hat mir geholfen, ich hoffe, jemand anderem zu helfen.
Player downloaden & spielen Sie Musik ab.
Nach dem Download der Datei:
Ich habe das gleiche problem. Natürlich, Wenn ich
setDataSource(video_uri)
undaCustomDownload(video_uri)
zur gleichen Zeit, kann es speichern und Abspielen, aber es Verschwendung von Bandbreite.Ich habe versucht, eine gefälschte Sperrung Filedescriptors(FileInputStream, LocalSocket) zu
setDataSource
, und andere Möglichkeiten, aber alle waren gescheitert.Also ich fand diese Lösung, VideoCache.
Es über einen http-proxy-server gleich wie @Oren 's Antwort.
Es baut eine socket-lokalen http-server , Dann hören für eine gültige url wie
http://127.0.0.1:xxxx/url_encode('your video url')
.Wenn es eine gültige url ist, schafft es eine socket-Anfrage-client zum download von der url, und senden Sie den stream-server von
127.0.0.1
.SO können Sie
setDataSource('http://127.0.0.1:xxxx/your video's encode url')
Verwenden Sie einmal herunterladen, speichern und spielen. Und es kann aus eine singleton-server mit einer weiteren Aktivität(lifecycle) starten, so kann ich es verwenden von
android.intent.action.SEND
oder andereLAUNCHER
.Es ist ein Präfekt Lösung.