Android 播放短音的正确方法?

Posted

技术标签:

【中文标题】Android 播放短音的正确方法?【英文标题】:The correct way to play short sounds Android? 【发布时间】:2012-03-11 16:48:37 【问题描述】:

我正在创建一个将在屏幕上显示多个图像的应用程序,这些图像将是按钮,点击时会播放短促的声音。我对此进行了研究,只能找到我用来播放声音的当前方法,这似乎根本没有响应。我希望声音可以快速播放,并且可以响应许多快速点击。我不确定这在 android 中是否可行。

我用来播放声音的代码是这样的:

    Button sound1;
MediaPlayer  firstSound;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    firstSound = MediaPlayer.create(SoundActivity.this, R.raw.click);


    sound1 = (Button) findViewById(R.id.Sound1);


    beaver.setOnClickListener(new View.OnClickListener() 

        public void onClick(View v) 

            firstSound.start();

            

    );



    

我的延迟问题也可能与我使用媒体播放器对象的方式有关?我确实觉得这在我的手机上应该更流畅,任何关于如何在 Android 中播放声音的建议都非常感谢。

谢谢。

自从发现 Sound Pool 以来,我已经编辑了我的代码以使用它并且它运行良好,新代码如下所示:

SoundPool soundPool;
HashMap<Integer, Integer> soundPoolMap;
int soundID = 1;


Button sound1;
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
    soundPoolMap = new HashMap<Integer, Integer>();
    soundPoolMap.put(soundID, soundPool.load(this, R.raw.click, 1));

    sound1 = (Button) findViewById(R.id.bBeaver);


    sound1.setOnClickListener(new View.OnClickListener() 

                public void onClick(View v) 

                    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
              float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
              float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
              float leftVolume = curVolume/maxVolume;
              float rightVolume = curVolume/maxVolume;
              int priority = 1;
              int no_loop = 0;
              float normal_playback_rate = 1f;
              soundPool.play(soundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);

            

    );


    

谢谢

【问题讨论】:

您似乎没有使用 soundPoolMap? 喜欢你的实现方式,同时运行良好 非常感谢。效果很好……! 在解决 MediaPlayer 问题几个小时后,我在五分钟内完成了 SoundPool,谢谢! @Moberg 是对的,而不是:"soundPool.play(soundID..." 它应该是:"soundPool.play(soundPoolMap.get(soundID)..." 【参考方案1】:

您可以使用SoundPool。它非常适合您想要做的事情。

您只需要一种方法来存储与每个图像(或按钮)对应的音效 ID。

也许扩展 Button 以存储关联的音效 ID。并使用一个普通的 SoundPool 播放按钮被触摸时关联到 id 的音效。

You can read more about SoundPool here.

【讨论】:

感谢您的建议和链接。我进一步研究并找到了一个教程,这帮助我做我想做的事,它肯定比媒体播放器好得多!非常感谢! 能发个教程的链接吗? @Moberg 你有一个***.com/questions/17069955/…【参考方案2】:

@Rikonator 与 Soundpool 一起走在正确的轨道上。它更适合您所追求的功能。

但是,如果您决定使用媒体播放器,请不要忘记 prepareAsync () 方法以防止它挂起 UI 线程。您可以阅读有关播放媒体的更多信息here。

【讨论】:

最好在 UI 线程上阻塞,因为声音用于按钮。挂起 UI 可能很糟糕,但迟到的声音有点奇怪。【参考方案3】:
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);

try 
    if (mp.isPlaying()) 
        mp.stop();
        mp.release();

        mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
    

    mp.start();
 catch (Exception e) 
    e.printStackTrace();

【讨论】:

感谢分享。这对我有用:)

以上是关于Android 播放短音的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

斯威夫特:如何延长短音的播放时间

AVAudioPlayer 在我的 iPhone 上播放短音?

Android Soundpool Issue

Android 视频横向播放

如何正确跟踪播放位置? [Android 媒体广播通知 Spotify API]

在 Android 上正确同步同时播放两个不同的流(文件)