Как воспроизвести один аудиофайл из коллекции 100k аудиофайлов, разделенных на две папки?

Я поместил две папки мультимедиа в одну папку zip, и в общей сложности в папке zip 100 000 медиафайлов. Мне нужно воспроизвести один файл из определенной папки в папке zip. Проблема в том, что сначала полностью читается общее содержимое папки Zip, а затем происходит доступ к необходимому файлу. Таким образом, для воспроизведения одного файла требуется более 55 секунд. Мне нужно решение, чтобы уменьшить время, затрачиваемое на воспроизведение аудиофайлов.

Ниже мой код:

long lStartTime = System.currentTimeMillis();
            System.out.println("Time started");
            String filePath = File.separator+"sdcard"+File.separator+"Android"+File.separator+"obb"+File.separator+"com.mobifusion.android.ldoce5"+File.separator+"main.9.com.mobifusion.android.ldoce5.zip";
            FileInputStream fis = new FileInputStream(filePath);
            ZipInputStream zis = new ZipInputStream(fis);
            String zipFileName = "media"+File.separator+"aus"+File.separator+fileName;
            String usMediaPath = "media"+File.separator+"auk"+File.separator;
            ZipEntry entry;
            int UnzipCounter = 0;
            while((entry = zis.getNextEntry())!=null){
            UnzipCounter++;
                System.out.println(UnzipCounter);
                if(entry.getName().endsWith(zipFileName)){
                    File Mytemp = File.createTempFile("TCL", "mp3", getActivity().getCacheDir());
                    Mytemp.deleteOnExit();
                    FileOutputStream fos = new FileOutputStream(Mytemp);
                    for (int c = zis.read(); c!=-1; c= zis.read()){
                        fos.write(c);
                    }
                    if(fos!=null){
                        mediaPlayer = new MediaPlayer();
                    }
                    fos.close();
                    FileInputStream MyFile = new FileInputStream(Mytemp);
                    mediaPlayer.setDataSource(MyFile.getFD());
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                    mediaPlayer.setOnCompletionListener(this);
                    long lEndTime = System.currentTimeMillis();
                    long difference = lEndTime - lStartTime;
                    System.out.println("Elapsed milliseconds: " + difference);
                    mediaPlayer.setOnErrorListener(this);
                }
                zis.closeEntry();
            }
            zis.close();

1 ответ

Постарайтесь не разархивировать файл, поскольку он занимает слишком много времени. Вместо того, чтобы разархивировать файл, вы можете выполнить следующий шаг:

  1. Разархивируйте файл при первом запуске приложения. Установите флаг, чтобы мы запускали приложение раньше, используйте настройки.
  2. При следующем запуске проверьте флаг. Если приложение никогда не запускалось, перейдите к первому шагу. Если он был запущен раньше, найдите файл и играйте.

Если вы действительно не можете использовать этот шаг, потому что это ваше требование, вы можете попробовать использовать truezip vfs. Но знайте, что я никогда не использовал это раньше. Вот библиотека: https://truezip.java.net/, https://github.com/jruesga/android_external_libtruezip

Другие вопросы по тегам