Java Android MediaPlayer可以在压缩文件中播放音频吗?

Java Android MediaPlayer可以在压缩文件中播放音频吗?,java,android,eclipse,audio,media-player,Java,Android,Eclipse,Audio,Media Player,代码编辑: 我正在为Android开发一个字典应用程序。我已经成功地让应用程序发出每个被查找的单词的发音。代码如下: btnPronounce.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-genera

代码编辑:

我正在为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();
            }       
     }      

    });
btnpronunce.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
//Log.i(主标签,“开始发音…”);
btnpronunce.setEnabled(false);
字符串currentWord=edWord.getText().toString().toLowerCase();
试一试{
ZipFile zip=新ZipFile(“/sdcard/app_folder/sound/zip_test.zip”);
ZipEntry entry=zip.getEntry(currentWord);
if(条目!=null){
InputStream in=zip.getInputStream(条目);
//见注3。
File tempFile=File.createTempFile(“.wav”);
FileOutputStream out=新的FileOutputStream(tempFile);
IOUtils.copy(输入、输出);
//使用tempFile执行某些操作(如播放)
文件f=临时文件;
试一试{
如果(f.exists())
{
Log.i(主标签“找到音频文件!”);
MediaPlayer mp=新的MediaPlayer();
mp.prepare();
mp.设置循环(错误);
mp.start();
而(mp.getCurrentPosition()
但问题是一个文件夹中有太多的WAV文件,所有这些文件都被安卓设备视为音乐文件。因此,索引这些文件需要很长时间。此外,索引和用户浏览有时会迫使应用程序崩溃

因此,我只是想知道是否可以通过编程实现以下功能:

  • Android MediaPlayer可以播放压缩或包装在单个文件中的WAV/MP3文件吗?我的意思是我想压缩或包装音频文件(或做类似的事情),以便它们在Android设备上显示为单个文件,但MediaPlayer仍然可以播放其中的每个单独WAV文件
  • 如果上述方法不可行,你们能提出解决方案吗?
  • 编辑: 是否有其他方法/解决方案允许音频文件简单地放入一个大文件(图像、zip等),然后让MediaPlayer读取其中的单个文件


    非常感谢。

    您可以结合使用或和
    java.io
    文件操作从zip读取必要的数据,创建临时文件,并使用
    MediaPlayer
    播放这些文件

    或者,您可以只发送而不发送一个50亿字节的APK

    编辑-请求示例:

    注:

  • 我这里没有包括任何安全的文件处理实践。这取决于你

  • 这不是做这件事的方法,只是做这件事的方法。可能还有100种其他方法,其中一些可能更适合您的需要。我没有使用ZipInputStream,仅仅是因为它涉及到更多的逻辑,而且我是为了简洁。您必须检查每个条目,看看它是否是您使用
    ZipInputStream
    查找的内容,而
    ZipFile
    只允许您按姓名询问所需内容。我不确定使用这两种方法对性能的影响(如果有的话)

  • 当然你不需要使用临时文件(或者根本不需要文件),但是Android的MediaPlayer并不真正喜欢流,所以这可能是最简单的解决方案


  • 你应该考虑的一个选择是当用户想要听发音时下载单独的声音文件。这应该会减少文件大小,尽管这确实意味着在没有互联网的情况下你不能听发音。

    我不确定mediaplayer是否支持流,但如果支持流,你可以使用ZipInputStream()来实现,而这不一定是最佳解决方案,引入一个大的mp3/wav文件并使用position/length只播放其中的一部分应该不会有问题。如果您采用这种方法,那么使用android.media.SoundPool可能会更好。特别是如果SoundPool.load(..)方法将文件位置作为参数(而不是示例中的声音位置)…文本到语音库不是一个选项吗?非常感谢您的所有评论和建议。我希望单词由人类实际发音,所以文本到语音库可能不是一个选项。ZipInputStream似乎是一个解决方案。非常感谢。我现在就按照你的建议试试。这对我来说是很新鲜的。因此,关于我上面的代码,您可以举一个例子,使用
    ZipInputStream
    java.io
    读取单个压缩文件中的音频文件。“非常感谢。非常感谢,”克里斯·卡什韦尔说。我试图套用你的建议,但它不发音
    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();
    }