HarmonyOS实战开辟:SoundPool (音频池)

打印 上一主题 下一主题

主题 812|帖子 812|积分 2436

音频池加载播放实例,音频池提供了系统声音的加载、播放、音量设置、循环设置、停止播放、资源卸载等功能。
SoundPool需要和@ohos.multimedia.media共同利用,需要先通过media.createSoundPool完成音频池实例的创建。
   说明:
  本模块首批接口从API version 10开始支持。后续版本的新增接口,接纳上角标单独标志接口的起始版本。
  导入模块

  1. import media from '@ohos.multimedia.media';
  2. import audio from '@ohos.multimedia.audio';
复制代码
PlayParameters

表示音频池播放参数设置。
通过设置播放相干参数,来控制播放的音量,循环次数,播放优先级等参数。
系统本领: SystemCapability.Multimedia.Media.SoundPool
名称类型必填说明loop数否设置循环参数,0为循环一次,-1表示一直循环。rate数否设置音频播放的倍速,具体倍速范围参照AudioRendererRate。leftVolume数否设置左声道音量,设置范围(0~1)。rightVolume数否设置右声道音量。(当前不支持左右分别设置,将以左声道音量为准)。priority数否音频流播放的优先级,0为最低优先级,数值越大优先级越高,通过相互比力大小确定播放优先级。parallelPlayFlag布尔否是否和别的正在播放的音频并行播放的标识,true:不抢占音频核心和别的正在播放的音频并行播放,false:抢占核心打断别的正在播放的音频。
此接口为系统接口。 SoundPool

音频池提供了系统声音的加载、播放、音量设置、循环设置、停止播放、资源卸载等功能, 在调用SoundPool的接口前,需要先通过createSoundPool创建实例
load

load(uri: string, callback: AsyncCallback<number>): void
加载音频资源。利用callback方式异步获取资源ID,入参uri通过获取文件fd生成以"fd://"开头的文件形貌字符串。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明uri字符串是音频文件的加载路径形貌,一般以"fd://"开头的文件形貌。回调AsyncCallback<number>是异步音频资源加载返回的资源id,有效值大于0。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400103I/O error. Return by callback.5400105Service died. Return by callback. 示例:
  1. import fs from '@ohos.file.fs';
  2. import { BusinessError } from '@ohos.base';
  3. //创建soundPool实例
  4. let soundPool: media.SoundPool;
  5. let audioRendererInfo: audio.AudioRendererInfo = {
  6.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  7.   rendererFlags: 1
  8. }
  9. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  10.   if (error) {
  11.     console.info(`createSoundPool failed`)
  12.     return;
  13.   } else {
  14.     soundPool = soundPool_;
  15.     console.info(`createSoundPool success`)
  16.     let uri:string = "";
  17.     let file: fs.File;
  18.     //获取fd的uri路径
  19.     fs.open('/test_01.mp3', fs.OpenMode.READ_ONLY).then((file_: fs.File) => {
  20.       file = file_;
  21.       console.info("file fd: " + file.fd);
  22.       uri = 'fd://' + (file.fd).toString()
  23.       soundPool.load(uri, (error: BusinessError, soundId_: number) => {
  24.         if (error) {
  25.           console.info(`load soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  26.         } else {
  27.           console.info(`load soundPool Success` + JSON.stringify(soundId_))
  28.         }
  29.       });
  30.     }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。
  31.   }
  32. });
复制代码
load

load(uri: string): Promise<number>
加载音频资源。利用Promise方式异步获取资源ID,入参uri通过获取文件fd生成以"fd://"开头的文件形貌字符串。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明uri字符串是音频文件的加载路径形貌,一般以"fd://"开头的文件形貌。 返回值:
类型说明Promise<number>异步音频池资源的加载,返回资源的id,有效值大于0。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400103I/O error. Return by promise.5400105Service died. Return by promise. 示例:
  1. import fs from '@ohos.file.fs';
  2. import { BusinessError } from '@ohos.base';
  3. //创建soundPool实例
  4. let soundPool: media.SoundPool;
  5. let audioRendererInfo: audio.AudioRendererInfo = {
  6.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  7.   rendererFlags: 1
  8. }
  9. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  10.   if (error) {
  11.     console.info(`createSoundPool failed`)
  12.     return;
  13.   } else {
  14.     soundPool = soundPool_;
  15.     console.info(`createSoundPool success`)
  16.     let uri:string = "";
  17.     let soundID: number = 0;
  18.     let file: fs.File;
  19.     //获取fd的uri路径
  20.     fs.open('/test_01.mp3', fs.OpenMode.READ_ONLY).then((file_: fs.File) => {
  21.       file = file_;
  22.       console.info("file fd: " + file.fd);
  23.       uri = 'fd://' + (file.fd).toString()
  24.       soundPool.load(uri).then((soundId: number) => {
  25.         console.info('soundPool load uri success');
  26.         soundID = soundId;
  27.       }, (err: BusinessError) => {
  28.         console.error('soundPool load failed and catch error is ' + err.message);
  29.       });
  30.     }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。
  31.   }
  32. });
复制代码
load

load(fd: number, offset: number, length: number, callback: AsyncCallback<number>): void
加载音频资源。利用callback方式异步获取资源ID,入参可手动传入资源信息或通过读取应用内置资源自动获取。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明fdnumber是资源句柄,通过resourceManager.getRawFileDescriptor获取。offsetnumber是资源偏移量,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。lengthnumber是资源长度,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。callbackAsyncCallback<number>是获取回调的soundID,有效值大于0。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400103I/O error. Return by callback.5400105Service died. Return by callback. 示例:
  1. import fs from '@ohos.file.fs';
  2. import { BusinessError } from '@ohos.base';
  3. //创建soundPool实例
  4. let soundPool: media.SoundPool;
  5. let audioRendererInfo: audio.AudioRendererInfo = {
  6.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  7.   rendererFlags: 1
  8. }
  9. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  10.   if (error) {
  11.     console.info(`createSoundPool failed`)
  12.     return;
  13.   } else {
  14.     soundPool = soundPool_;
  15.     console.info(`createSoundPool success`)
  16.     let file: fs.File;
  17.     let soundID: number = 0;
  18.     let fileSize: number = 1; //通过fs.stat()获取size值
  19.     let uri: string = "";
  20.     //获取fd的描述信息
  21.     fs.open('/test_01.mp3', fs.OpenMode.READ_ONLY).then((file_: fs.File) => {
  22.       file = file_;
  23.       console.info("file fd: " + file.fd);
  24.       uri = 'fd://' + (file.fd).toString()
  25.       soundPool.load(file.fd, 0, fileSize, (error: BusinessError, soundId_: number) => {
  26.         if (error) {
  27.           console.info(`load soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  28.         } else {
  29.           soundID = soundId_;
  30.           console.info('load success soundid:' + soundId_);
  31.         }
  32.       });
  33.     }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。
  34.   }
  35. });
