• [故障及解决]SoundPool没有声音



    问题描述:
    使用SoundPool类进行播放声音时,在手机上没有声音。

    问题代码:

    /**
     * 声音播放
     */
    private void playSound() {
        SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
        soundPool.load(this, R.raw.beep, 1); // 加载资源,返回1
        soundPool.play(1, 1, 1, 0, 0, 1); // 播放,返回0
    }


    问题原因:
    SoundPool池加载声音,在调用load方法的时候,是使用其他线程来加载资源的,所以上述代码在执行play方法的时候,资源还没有加载,故没有声音。

    修改方法,就是中间留出足够的时间来进行加载声音文件,或追加加载完成的监听器来监听是否完成(SoundPool.OnLoadCompleteListener类的方法onLoadComplete(SoundPool soundPool, int sampleId, int status) )。

    正确代码:
    因为声音文件很小,所以就在onCreate方法中加载文件,后面进行播放。

    private SoundPool soundPool; // 声音加载池
    
    protected void onCreate(Bundle savedInstanceState) {
    // 门声音预加载
        soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
        soundPool.load(this, R.raw.beep, 1);
    }
    
    /**
     * 声音播放
     */
    private void playSound() {
        soundPool.play(1, 1, 1, 0, 0, 1);
    }

    知识点延伸:
    常用的播放类:
    android中,同创进行声音播放的有MediaPlayer和SoundPool。


    MediaPlayer:常用来播放长一些的音频、视频和流媒体,每次仅能播放一个,有控制播放的各种方法。
    SoundPool:常用来播放短促并且实时性高的音频,每次可以多个同时播放,比方说游戏中的爆破声。


    SoundPool类的播放方法(部分):


    以上述代码为例,进行分析。当然都有其他的重载的方法。


    SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
    ->

    public SoundPool(int maxStream, int streamType, int srcQuality)

    初期化一个声音池。

    maxStream:最大可放10个音频文件。

    streamType:为声音的类型。如上为系统声音,其他还有音乐,铃声等等。

    srcQuality:转化质量,默认为0。目前理解为,播放时的声音保真程度。一般对于短促的声音,影响不大。

    soundPool.load(this, R.raw.beep, 1);

    ->

    public int load(Context context, int resId, int priority)

    通过本apk中的资源加载音频。其他加载方式还有,从Asset对象加载、从FileDescriptor对象加载、从全文件路径名加载。

    context:本context。

    resId:资源ID。

    priority:加载优先级,一般为1。

    返回值为int,表示加载的第几个文件。从1开始累加。这个返回1。


    soundPool.play(1, 1, 1, 0, 0, 1);

    ->

    public int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate);

    播放声音文件。

    soundID:表示流中第几个文件,为load方法的返回值。和load方法配合使用,见过用map进行传递数据。(实际上我感觉没必要)

    leftVolume:左音量,通常为1。

    rightVolume:右音量,通常为1。

    priority:优先度,通常为0。

    loop:是否循环。0表示不循环,1以上表示循环次数。

    rate:表示播放速率。0.5-2之间。0.5表示减慢50%,2表示加速播放。

  • 相关阅读:
    Nginx安装
    win卸载输入法之后,在系统设置的键盘中还有这个输入法
    为Delphi 10.4.2实现android拍照填坑
    图文解说 ChinaCock 华为扫描
    Delphi Event Bus进阶(二)GlobalEventBus是怎么来的?
    小心SecondsBetween有坑
    Delphi Event Bus进阶(一)控制订阅方法的线程模式
    Delphi 10.4.2试用报告
    Delphi Event Bus入门
    UML建模——活动图(Activity Diagram)
  • 原文地址:https://www.cnblogs.com/linfenghp/p/8136089.html
Copyright © 2020-2023  润新知