Utilisez SoundPool pour jouer des effets sonores (Duang~)


Introduction à cette section :

Le chapitre 9 vous présente le développement multimédia sous Android. Il ne s'agit pas tant de développement multimédia que d'API liées au multimédia. L'utilisation de Pour écouter de la musique, il suffit d'appeler MediaPlayer et de trouver le fichier musical, Appelez ensuite la méthode play pour jouer... Bien entendu, le véritable développement multimédia est un autre domaine, l'encodage et le décodage audio et vidéo, Je ne peux que lever les yeux et attendre maintenant, si seulement nous savions comment appeler ces API ! D’ailleurs, il faut encore populariser le multimédia Android Un peu de bon sens à propos des frameworks :

Sur Android, le framework multimédia par défaut est

OpenCore

. L'avantage d'OpenCore est qu'il prend en compte à la fois Il est portable sur plusieurs plates-formes et a été vérifié par de nombreuses parties, il est donc relativement stable mais son inconvénient est qu'il est trop volumineux et complexe ; Cela prend beaucoup de temps à entretenir. À partir d'Android 2.0, Google a introduit Stagefright avec une architecture légèrement plus simple. Bien sûr, il n'a pas complètement abandonné OpenCore. Il a principalement créé une couche OMX, qui n'est qu'un support pour OpenCore. La partie omx-component est référencée. Il y avait une tendance à remplacer progressivement OpenCORE, mais en août de cette année j'ai découvert Une vulnérabilité Stagefright qui permet l'exécution de code à distance en exploitant un message MMS spécialement conçu. Cette vulnérabilité affecte Android 2.2 et les versions plus récentes, tandis que l'impact sur Android 4.1 et les versions plus récentes est relativement faible.

Jueli inconnu (je ne sais même pas de quoi JB parle), euh, d'accord, la science est terminée... Sachez simplement ces choses ! 1.jpgD'ailleurs, ce framework multimédia se situe dans le

Media Framework

qui est la troisième couche de l'architecture Android (Bibliothèques) ! De plus, si vous souhaitez savoir quels types de données audio et vidéo le framework multimédia Android prend en charge, veuillez consulter la documentation officielle :

Formats multimédias pris en charge

Vous pouvez cliquez directement ici

Média et caméra

Regardez ensuite le document suivant :2.png

Eh bien, il y avait trop de bêtises au début, et j'ai presque oublié que le protagoniste d'aujourd'hui est SoundPool Comme le titre l'indique, SoundPool est généralement utilisé. Jouez des effets sonores denses, rapides et de courte durée, tels que les effets sonores de cascades : Duang~, qui sont souvent utilisés dans les jeux. Vous pouvez également les ajouter à votre. L'APP ajoute cet effet sonore. Par exemple, lorsque Kugou Music est joué, "Bonjour, Kugou" est joué. En fait, cette idée est plutôt bonne. Informez indirectement l'utilisateur du volume actuel du lecteur, sinon dès que l'utilisateur joue la chanson, une petite pomme apparaît soudainement, attirant à proximité Ce serait mal si Tante dansait, n'est-ce pas ? En plus de l'ajouter dans le lecteur de musique, vous pouvez également l'ajouter dans une application ordinaire, comme recevoir des notifications push. message ou un nouveau message de discussion, puis jouez le son d'invite, tel que la nouvelle version du super programme, ajoutez cette chose et recevez des notifications push Le message jouera un court son de « table » ! L'objet SoundPool peut être considéré comme une ressource pouvant être importée depuis l'APK Ou chargez un exemple de collection de fichiers à partir du système de fichiers. Il utilise le service MediaPlayer pour décoder l'audio en un format brut de 16 bits. Flux PCM. Cette fonctionnalité permet aux applications d'effectuer une compression de flux sans avoir à supporter la charge du processeur et la latence causées par la décompression lors de la lecture audio. SoundPool utilise le concept de Sound Pool pour gérer plusieurs Playback Streams Si le nombre maximum de flux est dépassé, SoundPool arrêtera automatiquement le flux précédemment lu en fonction de la priorité. De plus, SoundPool prend également en charge le réglage de la qualité du son. Volume, taux de lecture et autres paramètres. Bon, sans plus tarder, commençons cette section : Document officiel de l'API : SoundPool


1. Introduction à la méthode associée :


1) Méthode de construction :

SoundPool(int maxStreams, int streamType, int srcQuality) Les paramètres sont :

  • ①Spécifiez le nombre de sons pris en charge et le nombre maximum de flux autorisés à exister simultanément dans l'objet SoundPool.
  • ②Spécifiez le type de son. Le type de flux peut être divisé en STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC et STREAM_ALARMQuatre types. Défini dans AudioManager.
  • ③Spécifiez la qualité du son (qualité de conversion du taux d'échantillonnage), généralement réglée directement sur 0 !

La méthode de construction ci-dessus peut être utilisée dans les versions inférieures, mais cette méthode de construction est obsolète après l'API 21 (Android 5.0) ! Lors de l'utilisation d'un SoundPool.Builder, il suffit d'appeler :

SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(10);
spb.setAudioAttributes(null);    //转换音频格式
SoundPool sp = spb.build();      //创建SoundPool对象

pour instancier SoundPool. Si vous souhaitez utiliser le code ci-dessus, la version TargetSDK doit être définie pour être supérieure ou égale à 21 ! Et si la version minSDK est inférieure à 21 Le rappel suivant apparaîtra :

3.png


2) Introduction aux méthodes courantes :


Charger les ressources sonores :

  • load(Contexte de contexte, int resId, priorité int)
  • load(Chemin de chaîne, priorité int)
  • load(FileDescriptor fd, long offset, longue longueur, priorité int)
  • load(AssetFileDescriptor afd, priorité int) Les méthodes ci-dessus renverront toutes un identifiant de son. Plus tard, nous pourrons utiliser cet identifiant pour lire le son spécifié