复制代码
load

load(fd: number, offset: number, length: number): Promise<number>
加载音频资源。利用Promise方式异步获取资源ID,入参可手动传入资源信息或通过读取应用内置资源自动获取。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明fdnumber是资源句柄,通过resourceManager.getRawFileDescriptor获取。offsetnumber是资源偏移量,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。lengthnumber是资源长度,需要基于预置资源的信息输入,非法值会造成音视频资源解析错误。 返回值:
类型说明Promise<number>获取回调的soundID,有效值大于0。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400103I/O error. Return by promise.5400105Service died. Return by promise. 示例:
  1. import fs from '@ohos.file.fs';
  2. import { BusinessError } from '@ohos.base';
  3. //创建soundPool实例
  4. let soundPool: media.SoundPool;
  5. let audioRendererInfo: audio.AudioRendererInfo = {
  6.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  7.   rendererFlags: 1
  8. }
  9. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  10.   if (error) {
  11.     console.info(`createSoundPool failed`)
  12.     return;
  13.   } else {
  14.     soundPool = soundPool_;
  15.     console.info(`createSoundPool success`)
  16.     let file: fs.File;
  17.     let soundID: number = 0;
  18.     let fileSize: number = 1; //通过fs.stat()获取size值
  19.     let uri: string = "";
  20.     //获取fd的描述信息
  21.     fs.open('/test_01.mp3', fs.OpenMode.READ_ONLY).then((file_: fs.File) => {
  22.       file = file_;
  23.       console.info("file fd: " + file.fd);
  24.       uri = 'fd://' + (file.fd).toString()
  25.       soundPool.load(file.fd, 0, fileSize).then((soundId: number) => {
  26.         console.info('load success');
  27.         soundID = soundId;
  28.       }, (err: BusinessError) => {
  29.         console.error('soundpool load failed and catch error is ' + err.message);
  30.       });
  31.     });
  32.   }
  33. });
