Laya Sound

H5音频

HTML5音频播放有两种主流的方式,一种是使用Audio标签,另一种是使用WebAudio二进制播放。

Audio

Audio标签用于定义声音,比如音乐或其他音频流。

<audio src="music.wav">您的浏览器不支持audio标签</audio>
属性 作用
autoplay autoplay 音频在就绪后立即播放
controls controls 向用户显示控件,比如播放按钮等。
loop loop 每当音频结束时会重新开始播放
muted muted 规定视频输出应该被静音
preload preload 音频在页面加载时进行加载并预备播放
src url 表示要播放的音频的地址URL
<audio src="music.ogg" controls="controls" autoplay="autoplay" loop="loop">
Your browser does not support the audio element.
</audio>

Audio标签属于DOM元素,自带UI界面,在移动端Audio属于边下载便播放,适合声音文件比较大的文件。但Audio标签在移动端存在手势的限制,可以使用gesture-requirement-for-media-playback属性表明必须有用户的收拾操作才可以播放。

浏览器对音频播放器外观

移动设备中,Audio元素在播放前需要一个触屏消息,也就是说无论在Audio元素中设置了autoplay或是明确调用play方法,都不会立即播放音频,必须等待用户触屏后才会播放。目前Android设备上的Chrome浏览器和原生Androi浏览器都有限制,iOS为节省移动资源,也具有相应限制。

Chrome浏览器中可以使用chrome://flags/#disable-gesture-requirement-for-media-playback解决。也可以制作音频控制按钮,引导用户选择是否需要开启或关闭背景音乐来触发用户操作。

移动设备上某些浏览器暂时不支持多个音频文件同时播放,典型的例如Android设备上原生浏览器就存在这个限制。这对游戏开发来说是不能接受的,因为游戏一般都有背景音乐,另外在游戏的过程中也同时需要触发其他音乐。

WebAudio

WebAudio是一种新的声音播放形式,可以加载多个声音进行合成,通过二进制解码成浏览器支持的格式进行播放,可利用它实现音频谱的动画效果,让声音具有合成的功能。

WebAudio API提供了在Web上控制音频的一个非常有效且通用的系统,允许开发者自选音频源,对音频添加特效,使音频添加特效,使音频可视化,添加控件效果等。

使用WebAudio来播放音频文件时,如果音频文件较大可能会影响程序的执行效率,具体的时间取决于当前网络环境和音频文件的大小。程序中一般会采用异步下载的方式,但同样会让音频的播放延迟。其次,程序需要调用WebAudio的decodeAudioData()函数来解码整个音频文件,此函数需要一次性解码整个文件后才会出发成功的回调函数,程序才能开始播放音频文件,这再次增加了音频文件播放的延迟。另外,由于整个音频文件的一次性解码,整个解码前和钱吗后的文件都同时存在内存中,因此也会引起内存的巨大开销。相比采用Audio标签播放方式,Audio元素是一边解码一边播放的。decodeAudioData()函数是为了解码短小的声音文件而设计的,由于WebAudio对音频的延迟性特别关注,所以为了减少声音的延时,在音效处理前要求将需要处理的音频文件装进内存。所以如果需要使用WebAudio播放文件,又比较关注效率文件,建议将音频文件大小缩小或分解为若干个小的文件在分别加载解码播放。

在移动端游戏开发中,游戏一般都有背景音乐,在游戏过程中也同时需要触发其他音乐。因此依靠简单的插入Audio元素来播放音乐的方案在移动设备上显然是行不通的。所以流行的HTML5游戏引擎会采用另一种方案,即当浏览器支持WebAudio API时就会采用WebAudio替换Audio元素来播放音频文件。

由于音频播放在各个浏览器中存在兼容性文件,在开始使用前,需做好前期的兼容准备。可使用音频文件转换工具将音频转换为44100Hz 96kbps的格式。其次,音频文件要尽量的小,不仅是由于网络带宽的限制,更重要的是因为浏览器音频解码的效率。

声音 Laya.Sound

