2017-02-27 237 views
0

在我的Launchpad Simulator主活動中有很多按鈕。
我想按每個按鈕播放聲音。如果同時按下按鈕,我想同時播放聲音。從我現在所做的事情來看,似乎每當我按下按鈕時它都會播放聲音,但是因爲第一個聲音的長度是3秒(例如,拍子聲音文件在播放時間長度爲3秒)。同時按下按鈕播放聲音

在通過按鈕產生任何其他聲音之前,它會等待3秒鐘,如果在3秒後按任何按鈕並與其他32按鈕相同,則會播放下一個聲音。

只要按下按鈕,就像啓動板一樣,我想要播放聲音。在這種情況下,拍手的聲音。

這裏是Java代碼:

MainActivity.java

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 Repository for LaunchPadify

回答

0

我建議不要定義上面的MediaPlayer。 只需創建一個新的臨時MediaPlayer的每一個ButtonClick

new MediaPlayer.create(this, R.raw.clap).start(); 

,它會同時播放聲音

UPDATE

如果你想播放完聲音後銷燬的MediaPlayer,你可以做這使用此代碼

new MediaPlayer.create(getApplicationContext(), R.raw.test) 
      .start() 
      .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mediaPlayer) { 
        mediaPlayer.release(); 
       } 
      }); 
+0

是的,它工作得很好,但按下幾個按鈕後,它停止鼓掌。我將留下一個鏈接到應用程序。如果你能親眼看到它在擊中10-15次後停止發出聲音的方式。 https://drive.google.com/open?id=0B5whGfbIoM7KVE56clVXY2dSUFU – Shanu

+0

是的,這是由Media Player對象溢出引起的。您需要添加一個onCompletionListener,然後在播放完聲音後釋放(銷燬)MediaPlayer。 –

+0

請您詳細說明。我是新的聲音 – Shanu

0

要播放的幾個音軌同時,你應該使用AsyncTask並執行它THREAD_POOL_EXECUTOR。
如何做到這一點:
Thread類

class PlayThread extends AsyncTask<MediaPlayer, Void, Void> 
{ 
    @Override 
    protected Void doInBackground(MediaPlayer... player) { 

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

媒體播放器

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,所以它不是一個解決方案在所有。


這是非常重要的:
同時播放多音軌,你應該將它們混合到1個緩衝。
要做到這一點:將mp3解碼爲pcm(以流模式下的小緩衝區),將其混合到一個字節緩衝區並將其放到AudioTrack進行播放。

+0

其實,我有幾個問題:這是什麼意思是'doInBackground(MediaPlayer ... player)',我不明白爲什麼會有三個點?接下來你說要給玩家添加一些資源。我可以設置來源。但在接下來的部分中,您將設置Mediaplayer並開始播放。說實話,我是新來的聲音和線程。所以,如果你能更清楚地說明你的代碼,就像一對一的教程一樣,我可以用它作爲例子,並根據自己的需要進行編輯。我也不明白**這是非常重要的部分** – Shanu