复制代码
play

play(soundID: number, params: PlayParameters, callback: AsyncCallback<number>): void
播放音频资源。利用callback方式异步获取音频流streamID。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明soundIDnumber是资源ID,通过load方法获取。paramsPlayParameters是play播放相干参数的设置。callbackAsyncCallback<number>是获取回调的音频流ID,有效值大于0。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let soundID: number = 0;
  16.     let streamID: number = 0;
  17.     let playParameters: media.PlayParameters = {
  18.       loop: 3, // 循环4次
  19.       rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
  20.       leftVolume: 0.5, // range = 0.0-1.0
  21.       rightVolume: 0.5, // range = 0.0-1.0
  22.       priority: 0, // 最低优先级
  23.     }
  24.     soundPool.play(soundID, playParameters, (error: BusinessError, streamId: number) => {
  25.       if (error) {
  26.         console.info(`play sound Error: errCode is ${error.code}, errMessage is ${error.message}`)
  27.       } else {
  28.         streamID = streamId;
  29.         console.info('play success soundid:' + streamId);
  30.       }
  31.     });
  32.   }
  33. });
复制代码
play

play(soundID: number, callback: AsyncCallback<number>): void
播放音频资源。利用callback方式异步获取音频流streamID。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明soundIDnumber是资源ID,通过load方法获取。callbackAsyncCallback<number>是获取回调的音频流ID,有效值大于0。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let soundID: number = 0;
  16.     let streamID: number = 0;
  17.     soundPool.play(soundID,  (error: BusinessError, streamId: number) => {
  18.       if (error) {
  19.         console.info(`play sound Error: errCode is ${error.code}, errMessage is ${error.message}`)
  20.       } else {
  21.         streamID = streamId;
  22.         console.info('play success soundid:' + streamId);
  23.       }
  24.     });
  25.   }
  26. });
复制代码
play

play(soundID: number, params?: PlayParameters): Promise<number>
播放音频资源。利用Promise方式异步获取音频流streamID。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明soundIDnumber是资源ID,通过load方法获取。paramsPlayParameters否play播放相干参数的设置。 返回值:
类型说明Promise<number>获取回调的音频流ID,有效值大于0。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let soundID: number = 0;
  16.     let streamID: number = 0;
  17.     let playParameters: media.PlayParameters = {
  18.       loop: 3, // 循环4次
  19.       rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
  20.       leftVolume: 0.5, // range = 0.0-1.0
  21.       rightVolume: 0.5, // range = 0.0-1.0
  22.       priority: 0, // 最低优先级
  23.     }
  24.     soundPool.play(soundID, playParameters).then((streamId: number) => {
  25.       console.info('play success');
  26.       streamID = streamId;
  27.     },(err: BusinessError) => {
  28.       console.error('soundpool play failed and catch error is ' + err.message);
  29.     });
  30.   }
  31. });
复制代码
stop

stop(streamID: number, callback: AsyncCallback<void>): void
停止播放音频资源。利用callback方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamIDnumber是音频流ID,通过play方法获取。callbackAsyncCallback<void>是异步音频池stop的回调方法。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     //先调用play方法给拿到对应的streamID
  17.     soundPool.stop(streamID, (error: BusinessError) => {
  18.       if (error) {
  19.         console.info(`stop sound Error: errCode is ${error.code}, errMessage is ${error.message}`)
  20.       } else {
  21.         console.info('stop success');
  22.       }
  23.     })
  24.   }
  25. });
复制代码
stop

stop(streamID: number): Promise<void>
停止streamID对应的音频播放。利用Promise方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamID数是音频流ID,通过play方法获取。 返回值:
类型说明承诺<无效>返回值。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     //先调用play方法给拿到对应的streamID
  17.     soundPool.stop(streamID).then(() => {
  18.       console.info('stop success');
  19.     }, (err: BusinessError) => {
  20.       console.error('soundpool load stop and catch error is ' + err.message);
  21.     });
  22.   }
  23. });
复制代码
setLoop

