Android Media Player: загрузка в файл и поток из файла
Я использую Android MediaPlayer
для воспроизведения файлов MP3, которые одновременно загружаются из Интернета с помощью DownloadManager
. Я знаю о возможности MediaPlayer
для потоковой передачи напрямую, но я не хочу использовать это:
Очевидное преимущество, которое вы получаете при загрузке и одновременном потоке из файла, заключается в том, что таким образом файл сохраняется и доступен локально впоследствии.
- Это работает в принципе -
MediaPlayer
начинает воспроизводить файл, даже если он не полностью загружен. (Кстати, моя проблема НЕ в том, что я не могу получить MediaPlayer
для воспроизведения.)
- Проблема заключается в том, что когда
MediaPlayer
переходит в положение, когда статус загрузки был только когда он начал воспроизводиться, он останавливается и вызывает onCompletion
. (Уточнение: предположим, что файл загружается на 12%, когда я начинаю играть. Когда игрок достигает позиции на 12%, он останавливается.)
- Быстрая заметка:
OnBufferingUpdateListener.onBufferingUpdate(...)
не вызывается, когда что-то добавляется в файл MP3 через DownloadManager
.
Итак, вопрос: Как я могу одновременно загрузить аудиофайл в файловую систему и воспроизвести его? (Android 4+ хватает, если это имеет значение.)
Ответы
Ответ 1
Я предполагаю, что вы указываете MediaPlayer на файл. В этом случае я не думаю, что он поддерживает потоковое вещание, и он, вероятно, проверяет размер файла и так заранее, поэтому он не будет обновлять себя, поскольку в него входит больше файла.
Вы должны указать его на источник контента, который будет работать с потоковой передачей, например. HTTP.
Я только что проверил, как это делает "ES File Explorer" (с помощью LogCat) - при нажатии на видеофайл в удаленном общем доступе к файлу он открывает локальный HTTP-сервер и отправляет на MediaPlayer HTTP Uri на свой локальный сервер, который также включает удаленный путь.
Когда он получает запрос через HTTP, локальный сервер начинает считывать файл из удаленного места и локально переносит его в MediaPlayer через HTTP.
Возможно, вы можете сделать то же самое, и в дополнение к предоставлению его через HTTP также сохраните его на диске.
Ответ 2
Это помогло мне, я надеюсь помочь кому-то еще.
Плеер загружает и воспроизводит музыку.
mMediaPlayer.setDataSource(DOWNLOAD_URL);
File root = Environment.getExternalStorageDirectory();
File dir = new File(root + "/Folder");
if (!dir.exists()) {
dir.mkdirs();
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri downloadUri = Uri.parse(DOWNLOAD_URL);
DownloadManager.Request request = new DownloadManager.Request(downloadUri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setAllowedOverRoaming(false);
request.setTitle(TITLE);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, TITLE);
request.allowScanningByMediaScanner();
После загрузки файла:
mMediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/Folder/" + TITLE + ".mp3");