首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时按按钮播放声音

同时按按钮播放声音
EN

Stack Overflow用户
提问于 2017-02-27 04:16:09
回答 2查看 150关注 0票数 0

在我的Launchpad Simulator中,主活动上有很多按钮。

我想在每个按钮上播放声音。如果同时按下按钮,我想同时播放声音。从我的创作到现在,它似乎每当我按下按钮,它确实播放声音,但因为第一个声音是3秒长(例如。一个鼓掌声音文件在播放时间是3秒长)。

在通过按钮产生任何其他声音之前,它等待3秒,如果在3秒后按下任何一个按钮,则播放下一个声音,与其他32个按钮相同。

就像一个发射台,只要我按下按钮,我就想播放声音。在这种情况下,鼓掌声。

以下是Java代码:

MainActivity.java

代码语言:javascript
复制
package com.oniichansblog.launchpadify;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.media.MediaPlayer;

public class MainActivity extends AppCompatActivity {
    private MediaPlayer clap1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        clap1 = MediaPlayer.create(this, R.raw.clap1);
    }

    public void clap1(View v){
        clap1.start();
    }

}

我只有一个函数clap1(),每次按下按钮都会被反复调用。

如果您想自己检查它,我有一个存储库:GitHub LaunchPadify库

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-27 13:48:51

我建议不要定义上面的MediaPlayer。只需创建一个新的临时MediaPlayer --每个ButtonClick

代码语言:javascript
复制
new MediaPlayer.create(this, R.raw.clap).start();

它会同时播放声音

更新

如果您想在MediaPlayer播放完声音后销毁它,可以使用以下代码来完成此操作

代码语言:javascript
复制
new MediaPlayer.create(getApplicationContext(), R.raw.test)
            .start()
            .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                 public void onCompletion(MediaPlayer mediaPlayer) {
                    mediaPlayer.release();
                }
            });
票数 0
EN

Stack Overflow用户

发布于 2017-02-27 04:42:22

要同时播放几首歌曲,您应该使用AsyncTask并在THREAD_POOL_EXECUTOR上执行它。

如何做到这一点:

线程类

代码语言:javascript
复制
class PlayThread extends AsyncTask<MediaPlayer, Void, Void>
{
    @Override
    protected Void doInBackground(MediaPlayer... player) {

        player[0].start();          
        return null;
    }
}

媒体播放器

代码语言:javascript
复制
MediaPlayer[] players = new MediaPlayer[5];
//Then set source to each player...
//...
//Create objects of Thread class
PlayThread[] playThreads = new PlayThread[5];
for (int i = 0; i < 5; i++)
    playThreads[i] = new PlayThread();
//Set Media Players there and start play
for (int i = 0; i < 5; i++)
    playThreads[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, players[i]);

AsyncTask只能同时执行5个线程,其他线程要排队。

SoundPool缓冲区限制为1Mb,因此根本不是一个解决方案。

非常重要:

要同时播放更多的音频音轨,您应该将它们混合到一个缓冲器中。

方法是:将mp3解码为pcm (流模式下的小缓冲区),将其混合到一个字节缓冲区中,并将其放入AudioTrack进行播放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42477742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档