Laya.Sound 类是用来播放控制声音的类

结构 描述
Package laya.media
Class Laya.Sound
Inheritance Sound / EventDispatcher / Object
属性 描述
Laya.Sound.duration:Number 获取声音的总时间
方法 描述
dispose():void 释放声音资源
load(url:String):void 加载声音
play(startTime:Number=0, loops:Number=0):SoundChannel 播放声音

声音管理器 Laya.SoundManager

音乐和音效作为游戏中常用的基础元素,音乐是指游戏使用的背景音乐。建议背景音乐使用mp3格式,音效使用mp3wav格式,如果打包为APP则音效只能使用wav格式。

LayaAir引擎封装可WebAudioAudio,在支持WebAudio的浏览器上优先会使用WebAudio,在不支持WebAudio的浏览器上会使用Audio,以最大化兼容所有浏览器对音频格式的支持,让开发者更加方便地通过调用laya.media.SoundManagerAPI接口来直接播放音频。

Laya.SoundManager声音管理器提供对背景音乐和音效的播放控制,LayaAir引擎默认有两套声音方案分别是H5的Audio和WebAudio。

class SoundManager extends laya.media.SoundManager {}
类别
Package laya.media
Class Laya.SoundManager
Inheritance SoundManager / Object
属性 描述
Laya.SoundManager.autoReleaseSound:Boolean = true 音效播放后是否自动删除
Laya.SoundManager.autoStopMusic:Boolean 失去焦点后是否自动停止播放背景音乐
Laya.SoundManager.musicMuted:Boolean 是否静音背景音乐
Laya.SoundManager.musicVolume:Number = 1 背景音乐音量
Laya.SoundManager.muted:Boolean 是否静音背景音乐和音效
Laya.SoundManager.playbackRate:Number = 1 设置声音播放速率
Laya.SoundManager.soundMuted:Boolean 是否静音音效
Laya.SoundManager.soundVolume:Number 设置音效音量
Laya.SoundManager.useAudioMusic:Boolean=true 设置背景音乐使用Audio标签播放
方法 返回值 参数 描述
Laya.SoundManager.addChannel() void channel:SoundChannel 添加播放的声音实例
Laya.SoundManager.removChannel() void channel:SoundChannel 移除播放的声音实例
Laya.SoundManager.destroySound() void url:string 释放声音资源
Laya.SoundManager.playMusic() SoundChannel url:string, loops:number=1, complete=null, startTime=0 播放背景音乐
Laya.SoundManager.playSound() SoundChannel url:string, loops:number=1, complete=null, soundClass=null, startTime=0 播放音效
Laya.SoundManager.setMusicVolume() void volume:number 设置背景音乐音量
Laya.SoundManager.setSoundVolume() void volume:number 设置声音音量
Laya.SoundManager.stopAll() void - 停止播放所有音乐与音效
Laya.SoundManager.stopAllSound() void - 停止播放所有音效
Laya.SoundManager.stopMusic() void - 停止播放背景音乐
Laya.SoundManager.stopSound() void url:string 停止声音播放

播放音乐

对于音乐可采用 laya.media.SoundManager 音频管理类中的 playMusic() 方法进行播放,由于是背景音乐, playMusic() 方法只能同时播放一个音频文件。

  • 当播放背景音乐时会使用H5的Audio进行播放,使用WebAudio会增加内存且必须等待声音文件加载完毕才能播放存在延迟。

  • 播放音效时优先会使用WebAudio,如果WebAudio不可用则使用H5的Audio播放,但H5的Audio在部分机器上存在兼容文件,另外H5的Audio不能混音且播放有延迟。

/*
* 播放背景音乐。背景音乐同时只能播放一个,如果在播放背景音乐时再次调用本方法,会先停止之前的背景音乐,再播发当前的背景音乐。
* @param url 声音文件地址。
* @param loops 循环次数,0表示无限循环。
* @param complete 声音播放完成回调。
* @param startTime 声音播放起始时间。
* @return SoundChannel对象,通过此对象可以对声音进行控制,以及获取声音信息。
*/
Laya.SoundManager.playMusic(
  url:string,
  loops?:number,
  complete?:laya.utils.Handler,
  startTime?:number
):laya.media.SoundChannel;

