Может ли Android MediaPlayer воспроизводить аудио в архивном файле? - PullRequest
4 голосов
/ 17 января 2012

Отредактированный код:

Я занимаюсь разработкой приложения для словаря для Android.Мне удалось сделать приложение произносить каждое слово, которое ищется.Вот код:

btnPronounce.setOnClickListener(new View.OnClickListener() {            
        @Override
        public void onClick(View v) {                               
            // TODO Auto-generated method stub
            //Log.i(MAIN_TAG,"Start pronounciation ...");
            btnPronounce.setEnabled(false);
            String currentWord = edWord.getText().toString().toLowerCase();         

            try {
                ZipFile zip = new ZipFile("/sdcard/app_folder/sound/zip_test.zip");
                ZipEntry entry = zip.getEntry(currentWord);
                if (entry != null) {
                    InputStream in = zip.getInputStream(entry);
                    // see Note #3.
                    File tempFile = File.createTempFile("_AUDIO_", ".wav");
                    FileOutputStream out = new FileOutputStream(tempFile);
                    IOUtils.copy(in, out);

                    // do something with tempFile (like play it)
                    File f = tempFile;   
                    try {
                        if (f.exists())
                        {
                            Log.i(MAIN_TAG,"Audio file found!");
                            MediaPlayer mp = new MediaPlayer();

                            mp.prepare();
                            mp.setLooping(false);
                            mp.start();
                            while (mp.getCurrentPosition() < mp.getDuration());
                            mp.stop();
                            mp.release();
                            Log.i(MAIN_TAG,"Pronounciation finished!");
                        }   
                      else
                        {
                            Log.i(MAIN_TAG,"File doesn't exist!!");
                        }
                    }
                    catch (IOException e)
                    {
                        Log.i(MAIN_TAG,e.toString());
                    }
                    btnPronounce.setEnabled(true);  }

                else {
                    // no such entry in the zip
                }
            } catch (IOException e) {
                // handle your exception cases...
                e.printStackTrace();
            }       
     }      

    });

Но проблема в том, что в одной папке слишком много WAV-файлов, и все эти файлы считаются музыкальными файлами на устройствах Android.В результате для индексации таких файлов требуются годы.Кроме того, индексирование и просмотр пользователей иногда приводят к сбою приложения.

Поэтому мне просто интересно, можно ли программно выполнить следующее:

  1. Может ли Android MediaPlayer воспроизводить WAV/ MP3 файлы упакованы в один файл? Я имею в виду, я хочу сжать или обернуть аудиофайлы (или сделать что-то похожее), чтобы они отображались как один файл на устройствах Android, но MediaPlayer по-прежнему может воспроизводить каждый отдельный WAVфайл внутри.
  2. Если вышесказанное невозможно, вы, ребята, можете предложить решение проблемы?

РЕДАКТИРОВАТЬ: Есть лиЛюбые другие способы / решения, которые позволяют аудиофайлам быть просто помещенными в один большой файл (изображение, почтовый индекс или подобное ...) и затем позволяют MediaPlayer читать отдельные файлы в этом?

Большое спасибо.

Ответы [ 2 ]

6 голосов
/ 18 января 2012

Вы можете использовать комбинацию файловых операций ZipFile или ZipInputStream и java.io для чтения необходимых данных из zip-файла, создания временных файлов и воспроизведения их с использованием MediaPlayer.

В качестве альтернативы, вы могли бы просто использовать движок TTS и не выдавать APK размером более 50 миллиардов байт.

Редактировать - Пример по запросу:

try {
    ZipFile zip = new ZipFile("someZipFile.zip");
    ZipEntry entry = zip.getEntry(fileName);
    if (entry != null) {
        InputStream in = zip.getInputStream(entry);
        // see Note #3.
        File tempFile = File.createTempFile("_AUDIO_", ".wav");
        FileOutputStream out = new FileOutputStream(tempFile);
        IOUtils.copy(in, out);
        // do something with tempFile (like play it)
    } else {
        // no such entry in the zip
    }
} catch (IOException e) {
    // handle your exception cases...
    e.printStackTrace();
}

Примечания:

  1. Я не включил здесь никаких безопасных методов обработки файлов. Это зависит от вас.

  2. Это не способ сделать это, только способ сделать это. Есть, вероятно, 100 других способов, некоторые из которых могут лучше подходить для того, что вам нужно. Я не использовал ZipInputStream просто потому, что здесь задействовано немного больше логики, и я собирался для краткости. Вы должны проверять каждую запись, чтобы увидеть, что вы ищете с помощью ZipInputStream, тогда как ZipFile позволяет вам просто спросить, что вы хотите по имени. Я не уверен, что (если таковые имеются) повлияет на производительность, если использовать любой из них.

  3. Вы ни в коем случае не обязаны использовать временные файлы (или файлы вообще, на самом деле), но MediaPlayer Android не очень любит потоки, поэтому это, вероятно, самое простое решение. 1051 *

0 голосов
/ 18 января 2012

Альтернативой, которую вы должны рассмотреть, является загрузка отдельных звуковых файлов, когда пользователь хочет прослушать произношение. Это должно уменьшить размер файла, хотя это означает, что вы не можете прослушивать произношение, когда нет Интернета.

...