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