播放背景音乐

  • 背景音乐同时只能播放一个
  • 如果在播放背景音乐时再次调用本方法,会先停止之前的背景音乐,再播发当前的背景音乐。
参数 类型 描述
url string 声音文件地址
loops? number 循环次数 0表示无限循环
complete? laya.utils.Handler 声音播放完成回调
startTime? number 声音播放起始时间

音乐静音

/** 背景音乐(不包括音效)是否静音。
 * 注意1:播放音乐时,改变 musicMuted 为 true,则立即对当前音乐进行静音
 * 注意2:静音不代表停止播放
 */
static musicMuted: boolean;

播放音效

对于音效可采用laya.media.SoundManager音频管理类中的playSound()方法进行播放,此方法允许同时播放多个音频文件。

/*
* 播放音效。音效可以同时播放多个。
* @param url 声音文件地址。
* @param loops 循环次数,0表示无限循环。
* @param complete 声音播放完成回调  Handler对象。
* @param soundClass 使用哪个声音类进行播放,null表示自动选择。
* @param startTime 声音播放起始时间。
* @return SoundChannel对象,通过此对象可以对声音进行控制,以及获取声音信息。
*/
static playSound(
url:string,
loops?:number,
complete?:laya.utils.Handler,
soundClass?:new () => any,
startTime?:number
):laya.media.SoundChannel;

播放音效时默认情况下如果窗口失去焦点会立即停止播放,当窗口后续再次获得焦点时也不会再继续播放。可使用Laya.SoundManager.autoStopMusic属性设置失去焦点后是否自动停止播放音乐或音效。

/**失去焦点后是否自动停止背景音乐。默认失去焦点后停止播放
* @param v Boolean 失去焦点后是否自动停止背景音乐。
*/
static autoStopMusic: boolean;

移动端音频文件必须采用.wav格式才能正常播放,若采用.mp3格式会没有声音。

音效静音

/**所有音效(不包括背景音乐)是否静音。
 * 注意1:播放音效的时候改变 soundMuted 为 true,并不能将当前播放的音效立即静音,它仍会播放直到完毕
 * 而其他音效显然是没有声音的.
 */
static soundMuted: boolean;

音量控制

对于音频音量的控制可使用laya.media.SoundManager音频管理类中的setSoundVolume(volume)方法来设置,通过设置volume参数可以有效地控制URL对应声音文件的音量大小,volume的初始值为1,音量范围从0静音到1最大音量。

/*
* 设置声音音量。根据参数不同,可以分别设置指定声音(背景音乐或音效)音量或者所有音效(不包括背景音乐)音量。
* @param volume 音量。初始值为1。音量范围从 0(静音)至 1(最大音量)。
* @param url (default = null)声音播放地址。默认为null。为空表示设置所有音效(不包括背景音乐)的音量,不为空表示设置指定声音(背景音乐或音效)的音量。
*/
static setSoundVolume(volume:number, url?:string):void;

/*
* 设置背景音乐音量。音量范围从 0(静音)至 1(最大音量)。
* @param volume 音量。初始值为1。音量范围从 0(静音)至 1(最大音量)。
*/
static setMusicVolume(volume:number):void;

对于设备静音控制可通过laya.media.SoundManager音频管理类中的useAudioMusic属性来控制,如果需要通过设备静音键让音频自动跟随设备静音,可以将SoundManager.useAudioMusic属性设置为false

static useAudioMusic:boolean;

停止声音

/**停止播放所有声音(包括背景音乐和音效)。
 */
static stopAll(): void;

综合案例

案例:创建舞台并向舞台中添加两个按钮,点击按钮播放音乐和音效。

