1. 程式人生 > >Android 使用SoundPool播放音訊

Android 使用SoundPool播放音訊

        Android中除了MediaPlayer播放音訊之外,還提供了SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效。先了解一下SoundPool與MediaPlayer的不同之處在哪裡:

MediaPlayer:佔用資源較高,不支援同時播放多個音訊。

SoundPool:可以同時播放多個短促的音訊,而且佔用的資源較少。適合在程式中播放按鍵音,或者訊息提示音等。

【SoundPool構造器】
SoundPool提供了一個構造器,該構造器可以指定它總共支援多少個聲音(也就是池的大小)、聲音的品質等。

構造器如下: 
SoundPool(int maxStreams

, int streamType, int srcQuality)
引數maxStreams:指定支援多少個聲音; 
引數streamType:指定聲音型別: 
引數srcQuality:指定聲音品質。

在得到了SoundPool物件之後,接下來就可呼叫SoundPool的多個過載的load方法來載入聲音了。

SoundPool提供瞭如下4個load方法:
//從 resld 所對應的資源載入聲音。
int load(Context context, int resld, int priority)
//載入 fd 所對應的檔案的offset開始、長度為length的聲音。
int load(FileDescriptor fd, long offset, long length, int priority)

//從afd 所對應的檔案中載入聲音。
int load(AssetFileDescriptor afd, int priority)
//從path 對應的檔案去載入聲音。
int load(String path, int priority)
上面4個方法在載入聲音之後,都會返回該聲音的ID,以後程式就可以通過該聲音的ID來播放指定聲音。

SoundPool提供的播放指定聲音的方法:
int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
引數soundID:指定播放哪個聲音; 

引數leftVolumerightVolume:指定左、右的音量: 
引數priority:指定播放聲音的優先順序,數值越大,優先順序越高; 
引數loop:指定是否迴圈,0:不迴圈,-1:迴圈,其他值表示要重複播放的次數;
引數rate:指定播放的比率,數值可從0.5到2, 1為正常比率。

最後,release()方法,用於釋放所有SoundPool物件佔據的記憶體和資源,也可以指定要釋放的ID。

至於音訊檔案的匯入,在Android Studio的res資料夾建立raw資料夾,然後把音訊檔案拷貝到raw資料夾下面即可。



以下是示例程式碼:

package com.yzbt.soundpooltest;

import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button button1, button2, button3, button4;
    private SoundPool soundpool;
    private Map<Integer, Integer> soundmap = new HashMap<Integer, Integer>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button1 = (Button)findViewById(R.id.button1);
        button2 = (Button)findViewById(R.id.button2);
        button3 = (Button)findViewById(R.id.button3);
        button4 = (Button)findViewById(R.id.button4);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
        button4.setOnClickListener(this);

        //當前系統的SDK版本大於等於21(Android 5.0)時
        if(Build.VERSION.SDK_INT > 21){
            SoundPool.Builder builder = new SoundPool.Builder();
            //傳入音訊數量
            builder.setMaxStreams(5);
            //AudioAttributes是一個封裝音訊各種屬性的方法
            AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
            //設定音訊流的合適的屬性
            attrBuilder.setLegacyStreamType(AudioManager.STREAM_SYSTEM);//STREAM_MUSIC
            //載入一個AudioAttributes
            builder.setAudioAttributes(attrBuilder.build());
            soundpool = builder.build();
        }else{
            soundpool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 0);
        }
        //
        soundmap.put(1, soundpool.load(this, R.raw.chimes, 1));
        soundmap.put(2, soundpool.load(this, R.raw.enter, 1));
        soundmap.put(3, soundpool.load(this, R.raw.notify, 1));
        soundmap.put(4, soundpool.load(this, R.raw.ringout, 1));
        soundmap.put(5, soundpool.load(this, R.raw.ding, 1));
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        soundpool.play(soundmap.get(5), 1, 1, 0, 0, 1);
        //return  true;
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onDestroy() {
        soundpool.release();//回收soundpool資源
        super.onDestroy();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId())
        {
            case R.id.button1:
                soundpool.play(soundmap.get(1), 1, 1, 0, 0, 1);
                break;
            case R.id.button2:
                soundpool.play(soundmap.get(2), 1, 1, 0, 0, 1);
                break;
            case R.id.button3:
                soundpool.play(soundmap.get(3), 1, 1, 0, 0, 1);
                break;
            case R.id.button4:
                soundpool.play(soundmap.get(4), 1, 1, 0, 0, 1);
                break;
        }
    }
}

相關推薦

Android 使用SoundPool播放音訊

        Android中除了MediaPlayer播放音訊之外,還提供了SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效。先了解一下SoundPool與MediaPlayer的不同之處在哪裡:MediaPlayer:佔用資源較高,不

android之使用SoundPool播放音訊

SoundPool可以播一些短的反應速度要求高的聲音,資源佔用少,反應延遲小,還支援自行設定聲音品質,音量,播放比率等,在遊戲較為常見。 SoundPool簡單實現 package com.leig

【轉】解決在Android裝置播放音訊與其他應用重音的問題,並監聽耳機的控制按鈕

