【问题标题】:Soundpool plays only first 5 secs of file. Why?Soundpool 只播放文件的前 5 秒。为什么?
【发布时间】:2012-11-02 21:03:08
【问题描述】:

我在我的应用程序中使用 Soundpool,到目前为止效果很好,但我确实有一个 10 秒的 wav 文件。不幸的是,soundpool 只播放前 5 秒。如何让 soundpool 播放整首曲目?我已将 wav 转换为 -- ogg 和 mp3 仍然是同样的问题。它只播放前 5 秒。任何帮助将不胜感激。

//set up audio player
mSoundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
//load fx
mSoundPoolMap.put(RAW_1_1, mSoundPool.load(this, R.raw.loop1, 1));
//playing soundpool
case R.id.button1:          
mSoundPool.stop(mStream1);
mStream1= mSoundPool.play(mSoundPoolMap.get(RAW_1_1), streamVolume, streamVolume, 1, LOOP_1_TIME, 1f);

UPD 最后:也许有人会在这里找到并阅读它。似乎 soundpool 不能播放超过 5 秒。这是他的最大值,对于更长的声音使用 MediaPlayer。我希望你不会像我那样花太多时间)

【问题讨论】:

  • @Yahor10,我已经添加了一段代码,你也想要那个 wav 文件吗?因为我尝试过使用其他 wav,所以相同的结果不超过 5 秒
  • 你的 logcat 中有什么东西吗?我知道 soundpool 文件被限制为相当短(1MB 未压缩的 PCM 数据),也许它太长了?我认为 logcat 中应该有一些消息。
  • @Tim logcat 很清楚,这里什么都没有,我所有的文件都不超过 1 mb
  • 同样的问题,但我对任何文件的限制为 10 秒 - 18、21 秒长,无论如何。让我发疯
  • @cooervo,我有一个带有 4 个 MediaPlayers 按钮的音乐应用程序。因此,所有这 4 个按钮都可以同时激活,我对同时运行 4 个 Mediaplayer 循环没有任何问题。因此,它不会使您的应用程序崩溃。确认的。这是很久以前的事情了,我相信现在它已经有了很大的改进。

标签: android soundpool


【解决方案1】:

所以我认为您在 SoundPool 中达到了 1M 的限制。

SoundPool 硬编码缓冲区大小为 1M,对于所有加载的文件,以 pcm 格式存储。

所以它不关心 ogg 或 wav。

【讨论】:

  • em,对于音频,每个设备(不是每个应用程序)也有 32 个活动 AudioTrack 对象(SoundPool、MediaPlayer 使用 AudioTrack 进行播放)的硬性限制。
  • 我怎样才能达到 1M 的限制? 2shared.com/audio/aYty0aVm/loop1.html(点击第二个下载行)--下载这个循环并在你身边用soundpool检查它,如果你能成功。仅添加此循环,它小于 1M。我认为 soundpool 是为播放短音而设计的,5 秒是他的上限。
  • 这是否记录在任何地方?如果SoundPool page 提到我的声音可能太长,我就不会浪费两个小时了。
  • 我的音频是一个 113Kb 的 ogg 文件。他的持续时间约为 7 秒,大约在 5 秒时被切断。所以我认为还有一个持续时间限制。不确定
  • @SérgioS.Filho ogg 格式将解压为 pcm 格式,实际大小与其长度和采样率有关。
【解决方案2】:

我们通过降低 *.ogg 效果采样率解决了类似的问题。我们的初始采样率为 44 kHz ~ 只播放了 10 秒的声音,降低到 16 kHz 将可播放性提高到 30 秒

解决方案在this discussion找到

【讨论】:

  • +1 关于采样率对声音播放持续时间的影响。但是,我们不能一直降低采样率,所以无论如何,对于更长的声音,使用 MediaPlayer 是一个不错的决定。两者都有各自的优势,因此应由开发人员做出决定。再次感谢您发布您的解决方案,这很有趣。
【解决方案3】:

SoundPool 旨在播放短音效。要播放音乐(大音频文件),您需要使用MediaPlayer

// R.raw.audio_file - res/raw/audio_file.mp3

mediaPlayer = MediaPlayer.create(this, R.raw.audio_file);
mediaPlayer.start();

【讨论】:

    【解决方案4】:

    这个活动适合我

    public class MainActivity extends Activity {
    
        private Integer soundID;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
            // Load the sound
            AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
            float actualVolume = (float) audioManager
                .getStreamVolume(AudioManager.STREAM_MUSIC);
            float maxVolume = (float) audioManager
                .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
            final float volume = actualVolume / maxVolume;
    
            SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    
            soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
              @Override
              public void onLoadComplete(SoundPool soundPool, int sampleId,
                  int status) {
                          @Override
          public void onLoadComplete(SoundPool soundPool, int sampleId,
              int status) {
              soundPool.play(soundID, volume, volume, 1, 0, 1f);
              try {
                Thread.sleep(5000); // play twice
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
              soundPool.play(soundID, volume, volume, 1, 0, 1f);
          }
        });
              }
            });
            soundID = soundPool.load(this, R.raw.sound2, 1);
          //load fx
          //playing soundpool
    
        }
    }
    

    您必须加载您的声音异步并检查音频缓存 - 它可能会溢出。

    阅读这篇文章 http://www.google.by/url?http://www.vogella.com/articles/AndroidMedia/article.html

    很用心

    【讨论】:

    • 在你的代码中没有什么不同,我的是一样的。我为 minsdk-7 onLoad 创建应用程序需要 api-8。需要指出的是,如果不加载声音,则根本不会播放。为什么我需要检查它是否加载?就我而言,它会播放,但只有最初的 5 秒。似乎是音池问题。自己试一下,如果能播放超过5秒的文件,尽量播放10秒
    • 这里有一个链接2shared.com/audio/aYty0aVm/loop1.html,点击第二个“下载”-raw.. tahnks 寻求帮助
    • Thread.sleep(5000); // 播放两次 --- 我根本无法在我的代码中使用它,在此循环播放时,还有其他声音,如军鼓、钹等,必须通过单击其他按钮来播放.. 所以
    【解决方案5】:

    您的文件可能太大。如果您仍然不需要立体声,请尝试从立体声更改为单声道。 或者尝试对您的文件进行下采样。

    减少文件在我的情况下有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多