setLoop(streamID: number, loop: number, callback: AsyncCallback<void>): void;
设置循环模式。利用callback方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamID数是音频流ID,通过play方法获取。loop数是设置循环的次数,0为默认1次,小于0为一直循环。callbackAsyncCallback<void>是异步setLoop的回调方法。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     //先通过调用play方法获取到对应的streamID
  17.     //设置循环2次
  18.     soundPool.setLoop(streamID, 2, (error: BusinessError) => {
  19.       if (error) {
  20.         console.info(`setLoop soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  21.       } else {
  22.         console.info('setLoop success streamID:' + streamID);
  23.       }
  24.     });
  25.   }
  26. });
复制代码
setLoop

setLoop(streamID: number, loop: number): Promise<void>
设置循环模式。利用Promise方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamIDnumber是音频流ID,通过play方法获取。loopnumber是设置循环的次数,0为默认1次,小于0为一直循环。 返回值:
类型说明Promise<void>异步音频池setLoop方法的Promise返回值。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     //先通过调用play方法获取到对应的streamID
  17.     //设置循环1次
  18.     soundPool.setLoop(streamID, 1).then(() => {
  19.       console.info('setLoop success streamID:' + streamID);
  20.     }).catch((err: BusinessError) => {
  21.       console.error('soundpool setLoop failed and catch error is ' + err.message);
  22.     });
  23.   }
  24. });
复制代码
setPriority

setPriority(streamID: number, priority: number, callback: AsyncCallback<void>): void
设置音频流播放的优先级。利用callback方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamIDnumber是音频流ID,通过play方法获取。prioritynumber是优先级,0表示最低优先级。callbackAsyncCallback<void>是异步音频池setPriority方法的回调方法。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     // 先调用play方法获取到对应资源的streamID
  17.     // 给对应的streamID资源设置优先级为1
  18.     soundPool.setPriority(streamID, 1, (error: BusinessError) => {
  19.       if (error) {
  20.         console.info(`setPriority soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  21.       } else {
  22.         console.info('setPriority success streamID:' + streamID);
  23.       }
  24.     });
  25.   }
  26. });
复制代码
setPriority

setPriority(streamID: number, priority: number): Promise<void>
设置音频流优先级。利用Promise方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamID数是音频流ID,通过play方法获取。priority数是优先级,0表示最低优先级。 返回值:
类型说明承诺<无效>异步音频池setPriority的Promise返回值。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     // 先调用play方法获取到对应资源的streamID
  17.     // 给对应的streamID资源设置优先级为1
  18.     soundPool.setPriority(streamID, 1).then(() => {
  19.       console.info('setPriority success');
  20.     }, (err: BusinessError) => {
  21.       console.error('soundpool setPriority failed and catch error is ' + err.message);
  22.     });
  23.   }
  24. });
复制代码
setRate

setRate(streamID: number, rate: audio.AudioRendererRate, callback: AsyncCallback<void>): void
设置音频流播放速率。利用callback方式异步获取返回值。
   说明: 该接口在4.0版本开放,功能实现受设备影响有所区别(当前RK3568开辟板支持倍速,其他设备暂不支持)。
  系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamID数是音频流ID,通过play方法获取。rateaudio.AudioRendererRate是音频rate相干参数。回调AsyncCallback<void>是异步音频池setRate方法的回调方法。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     let selectedAudioRendererRate: audio.AudioRendererRate = audio.AudioRendererRate.RENDER_RATE_NORMAL; // 默认正常速率
  17.     // 先调用play方法获取到对应资源的streamID
  18.     soundPool.setRate(streamID, selectedAudioRendererRate, (error: BusinessError) => {
  19.       if (error) {
  20.         console.info(`setRate soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  21.       } else {
  22.         console.info('setRate success streamID:' + streamID);
  23.       }
  24.     })
  25.   }
  26. });
复制代码
setRate

setRate(streamID: number, rate: audio.AudioRendererRate): Promise<void>
设置音频流的播放速率。利用Promise方式异步获取返回值。
   说明: 该接口在4.0版本开放,功能实现受设备影响有所区别(当前RK3568开辟板支持倍速,其他设备暂不支持)。
  系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamIDnumber是音频流ID,通过play方法获取。rateaudio.AudioRendererRate是音频rate相干参数。 返回值:
类型说明Promise<void>异步音频池setRate方法的Promise返回值。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     let selectedAudioRendererRate: audio.AudioRendererRate = audio.AudioRendererRate.RENDER_RATE_NORMAL; // 默认正常速率
  17.     // 先调用play方法获取到对应资源的streamID
  18.     soundPool.setRate(streamID, selectedAudioRendererRate).then(() => {
  19.       console.info('setRate success');
  20.     }, (err: BusinessError) => {
  21.       console.error('soundpool setRate failed and catch error is ' + err.message);
  22.     });
  23.   }
  24. });
复制代码
setVolume

setVolume(streamID: number, leftVolume: number, rightVolume: number, callback: AsyncCallback<void>): void
设置音频流播放音量。利用callback方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamIDnumber是音频流ID,通过play方法获取。leftVolumenumber是左声道音量,设置范围为0.0-1.0之间。rightVolumenumber是右声道音量,当前右声道设置无效,以左声道为准。callbackAsyncCallback<void>是异步音频池setVolume方法的回调方法。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     // 先调用play方法获取到对应资源的streamID
  17.     //设置音量为0.5
  18.     soundPool.setVolume(streamID, 0.5, 0.5, (error: BusinessError) => {
  19.       if (error) {
  20.         console.info(`setVolume soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  21.       } else {
  22.         console.info('setVolume success streamID:' + streamID);
  23.       }
  24.     })
  25.   }
  26. });