概述 在安卓開發中免不了需要播放一點音樂了,音訊了。但是這時候有別的應用正在播放,這時候就會出現重音的現象,完全影響使用者體驗,我們的專案就遇上了這樣的尷尬,然後查找了一些文件,記錄一下;   管理音訊焦點 從谷歌開發瞭解到,這跟音訊的焦點又關係,我們可以獲取當前音訊的焦點來解決問題;&nb

Android MediaPlayer播放音訊與視訊

使用MediaPlayer播放音訊與視訊 播放音訊 首先創建出一個MediaPlayer物件 MediaPlayer mMediaPlayer = new MediaPlayer(

Android實現播放音訊

在Android平臺上實現一個播放音訊檔案還是比較簡單的,本文將使用Android權威指南的hellomoon例子來介紹下如何構建播放音訊專案。首先新建一個Android專案,本例中使用Android studio為例。在嚮導結束後,會建立一個預設的activity,將此類

SoundPool播放音訊

package com.soundpool;import java.util.HashMap;import android.media.AudioManager;import android.media.SoundPool;import android.os.Bundle;i

Android之 MediaPlayer播放一般音訊SoundPool播放短促的音效

【1】使用MediaPlayer實現一般的音訊播放 MediaPlayer播放通常的音訊檔案 [java] view plaincopyprint? MediaPlayer mediaPlayer = new MediaPlayer();  if (mediaP

Android使用MediaPlayer只播放視訊不播放音訊的方法

今天寫專案時,突然遇到一個麻煩的問題,就是使用mediaplayer播放MP4檔案時,只需要播放他的視訊畫面就好了,而不用去播放他的聲音,需求很怪,嘗試了mediaplayer的各種方法也沒有解決,後來想了一個取巧的方法。 通過設定mediaplayer.setAudioStreamType

Android播放音訊工具類

播放完畢重置mediaplayer,播放完畢才能播放下一次。播放小音訊建議使用soundpool(音訊大小不超過900k)public class PlayMusicUtils { privat

android控制webview音訊播放 本地/web播放源切換

這篇文章寫在音訊已經從網路上 通過擷取url並下載的方式下載到本地之後 url格式:emodou://mp3player?action=play&src=xx/xx/xx.mp3 web端點選播放時,web呼叫android的 play(url) 和 pause(

Android MediaPlayer 播放器網路音訊播放總結

        在近期的Android 系統MediapPalyer使用中,碰到了不少問題。其中一些問題也是在特殊的條件下才會出現,嘗試很多方法才解決。這裡做了總結,也跟大家分享一下: 1.播放器需要多執行緒實現         一般我們會把MediaPlayer放到Ser

Android移動開發-使用SoundPool播放音效的實現

如果在程式應用中(比如:遊戲的音效等)需要播放密集、短促的音效,這時就使用SoundPool來播放音效,SoundPool使用音效池的概念來管理多個短促的音效,例如它可以開始就10個音效,以後在程式中按音效的ID進行播放。 SoundPool主要用於

Android播放音訊之按鈕控制

控制音量和播放 良好的使用者體驗是可預測的。 如果您的應用程式播放媒體,您的使用者必須使用裝置,藍芽耳機或耳機的硬體或軟體音量控制來控制應用程式的音量。 類似地,在適當和可用的情況下,播放,停止,暫停,跳過和先前的媒體回放鍵應當對於由應用使用的音訊流執行它們各自的動作。 標識要使

Android-播放音訊檔案

下面分享一個Android播放mp3檔案的例子。 執行介面: 實現步驟: 1)在res/layout.xml 檔案中新增三個按鈕,設定相應屬性。 <?xml version="1.0"

android ffmpeg+opensl 音訊解碼播放、暫停、進度seek、時間、上/下一首

類似文章太多,但是大多程式碼都有記憶體溢位的問題,而且都缺少c層呼叫java層的例子,實際上有了參考博文後,還是有很多坑需要自己填。不過,看了很多博主和帖子後還是能夠解決一些問題,但是有些問題,根本找不到,所以我把音訊解碼播放還有控制部分做了比較詳細的例子。

Android MediaPlayer 播放各種來源的音訊檔案,特效控制

MediaPlayer通過資源ID播放Raw目錄下音訊資原始檔: MediaPlayer mMediaPlayer; mMediaPlayer = MediaPlayer.create(th

android開發:播放音訊功能的工具類

播放音訊功能的工具類 /** * 播放聲音工具類 * creator: ZZF * careate date: 2018/5/25 10:36. */ public class Soun

android音樂播放器開發 SweetMusicPlayer 載入歌曲列表

路徑 本地 exc tao near import 設置 優先 特殊 上一篇寫了播放器的總體實現思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今來總結下載入歌曲列表。 代碼地址

基於NDK、C++、FFmpeg的android視訊播放器開發實戰-夏曹俊-專題視訊課程

基於NDK、C++、FFmpeg的android視訊播放器開發實戰—1796人已學習 課程介紹         課程包含了對流媒體(拉流)的播放,演示了播放rtmp的香港衛視,支援rtsp攝像頭和h

(四)MFC學習之使用directSound播放音訊檔案

環境:windows10+vs2017 音訊格式要求:.wav  (8位24khz)(這是預設的) directx只能播放wav格式檔案 DirectSound提供了各種音效處理的支援,如:低延遲、3d立體和協調硬體等功能 vs2012開始,vs已經整合directx