播放声音
class Test{
    constructor(){
        //初始化舞台
        this.initStage();
        //安装播放按钮
        this.createButton();
    }
    initStage(){
        //初始化引擎
        const canvas = Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
        //舞台设置
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;//设置舞台水平居中
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;//设置舞台垂直居中
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;//设置舞台缩放模式为显示所有
        Laya.stage.bgColor = "#000000";//设置舞台背景颜色为黑色
    }
    initButton(width=110, height=40, text="播放"){
        let sprite = new Laya.Sprite();
        sprite.size(width, height);
        sprite.graphics.drawRect(0, 0, width, height, "#FF7F50");
        sprite.graphics.fillText(text, width/2, 8, "24px SimHei", "#FFFFFF", "center");
        return sprite;
    }
    createButton(){
        let btnSound = this.initButton(110, 40, "播放音效");
        btnSound.x = (Laya.stage.width - btnSound.width*2 + 10) / 2;
        btnSound.y = (Laya.stage.height - btnSound.height) / 2;
        Laya.stage.addChild(btnSound);

        let btnMusic = this.initButton(110, 40, "播放音乐");
        btnMusic.x = btnSound.x + btnSound.width + 10;
        btnMusic.y = btnSound.y;
        Laya.stage.addChild(btnMusic);

        btnSound.on(Laya.Event.CLICK, this, this.onPlaySound);
        btnMusic.on(Laya.Event.CLICK, this, this.onPlayMusic);
    }
    onPlaySound(event){
        const url = "./sound/window_open.mp3";
        const loops = 1;
        Laya.SoundManager.playSound(url, loops, new Laya.Handler(this, this.onCompleteSound));
    }
    onPlayMusic(event){
        const url = "./music/bgm.mp3";
        const loops = 1;
        Laya.SoundManager.playMusic(url, loops, new Laya.Handler(this, this.onCompleteMusic));
    }
    onCompleteSound(){
        console.log("sound play complete");
    }
    onCompleteMusic(){
        console.log("music play complete");
    }
}
new Test();

封装类库