复制代码
setVolume

setVolume(streamID: number, leftVolume: number, rightVolume: number): Promise<void>
设置音频流的播放音量。利用Promise方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明streamID数是音频流ID,通过play方法获取。leftVolume数是左声道音量,设置范围为0.0-1.0之间。rightVolume数是右声道音量,当前右声道设置无效,以左声道为准。 返回值:
类型说明承诺<无效>异步音频池setVolume方法的Promise返回值。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let streamID: number = 0;
  16.     // 先调用play方法获取到对应资源的streamID
  17.     soundPool.setVolume(streamID, 0.5, 0.5).then(() => {
  18.       console.info('setVolume success');
  19.     }, (err: BusinessError) => {
  20.       console.error('soundpool setVolume failed and catch error is ' + err.message);
  21.     });
  22.   }
  23. });
复制代码
unload

unload(soundID: number, callback: AsyncCallback<void>): void
卸载音频资源。利用callback方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明soundID数是资源ID,通过load方法获取。回调AsyncCallback<void>是异步音频池unload方法的回调方法。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by callback.5400103I/O error. Return by callback.5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let soundID: number = 0;
  16.     // 先调用load方法获取到对应资源的soundID
  17.     soundPool.unload(soundID, (error: BusinessError) => {
  18.       if (error) {
  19.         console.info(`unload soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  20.       } else {
  21.         console.info('unload success:');
  22.       }
  23.     })
  24.   }
  25. });
复制代码
unload

unload(soundID: number): Promise<void>
卸载音频资源。利用Promise方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明soundIDnumber是资源ID,通过load方法获取。 返回值:
类型说明Promise<void>异步音频池unload方法的Promise返回值。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400102Operation not allowed. Return by promise.5400103I/O error. Return by promise.5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     let soundID: number = 0;
  16.     // 先调用load方法获取到对应资源的soundID
  17.     soundPool.unload(soundID).then(() => {
  18.       console.info('unload success');
  19.     }, (err: BusinessError) => {
  20.       console.error('soundpool unload failed and catch error is ' + err.message);
  21.     });
  22.   }
  23. });
复制代码
release

release(callback: AsyncCallback<void>): void
释放音频池实例。利用callback方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明callbackAsyncCallback<void>是异步音频池release方法的回调方法。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400105Service died. Return by callback. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.release((error: BusinessError) => {
  16.       if (error) {
  17.         console.info(`release soundPool Error: errCode is ${error.code}, errMessage is ${error.message}`)
  18.       } else {
  19.         console.info('release success');
  20.       }
  21.     })
  22.   }
  23. });
复制代码
release

release(): Promise<void>
释放音频池实例。利用Promise方式异步获取返回值。
系统本领: SystemCapability.Multimedia.Media.SoundPool
返回值:
类型说明承诺<无效>异步音频池release方法的Promise返回值。 错误码:
以下错误码的详细介绍请参见媒体错误码。
错误码ID错误信息5400105Service died. Return by promise. 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.release().then(() => {
  16.       console.info('release success');
  17.     }, (err: BusinessError) => {
  18.       console.error('soundpool release failed and catch error is ' + err.message);
  19.     });
  20.   }
  21. });
复制代码
on('loadComplete')

on(type: 'loadComplete', callback: Callback<number>): void
音频池资源加载完成监听。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明类型字符串是支持的事件:'loadComplete',对应的ID加载完成会触发此回调。回调Callback<number>是对应资源加载完成的资源ID。 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.on('loadComplete', (soundId: number) => {
  16.       console.info('loadComplete success,soundId:' + soundId)
  17.     })
  18.   }
  19. });
复制代码
off('loadComplete')

off(type: 'loadComplete'): void
取消监听资源的加载完成。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明typestring是取消注册的事件:'loadComplete'。 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.off('loadComplete')
  16.   }
  17. });
复制代码
on('playFinished')

on(type: 'playFinished', callback: Callback<void>): void
音频池资源播放完成监听。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明typestring是支持的事件:'playFinished',音频流播放完成会触发此回调。callbackCallback<void>是异步'playFinished'的回调方法。 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.on('playFinished', () => {
  16.       console.info('playFinished success')
  17.     });
  18.   }
  19. });
复制代码
off('playFinished')

off(type: 'playFinished'): void
取消监听音频池资源播放完成。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明typestring是取消注册的事件:'playFinished'。 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.off('playFinished')
  16.   }
  17. });
复制代码
on('error')

on(type: 'error', callback: ErrorCallback): void
监听SoundPool的错误事件,该事件仅用于错误提示。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明typestring是错误事件回调类型,支持的事件:'error',用户操纵和系统都会触发此事件。callbackErrorCallback是错误事件回调方法:利用播放器的过程中发生错误,会提供错误码ID和错误信息。 SoundPool回调的错误分类可以分为以下几种:
错误码ID错误信息说明401Invalid Parameter:入参错误,表示调用无效。801Unsupport Capability:不支持该API本领,表示调用无效。5400101No Memory:内存不足。5400102Operation Not Allowed:当前状态机不支持此操纵,表示调用无效。5400103IO Error:I/O异常。5400105Service Died:播放进程殒命,音频池依赖的service端发生异常。 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.on('error', (error: BusinessError) => {
  16.       console.error('error happened,and error message is :' + error.message)
  17.       console.error('error happened,and error code is :' + error.code)
  18.     })
  19.   }
  20. });
复制代码
off('error')

off(type: 'error'): void
取消监听音频池的错误事件。
系统本领: SystemCapability.Multimedia.Media.SoundPool
参数:
参数名类型必填说明类型字符串是错误事件回调类型,取消注册的事件:'error'。 示例:
  1. import { BusinessError } from '@ohos.base';
  2. //创建soundPool实例
  3. let soundPool: media.SoundPool;
  4. let audioRendererInfo: audio.AudioRendererInfo = {
  5.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  6.   rendererFlags: 1
  7. }
  8. media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => {
  9.   if (error) {
  10.     console.info(`createSoundPool failed`)
  11.     return;
  12.   } else {
  13.     soundPool = soundPool_;
  14.     console.info(`createSoundPool success`)
  15.     soundPool.off('error')
  16.   }
  17. });
复制代码
最后

有许多小同伴不知道学习哪些鸿蒙开辟技术?不知道需要重点掌握哪些鸿蒙应用开辟知识点?而且学习时频仍踩坑,终极浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 
这份鸿蒙(HarmonyOS NEXT)资料包罗了鸿蒙开辟必掌握的核心知识要点,内容包罗了ArkTS、ArkUI开辟组件、Stage模子、多端摆设、分布式应用开辟、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开辟、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
希望这一份鸿蒙学习资料能够给各人带来帮助,有需要的小同伴自行领取,限时开源,先到先得~无套路领取!!
获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
鸿蒙(HarmonyOS NEXT)最新学习路线




  •  HarmonOS基础技能



  • HarmonOS就业必备技能 

  •  HarmonOS多媒体技术



  • 鸿蒙NaPi组件进阶



  • HarmonOS高级技能



  • 初识HarmonOS内核 

  • 实战就业级设备开辟

有了路线图,怎么能没有学习资料呢,小编也准备了一份团结鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开辟入门教学视频,内容包罗:ArkTS、ArkUI、Web开辟、应用模子、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开辟入门教学视频》


《鸿蒙生态应用开辟V2.0白皮书》


《鸿蒙 (OpenHarmony)开辟基础到实战手册》

OpenHarmony北向、南向开辟情况搭建

 《鸿蒙开辟基础》



  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开辟
  • .……

 《鸿蒙开辟进阶》



  • Stage模子入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开辟
  • 关照与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开辟
  • 应用测试
  • DFX面向将来操持
  • 鸿蒙系统移植和裁剪定制
  • ……

《鸿蒙进阶实战》



  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机遇。只有积极应对变革,不断学习和提拔本身,他们才能在这个变革的期间中立于不败之地。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表