Introduction aux paramètres :

  • context : context
  • resId : identifiant de ressource
  • priority : un paramètre inutile, il est recommandé de le mettre à 1 pour conserver la compatibilité avec le futur
  • path : chemin du fichier
  • FileDescriptor : Cela semble être un flux, je n'en sais rien.
  • AssetFileDescriptor : Lire un fichier de ressources à partir du répertoire d'actifs, utilisation : AssetFileDescriptor descriptor = AssetManager.openFd ("biaobiao.mp3 ");

Contrôle de lecture :

jouer( int soundID, float leftVolume , float rightVolume, int priorité, int loop, float rate)

Les paramètres sont :

  • soundID : le numéro d'identification du son renvoyé par Load( )
  • leftVolume : réglage du volume du canal gauche
  • rightVolume : réglage du volume du canal droit
  • priorité : spécifiez la priorité de lecture du son. Plus la valeur est élevée, plus la priorité est grande.
  • boucle : Spécifiez s'il faut boucler : -1 signifie boucle infinie, 0 signifie pas de boucle, d'autres valeurs indiquent le nombre de fois à jouer à plusieurs reprises
  • taux : Spécifiez la vitesse de lecture : un taux de lecture de 1,0 peut produire le son selon sa fréquence d'origine, et le taux de lecture de 2,0 peut produire le son selon sa fréquence d'origine. Lecture à deux fois la fréquence originale. S'il s'agit d'un taux de lecture de 0,5, le taux de lecture est la moitié de la fréquence d'origine. Le taux de lecture varie de 0,5 à 2,0.

Resource Release :

Vous pouvez appeler la méthode release() pour libérer la mémoire occupée par tous les objets et ressources SoundPool, bien sûr également en fonction du son ID à libérer!


3. Utilisez l'exemple de code :

Exécutez le rendu  :

4.png

Lorsque Lorsque vous cliquez sur le bouton, « Duang » apparaîtra. Voici deux méthodes de chargement démontrées, à savoir brut et actifs !

Code clé:

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_play1;
    private Button btn_play2;
    private Button btn_play3;
    private Button btn_play4;
    private Button btn_play5;
    private Button btn_release;
    private AssetManager aManager;
    private SoundPool mSoundPool = null;
    private HashMap soundID = new HashMap();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        aManager = getAssets();
        try {
            initSP();
        } catch (Exception e) {
            e.printStackTrace();
        }
        bindViews();
    }

    private void bindViews() {
        btn_play1 = (Button) findViewById(R.id.btn_play1);
        btn_play2 = (Button) findViewById(R.id.btn_play2);
        btn_play3 = (Button) findViewById(R.id.btn_play3);
        btn_play4 = (Button) findViewById(R.id.btn_play4);
        btn_play5 = (Button) findViewById(R.id.btn_play5);
        btn_release = (Button) findViewById(R.id.btn_release);

        btn_play1.setOnClickListener(this);
        btn_play2.setOnClickListener(this);
        btn_play3.setOnClickListener(this);
        btn_play4.setOnClickListener(this);
        btn_play5.setOnClickListener(this);
        btn_release.setOnClickListener(this);

    }

    private void initSP() throws Exception{
        //设置最多可容纳5个音频流,音频的品质为5
        mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);
        soundID.put(1, mSoundPool.load(this, R.raw.duang, 1));
        soundID.put(2 , mSoundPool.load(getAssets().openFd("biaobiao.mp3") , 1));  //需要捕获IO异常
        soundID.put(3, mSoundPool.load(this, R.raw.duang, 1));
        soundID.put(4, mSoundPool.load(this, R.raw.duang, 1));
        soundID.put(5, mSoundPool.load(this, R.raw.duang, 1));
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_play1:
                mSoundPool.play(soundID.get(1), 1, 1, 0, 0, 1);
                break;
            case R.id.btn_play2:
                mSoundPool.play(soundID.get(2), 1, 1, 0, 0, 1);
                break;
            case R.id.btn_play3:
                mSoundPool.play(soundID.get(3), 1, 1, 0, 0, 1);
                break;
            case R.id.btn_play4:
                mSoundPool.play(soundID.get(4), 1, 1, 0, 0, 1);
                break;
            case R.id.btn_play5:
                mSoundPool.play(soundID.get(5), 1, 1, 0, 0, 1);
                break;
            case R.id.btn_release:
                mSoundPool.release();   //回收SoundPool资源
                break;
        }
    }
}

Le code est très simple, et si vous cliquez sur le dernier Si c'est le cas, le SoundPool sera libéré, puis les autres boutons Ce ne sera pas Duang~


4.OnLoadCompleteListener surveille si le fichier son a été chargé

Eh bien, c'est quelque chose auquel j'ai pensé temporairement, je vais en écrire un autre. article après l'avoir terminé. Du coup, je me suis rappelé que l'utilisation est très simple, on peut Ajoutez OnLoadCompleteListener au code ci-dessus, puis remplacez la méthode onLoadComplete() , et enfin définissez cette chose pour l'objet SoundPool !

mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        Toast.makeText(MainActivity.this,"加特技准备完毕~",Toast.LENGTH_SHORT).show();
    }
});

5. Exemple de téléchargement de code :

SoundPoolDemo.zip


Résumé de cette section :

D'accord, cette section vous donnera quelques connaissances générales sur le multimédia Andorid et vous apprendra comment ajouter des effets sonores à votre application. Cela peut être réalisé via un simple SoundPool. Qu'attendez-vous ? Ajoutez cette chose à votre application pour rendre votre application Duang~

5.gif

, utilisez-la avec la démo Better~.