$ vim src/lib/Audio.js
export default class Audio{
    //单例设计
    static getInstance(){
        if(!this._instance){
            this._instance = new Audio();
        }
        return this._instance;
    }
    //构造器
    constructor(){
        //公有属性
        this._muted = false;//静音所有
        this._musicMuted = false;//静音背景音乐
        this._soundMuted = false;//静音音效
        this._musicVolume = 1;//背景音乐音量
        this._soundVolume = 1;//音效音量
        //获取初始化声音存储到本地存储
        this.init();
        //保存数据到本地
        this.store();
    }
    //获取本地存储并设置
    init(){
        //静音所有
        const muted = Laya.LocalStorage.getItem(Audio.MUTED);
        this._muted = muted==="true"?true:false;
        Laya.SoundManager.muted = this._muted;
        //静音背景音乐
        const musicMuted = Laya.LocalStorage.getItem(Audio.MUSIC_MUTED);
        this._musicMuted = musicMuted==="true"?true:false;
        Laya.SoundManager.musicMuted = this._musicMuted;
        //静音音效
        const soundMuted = Laya.LocalStorage.getItem(Audio.SOUND_MUTED);
        this._soundMuted = soundMuted==="true"?true:false;
        Laya.SoundManager.soundMuted = this._soundMuted;
        //背景音乐音量
        const musicVolume = Laya.LocalStorage.getItem(Audio.MUSIC_VOLUME);
        this._musicVolume = musicVolume?parseFloat(musicVolume):1;
        Laya.SoundManager.musicVolume = this._musicVolume;
        //音效音量
        const soundVolume = Laya.LocalStorage.getItem(Audio.SOUND_VOLUME);
        this._soundVolume = soundVolume?parseFloat(soundVolume):1;
        Laya.SoundManager.soundVolume = this._soundVolume;
    }
    //保存至本地存储
    store(){
        Laya.LocalStorage.setItem(Audio.MUTED, this.muted);
        Laya.LocalStorage.setItem(Audio.MUSIC_MUTED, this.musicMuted);
        Laya.LocalStorage.setItem(Audio.SOUND_MUTED, this.soundMuted);
        Laya.LocalStorage.setItem(Audio.MUSIC_VOLUME, this.musicVolume);
        Laya.LocalStorage.setItem(Audio.SOUND_VOLUME, this.soundVolume);
    }
    //获取是否静音
    get muted(){
        return this._muted;
    }
    //设置是否所有静音
    set muted(value){
        this._muted = value;
        Laya.SoundManager.muted = value;
        this.store();
    }
    //获取背景音乐是否静音
    get musicMuted(){
        return this._musicMuted;
    }
    //设置背景音乐是否静音
    set musicMuted(value){
        this._musicMuted = value;
        Laya.SoundManager.musicMuted = value;
        this.store();
    }
    //获取音效是否静音
    get soundMuted(){
        return this._soundMuted;
    }
    //设置音效是否静音
    set soundMuted(value){
        this._soundMuted = value;
        Laya.SoundManager.soundMuted = value;
        this.store();
    }
    //获取背景音乐音量
    get musicVolume(){
        return this._musicVolume;
    }
    //设置背景音乐音量
    set musicVolume(value){
        this._musicVolume = value;
        Laya.SoundManager.setMusicVolume = value;
        this.store();
    }
    //获取音效音量
    get soundVolume(){
        return this._soundVolume;
    }
    //设置音效音量
    set soundVolume(value){
        this._soundVolume = value;
        Laya.SoundManager.setSoundVolume = value;
        this.store();
    }
    //播放背景音乐
    playMusic(url, loops=0, complete=null, startTime=0){
        Laya.SoundManager.playMusic(url, loops, complete, startTime);
    }
    //播放音效
    playSound(url, loops=0, complete=null, soundClass=null, startTime=0){
        Laya.SoundManager.playSound(url, loops, complete, soundClass, startTime);
    }
    //关闭所有音乐与音效
    stopAll(){
        Laya.SoundManager.stopAll();
    }
    //关闭所有背景音乐
    stopMusic(){
        Laya.SoundManager.stopMusic();
    }
    //关闭指定音效
    stopSound(url){
        Laya.SoundManager.stopSound(url);
    }
    //摧毁指定音效
    destroySound(url){
        Laya.SoundManager.destroySound(url);
    }
    //关闭所有音效
    stopAllSound(){
        Laya.SoundManager.stopAllSound();
    }
}
//静态属性:存储本地声音设置的键名
Audio.MUTED = "muted";
Audio.MUSIC_MUTED = "music_muted";
Audio.SOUND_MUTED = "sound_muted";
Audio.MUSIC_VOLUME = "music_volume";
Audio.SOUND_VOLUME = "sound_volume";

外部使用

import Audio from "./libs/Audio";

错误处理

Chrome 77.0.3865.90版本,浏览器控制台报错。

[Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.

没有添加被动事件监听器来阻止touchstart事件,请考虑添加事件管理者passive,以使页面更加流畅。原因是 Chrome51 版本以后,Chrome 增加了新的事件捕获机制-Passive Event Listeners;

Passive Event Listeners:就是告诉前页面内的事件监听器内部是否会调用preventDefault函数来阻止事件的默认行为,以便浏览器根据这个信息更好地做出决策来优化页面性能。当属性passive的值为true的时候,代表该监听器内部不会调用preventDefault函数来阻止默认滑动行为,Chrome浏览器称这类型的监听器为被动(passive)监听器。目前Chrome主要利用该特性来优化页面的滑动性能,所以Passive Event Listeners特性当前仅支持mousewheel/touch相关事件。

解决方案:

  1. npm i default-passive-events -S
  2. js文件中加入import 'default-passive-events'
The Web Audio autoplay policy will be re-enabled in Chrome 71 (December 2018). Please check that your website is compatible with it.

Chrome PC 端将不支持 Autoplay。该特性与移动端一样,Audio 将不能自动触发。

谷歌浏览器从71版本开始就开启了谷歌的安全策略,因此导致的声音不能自动播放,必须在用户有了操作之后才可以播放音乐,比如可以点击一下后边的https://goo.gl/7K7WLu这个链接,也是可以触发播放音乐的。

The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu
Uncaught TypeError: Cannot read property 'getItem' of undefined

处理方法:浏览器打开chrome://flags/#autoplay-policy;Default换成No user gesture is required

修改谷歌安全策略

解决结果:不起作用,蛋疼,这怎么测,找个旧版本的浏览器吗?

Error in event handler for runtime.onMessage: TypeError: Cannot read property 'join' of undefined

封装 TS

export default class Audio{
    //静态常量:浏览器本地缓存键名
    public static IS_MUTE = "isMute";//是否静音全部
    public static IS_MUTE_MUSIC = "isMuteMusic";//是否静音背景
    public static IS_MUTE_SOUND = "isMuteSound";//是否静音音效
    public static VOLUME_MUSIC = "volumeMusic";//背景音量
    public static VOLUME_SOUND = "volumeSound";//音效音量
    //私有属性 静音所有 存取器
    private _isMute:boolean;
    public get isMute():boolean{
        return this._isMute;        
    }
    public set isMute(value:boolean){
        this._isMute = value;
        Laya.SoundManager.muted = value;
        this.save();
    }
    //私有属性 音乐静音 存取器
    private _isMuteMusic:boolean;
    public get isMuteMusic():boolean{
        return this._isMuteMusic;
    }
    public set isMuteMusic(value:boolean){
        this._isMuteMusic = value;
        Laya.SoundManager.musicMuted = value;
        this.save();
    }
    //私有属性 音效静音 存取器
    private _isMuteSound:boolean;
    public get isMuteSound():boolean{
        return this._isMuteSound;
    }
    public set isMuteSound(value:boolean){
        this._isMuteSound = value;
        Laya.SoundManager.soundMuted = value;
        this.save();
    }
    //私有属性 音乐音量 存取器
    private _volumeMusic:number;
    public get volumeMusic():number{
        return this._volumeMusic;
    }
    public set volumeMusic(value:number){
        this._volumeMusic = value;
        Laya.SoundManager.musicVolume = value;
        this.save();
    }
    //私有属性 音效音量 存取器
    private _volumeSound:number;
    public get volumeSound():number{
        return this._volumeSound;
    }
    public set volumeSound(value:number){
        this._volumeSound = value;
        Laya.SoundManager.soundVolume = value;
        this.save();
    }
    //构造函数
    /**
     * 单例设计
     */
    private static _instance:Audio;
    public static getInstance():Audio{
        if(!this._instance){
            this._instance = new Audio();
        }
        return this._instance;
    }
    private constructor(){
        //初始化属性
        this._isMute = false;
        this._isMuteMusic = false;
        this._isMuteSound = false;
        this._volumeMusic = 1;
        this._volumeSound = 1;
        //初始化数据
        this.init();
        //保存到浏览器本地存储
        this.save();
    }
    /**
     * 从浏览器本地缓存中获取参数,处理后设置声音管理器对应参数。
     */
    private init(){
        //静音音乐与音效
        let isMute = Laya.LocalStorage.getItem(Audio.IS_MUTE);
        this._isMute = isMute=="true" ? true : false;
        Laya.SoundManager.muted = this._isMute;
        //设置音乐静音
        let isMuteMusic = Laya.LocalStorage.getItem(Audio.IS_MUTE_MUSIC);
        this._isMuteMusic = isMuteMusic=="true" ? true : false;
        Laya.SoundManager.musicMuted = this._isMuteMusic;
        //设置音效静音
        let isMuteSound = Laya.LocalStorage.getItem(Audio.IS_MUTE_SOUND);
        this._isMuteSound = isMuteSound=="true" ? true : false;
        Laya.SoundManager.soundMuted = this._isMuteSound;
        //设置音乐音量
        let volumeMusic = Laya.LocalStorage.getItem(Audio.VOLUME_MUSIC);
        this._volumeMusic = volumeMusic?parseFloat(volumeMusic):1;
        Laya.SoundManager.musicVolume = this._volumeMusic;
        //设置音效音量
        let volumeSound = Laya.LocalStorage.getItem(Audio.VOLUME_SOUND);
        this._volumeSound = volumeSound?parseFloat(volumeSound):1;
        Laya.SoundManager.soundVolume = this._volumeSound;
    }
    /**
     * 保存数据到浏览器本地存储
     */
    public save(){
        Laya.LocalStorage.setItem(Audio.IS_MUTE, this.isMute.toString());
        Laya.LocalStorage.setItem(Audio.IS_MUTE_MUSIC, this.isMuteMusic.toString());
        Laya.LocalStorage.setItem(Audio.IS_MUTE_SOUND, this.isMuteSound.toString());
        Laya.LocalStorage.setItem(Audio.VOLUME_MUSIC, this.volumeMusic.toString());
        Laya.LocalStorage.setItem(Audio.IS_MUTE_SOUND, this.isMuteSound.toString());
    }
    /**
     * 设置背景音乐音量
     * @param volume {number} 音量大小,范围从0静音到1最大音量。
     */
    public setMusicVolume(volume:number):void{
        Laya.SoundManager.setMusicVolume(volume);
    }
    /**
     * 设置声音音量
     * 根据参数不同可分别设置指定声音音量或所有音效音量
     * @param volume {number} 音量大小,初始值为1,范围从0静音到1最大音量。
     * @param url {string} 声音播放地址,默认为null, 为空表示设置所有音效的音量。
     */
    public setSoundVolume(volume:number, url?:string):void{
        Laya.SoundManager.setSoundVolume(volume, url);
    }
    /**
     * 关闭所有音乐
     */
    public stopAll(){
        Laya.SoundManager.stopAll();
    }
    /**
     * 关闭所有音效
     */
    public stopAllSound(){
        Laya.SoundManager.stopAllSound();
    }
    /**
     * 关闭所有音乐
     */
    public stopMusic(){
        Laya.SoundManager.stopMusic();
    }
    /**
     * 关闭所有音乐
     * @param url 声音地址
     */
    public stopSound(url:string){
        Laya.SoundManager.stopSound(url);
    }
    /**
     * 释放声音资源
     * @param url 声音地址
     */
    public destroySound(url:string){
        Laya.SoundManager.destroySound(url);
    }
    /**
     * 播放音效
     * 可同时播放多个
     * @param url {string} 声音文件地址
     * @param loops {number} 循环次数,0表示无限循环。
     * @param complete {Handler} 播放完回调Handler对象
     * @param soundClass {Object} 使用哪个类进行播放,null表示自动选择。
     * @param startTime {number} 播放的起始时间
     * @return SoundChannel 声音频道对象,可对声音进行控制并获取声音信息。
     */
    public playSound(url:string, loops:number=1, complete=null, soundClass=null, startTime=0){
        Laya.SoundManager.playSound(url, loops, complete, soundClass, startTime);
    }
    /**
     * 播放音乐
     * 同时只能播放一个,若在播放播放背景音乐时再次调用则会先停止之前的背景音乐后再播放当前音乐。
     * @param url {string} 声音文件地址
     * @param loops {number} 循环次数,0表示无限循环。
     * @param complete {Handler} 播放完成后回调函数
     * @param startTime {number} 播放的开始时间
     * @return SoundChannel 声音频道对象,可对声音进行控制并获取声音信息。
     */
    public playMusic(url:string, loops:number=1, complete=null, startTime=0){
        Laya.SoundManager.playMusic(url, loops, complete, startTime);
    }
    /**
     * 移除播放的声音实例
     * @param channel SoundChannel 声音实例
     */
    public removeChannel(channel):void{
        Laya.SoundManager.removeChannel(channel);
    }
    /**
     * 添加播放的声音实例
     * @param channel {SoundChannel} 声音实例
     */
    public addChannel(channel):void{
        Laya.SoundManager.addChannel(channel);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容