加载多个音频文件的简单方法?

Posted

技术标签:

【中文标题】加载多个音频文件的简单方法?【英文标题】:Simple way to load multiple audio files? 【发布时间】:2015-03-20 17:38:53 【问题描述】:

我一直在尝试找到一种加载大量音频文件的好方法。 下面的代码工作正常,但我需要加载更多文件,这就是我遇到问题的时候。

这是一个测验,当用户选择正确答案时,应该播放新的声音。我必须加载 50 多种声音。

我目前加载文件的方式:

    this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    spool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

                Context myActivity = getApplicationContext();

                    primSounds.add(spool.load(myActivity, R.raw.int_prim_c_mel, 1));
                    primSounds.add(spool.load(myActivity, R.raw.int_prim_d_mel, 1));
                    primSounds.add(spool.load(myActivity, R.raw.int_prim_e_mel, 1));

                    kvintSounds.add(spool.load(myActivity, R.raw.int_kvint_c_mel, 1));
                    kvintSounds.add(spool.load(myActivity, R.raw.int_kvint_d_mel, 1));
                    kvintSounds.add(spool.load(myActivity, R.raw.int_kvint_e_mel, 1));

                    oktSounds.add(spool.load(myActivity, R.raw.int_okt_c_mel, 1));
                    oktSounds.add(spool.load(myActivity, R.raw.int_okt_d_mel, 1));
                    oktSounds.add(spool.load(myActivity, R.raw.int_okt_e_mel, 1));

                    ...

问题是这种方式会使 onCreate “太重”

【问题讨论】:

您需要同时加载所有 50 个吗?你不能加载一些然后在使用后重新加载另一组吗? 也许,测验问题是随机的,所以加载速度必须很快 在展示之前,您能知道每次测验需要哪些音频吗?在这种情况下,您可以为每个测验加载音频。因此,在显示测验 a 之前:加载所有“a”音频当显示测验“a”时:加载测验 b 音频等等 测验使用最高难度的每个音频 【参考方案1】:

Here你有一个可能的解决方法。

但在您的情况下,您将在某个时候一次加载 50 个声音。这意味着您将使用大量内存。 不得不在自己面前面对类似的情况,我认为您可以使用以下代码:

SoundtrackManager.java

   public void prepareSoundtrack(int soundtrackId, Context context) 
        try 

            if (mMediaPlayer != null) 
                mMediaPlayer.release();
                mMediaPlayer = null;
            


            mMediaPlayer = MediaPlayer.create(context, soundtrackId);

         catch (Exception e) 
            mMediaPlayer.release();
            e.printStackTrace();
        

  

    public void play() 
        if (mMediaPlayer != null) 
            try 
                mMediaPlayer.start();
             catch (Exception e) 
                e.printStackTrace();
            
        
    

使用:

mSoundTrackManager.prepareSoundtrack(R.raw.the_sound, mContext);
mSoundTrackManager.play();

只要正在播放的声音不变,就可以调用 play()。

缺点是必须为每个声音创建一个 MediaPlayer。但是您不会同时将所有这些都存储在内存中。此外,它们会立即加载/播放。

编辑:

这可以通过在 SoundtrackManager 类中创建一个 MediaPlayer 对象的“池”来改进。因此,如果需要其中一种随机声音并且恰好位于该“池”中,则可以避免不断重新设置 MediaPlayer。

【讨论】:

谢谢!我认为 SoundPool 是一个更好的选择,因为音频文件是 midi 和 1-3 秒长。

以上是关于加载多个音频文件的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发拓展篇—封装音频文件播放工具类

使用任何方法在 openTK 应用程序中播放音频的最简单方法

从视频文件中提取音频并在 OpenAL 中播放

Unity | 读取Resources文件夹中的多个图片音频

基于C++实现的用于OpenAL的 .wav音频加载器

在简单的 iOS 游戏中音频的最佳方法是啥?