多媒体技术与应用 3.2 音频播放器的制作

上传人:cn****1 文档编号:569828667 上传时间:2024-07-31 格式:PPT 页数:52 大小:1.67MB
返回 下载 相关 举报
多媒体技术与应用 3.2 音频播放器的制作_第1页
第1页 / 共52页
多媒体技术与应用 3.2 音频播放器的制作_第2页
第2页 / 共52页
多媒体技术与应用 3.2 音频播放器的制作_第3页
第3页 / 共52页
多媒体技术与应用 3.2 音频播放器的制作_第4页
第4页 / 共52页
多媒体技术与应用 3.2 音频播放器的制作_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《多媒体技术与应用 3.2 音频播放器的制作》由会员分享,可在线阅读,更多相关《多媒体技术与应用 3.2 音频播放器的制作(52页珍藏版)》请在金锄头文库上搜索。

1、3.2 音频播放器的制作音频播放器的制作3.2.1 3.2.1 多媒体编程基础多媒体编程基础3.2.2 3.2.2 波形音频播放器波形音频播放器 3.2.1 3.2.1 多媒体编程基础多媒体编程基础一、一、 多媒体文件多媒体文件二、二、 媒体控制接口媒体控制接口MCI3nRIFF不是一种新的文件格式,而是基于MSWindows的应用程序提供多媒体文件的框架和包络。nRIFF提供了一种组织文件的标准方法,可通过加上新的标记来将它扩展。nRIFF是一种标记文件格式,用标记来标识信息。nRIFF格式是面向主块(Chunk)的,一个RIFF文件由一个或多个主块组成,其中每一个主块都指向下一主块。每一主

2、块都有一个类型,后面跟随着一些数据。一、多媒体文件一、多媒体文件v多媒体文件格式多媒体文件格式资源文件交换格式资源文件交换格式(Resource interchange file format, RIFF) 4nRIFF文件的每个主块含有一个4字符的ASCII串ID称为标记,另4字节说明主块的长度,最后为主块数据,RIFF主块的基本结构如下: typedef unsigned long DWORD; typedef unsigned char BYTE; typedef DWORD FOURCC;typedef struct FOURCC ckID;/ 最多为4字符IDDWORD cksize

3、;/数据字节数BYTE ckDatackSize;/含有实际数据的数组 CK;5RIFF主块RIFF主块类型有nRIFF主块 定义了RIFF文件的内容n表主块 允许嵌入额外的文件信息,如存档位置、版权信息、生成日期等n子主块 当基本主块不够时,允许将更多的信息加到基本主块上6RIFF主块的组织4字节字节7RIFF的扩展文件名文件类型文件类型格式类型格式类型文件扩展名文件扩展名波形音频文件WAVE.WAV音频视频交错文件AVI.AVIMIDI文件RMID.RMI独立于设备的位图文件RDIB.RDI调色板文件PAL.PAL多媒体电影RMN.RMN8WINDOWS的多媒体体系结构的多媒体体系结构9多

4、媒体服务nWindows系统以及MMSYSTEM扩展部分提供了大量的多媒体服务函数,根据服务对象大致分为:高层音频服务(使用高层音频播放函数或MCI)使用简单,易于编程,但功能有限低层音频服务(函数用wave,midi,aux加In或Out前缀组成)可灵活有效控制音频,功能强,但对编程知识和技巧要求高动画播放服务(可使用MCI动画命令或多媒体影片演播函数)多媒体文件I/O服务(包括基本I/O、缓冲文件I/O和RIFF文件I/O,命令类似于mmioOpen,mmioCreateChunk)其他服务函数(操纵杆、计时器、屏幕保护等服务)10v 从从RIFF文件中文件中获取信息取信息 多媒体多媒体I

5、/O函数函数 函数名称函数功能mmioAdvance为mmioGetInfo 函数提供了增强的文件I/O缓冲区mmioAscend退出RIFF文件中的主块mmioClose关闭由mmioOpen 打开的RIFF文件mmioCreateChunk在由mmioOpen 打开的RIFF文件中创建一个主块mmioDescend进入RIFF文件中的主块mmioFlush将RIFF的文件缓冲写入硬盘mmioGetInfo从由mmioOpen 打开的RIFF文件中读入信息11mmioInstallIoProc安装或除去一个定制的I/0进程mmioOpen为输入输出打开一个文件mmioRead从由mmioOp

6、en打开的RIFF文件中读入指定的字节数mmioRename将指定的RIFF文件更名mmioSeek改变由mmioOpen打开的RIFF文件中的文件指针位置mmioSetBuffer允许或禁止缓冲区I/OmmioSetInfo改变由mmioOpen打开的RIFF文件中的信息mmioStringToFOURCC将字符串转换为4字符编码mmioWrite向由mmioOpen打开的RIFF文件中写入指定长度的字节数12v如何读如何读RIFF文件文件n在在读入入RIFF文件文件时,首先必,首先必须打开打开RIFF文件,然后找到文件,然后找到自己感自己感兴趣的主趣的主块的位置并把文件指的位置并把文件指针

7、放在数据的放在数据的顶部部 HMMIO h;CString path;if ( (h=mmioOpen(path, NULL, MMIO_READ)=NULL) return FALSE;打开一个RIFF文件后,就可以从文件中读出信息了: if ( mmioRead(h, &dataformat, (long)n)!=(long)n)mmioClose(h,0);return FALSE;13二、二、 媒体控制接口媒体控制接口(MCI) n媒体控制接口 (MCI, Multimedia Control Interface)成为控制媒体接口和外设的基本方法,提供了一种与设备无关的控制多媒体外设的

8、手段。nMCI设备类型MCI能够控制两类设备:简单设备和复合设备。简单设备:不需要数据文件的设备,例如CD音频播放设备。对于这类设备,其播放的媒体内部已经包含了所需的数据。复合设备:需要数据文件的设备,如波形音频设备。 14vMCI所支持的设备类型 设备类型设备类型说明说明设备类型设备类型说明说明animation动画设备scanner图形扫描设备CdaudioCD音频设备sequencerMIDI序列器Dat数字音频设备 videodisc影碟播放设备Digitalvideo数字视频设备 vcr录像机设备other未定义设备waveaidio波形音频设备overlay叠加视频设备15vMCI

9、函数接口函数接口n nMCIMCI高高高高级级函数接口函数接口函数接口函数接口 函数名称函数名称函数功能函数功能mciGetCreatorTask获得指定MCI设备的任务指针mciGetDeviceID获得MCI设备的标识符mciGetErrorString获得MCI错误信息mciGetYieldProc获得回调函数的地址mciSendCommand向指定MCI设备发送命令消息mciSendString向指定MCI设备发送命令字符串mciSetYieldProc设置回调函数的地址161.mciGetCreatorTask 原型 HANDLE mciGetCreatorTask ( MCIDEV

10、ICEID IDDevice) 功能 获得指定MCI设备的任务指针。 参数 IDDevice 任务所返回的设备ID。 返值 如果函数成功执行则返回所打开设备的指针,否则返回NULL。2.mciGetDeviceID原 型 MCIDEVICEID mciGetDeviceID ( LPCTRSTR lpszDevice)功能 获得MCI设备的标识符。参数 lpszDevice指定设备的名称或别名的字符串。返值 如果函数执行成功则返回指定设备的标识符,否则返回0。执行该函数所获得的设备标识符通常用于mciSendCommand函数。 173.mciGetErrorString 原型 BOOL mc

11、iGetErrorString (DWORD fdwError, LPTSTR lpszErrorText , UINT cchErrorText )功能 获得MCI错误信息。参数 fdwErrormciSendCommand或mciSendString函数返回的错误码。lpszErrorText描述错误码的字符串。 cchErrorTextlpszErrorText 字符串的长度。返值 如果函数执行成功则返回TRUE,否则返回FALSE。184.mciGetYieldProc 原型 YIELDPROC mciGetYieldProc( MCIDEVICEID IDDevice, LPDWOR

12、D lpdwYieldData);功能 获得回调函数的地址。参数 IDDeice 执行MCI命令的设备标识符。LpdwYieldData 将传给回调函数的输出数据缓冲区。返值 如果函数执行成功则返回回调函数的地址,否则返回NULL。 195.mciSendCommand 原型 MCIERROR mciSendCommand( MCIDEVICEID IDDevice, UINT uMsg, DWORD fdwCommand, DWORD dwParam) ;功能 向指定MCI设备发送命令消息。参数 IDDevice接收MCI命令的设备标识符。 uMsg命令消息。 FdwCommand MCI命

13、令消息的标识位。dwParam为指向MCI命令消息数据结构的指针。返值如果函数执行成功返回0。否则返回非0值。当出现MCI错误时返回值的低位字包含错误信息。如果错误和设备有关,则返回值的高位字为设备的标识符,否则高位字为0。将返回值传给mciGetErrorString()可以得到错误信息。 206.mciSendString 原型 MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback) ;功能 向指定MCI设备发送命令字符串。参数 lp

14、szCommand包含MCI命令的字符串。LpszReturnString 接收返回命令的字符串。 cchRerurn 接受返回信息的字符串大小。 HwndCallback 回调窗口句柄,该参数当指定了notify标志时有效。返值 如果函数成功执行则返回0,否则返回非0值。当出现MCI错误时返回值的低位字节包含错误信息。如果错误与设备无关,则返回值的高位字为设备的标识符,否则高位为0。将返回值传给mciGetErrorString()可以得到错误信息。 217.mciSetYieldProc 原型 UINT mciSetYieldProc( MCIDEVICEID IDDevice, YIEL

15、DPROC yp, DWORD dwYieldData) ;功能 设置回调函数的地址。参数 IDDevice回调函数作用的MCI设备标识符。yp 回调函数的地址。DwYieldData 传送给回调函数的数据。返值 如果函数成功执行返回TRUE,否则返回FALSE。 MCI对媒体播放设备的控制主要是通过命令接口函数对媒体播放设备的控制主要是通过命令接口函数mciSendCommand()和字符串接口函数和字符串接口函数mciSendString()来完成的来完成的 。调用命令接。调用命令接口函数之前需要初始化复杂的命令数据结构,因此它比命令口函数之前需要初始化复杂的命令数据结构,因此它比命令字符

16、串的使用更为复杂,相应它也为字符串的使用更为复杂,相应它也为MCI及其播放设备提供及其播放设备提供了更为强大的控制能力。了更为强大的控制能力。22v MCI命令消息命令消息 1.MCI_OPEN命令消息使用该命令初始化设备或文件,所有的设备都能由这一命令打开。MciSendCommand(MCIDEVICEIDwDeviceID,MCI_OPEN,DWORDdwFlags,(DWORD)(LPMCI_OPEN_PARMS)lpOpen); wDeviceID 将接收命令信息的MCI设备ID;dwFlags 是命令消息的标志,通常为MCI_WAIT和MCI_NOTIFY; lpOpen 为指向M

17、CI_OPEN_PARMS结构的指针 23MCI_OPEN_PARMS数据结构的定义:typedef struct DWORD dwCallback;MCIDEVICEID wDeviceID; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName;LPCSTR lpstrAlias; MCI_OPEN_PARMS; dwCallback 指定使用MCI_NOTIFY标志的窗口句柄; wDeviceID返回MCI设备ID; lpstrDeviceType 为MCI设备类型,这与要播放的媒体文件一致;lpstrElementName 指向设备元素名称的指

18、针,通常是一个路径; lpstrAlias 为可选设备的别名。 242.MCI_SET 命令消息使用该命令设置设备信息 mciSendCommand (MCIDEVICEID wDeviceID, MCI_SET, DWORD dwFlags,(DWORD) (LPMCI_SET_PARMS) lpSet);wDeviceID 将接收命令信息的MCI设备ID;dwFlags 是命令消息的标志,通常为MCI_WAIT和MCI_NOTIFY; lpSet 为指向MCI_SET_PARMS结构的指针25MCI_SET_PARMS数据结构的定义:typedef struct DWORD dwCallb

19、ack;DWORD dwTimeFormat;DWORD dwAudio; MCI_SET_PARMS; dwCallback 指定使用MCI_NOTIFY标志的窗口句柄; dwTimeFormat 为时间格式;dwAudio 为输出声管道; 263.MCI_STATUS命令消息 使用该命令以获取设备信息mciSendCommand(MCIDEVICEIDwDeviceID,MCI_STATUS,DWORDdwFlags,(DWORD)(LPMCI_STATUS_PARMS)lpStatus);lpStatus为指向MCI_STATUS_PARMS结构的指针MCI_STATUS_PARMS数据

20、结构:typedefstructDWORD dwCallback;/dwCallback为指定使用MCI_NOTIFY/标志的窗口句柄DWORDdwReturn;/dwReturn包含返回信息DWORDdwItem;/dwItem为需要获取的信息项DWORDdwTrack;/dwTrack为曲目的长度或曲目号。MCI_STATUS_PARMS; 274. MCI_PLAY 命令消息使用该命令使设备播放媒体文件 mciSendCommand( MCIDEVICEID wDeviceID, MCI_PLAY, DWORD dwFlags,(DWORD) (LPMCI_PLAY_PARMS) lpP

21、lay); MCI_PLAY_PARMS数据结构的定义 typedef struct DWORD dwCallback;DWORD dwFrom;/dwFrom 为播放的起点; DWORD dwTo; /dwTo 为播放的终点 MCI_PLAY_PARMS; 3.2.2 波形音频播放器一、波形音频基本知识 二、波形音频播放编程 三、制作波形音频播放器 29一、一、 波形音频基本知识波形音频基本知识 n波形音频是一种电子数字声音,一般用于储存各种非音乐的音频数据,包括语音和声音效果 n决定波形音频文件质量的因素主要有三个:采样率、信息量和通道数。n波形音频文件的格式:波形音频文件为RIFF(多媒

22、体资源交互文件格式)的一种。一个基本的波形文件的实际结构是一个WAVE部分,它包含fmt部分和data部分。在fmt部分包括了波形文件信息的声音信息,而在data部分则包括了具体的波形音频数据。30Fmt部分结构的定义为:typedef struct pcmwave format_tag WAVEFORMAT wf; /WAVEFORMAT为储存波形文件声音信息的一个结构 WORD wBitesPerSample;/为波形文件声音数据的每个采样的位数PCMWAVEFORMAT;结构WAVEFORMAT的定义如下:typedef struct WORD wFormatTag;/波形文件编码的形式

23、 WORD nChannels;/波形文件的通道数 DWORD nSamplesPerSec; /每秒样本数 DWORD nAvgBytesPerSec; /平均传输率 WORD nBlockAlign; /用位进行块校准 WAVEFORMAT;31定义波形记录特性定义波形记录特性包含波形的数据包含波形的数据32v 从波形文件读出数据1.首先用mmioOpen函数将波形文件打开,然后定位文件中的WAVE主块。在在结构构MMCKINFO中包含了有关主中包含了有关主块的信息,的信息,该结构构定定义如下:如下:typedef struct FOURCC ckid; /主块标识符DWORD cksiz

24、e;/主块的大小FOURCC fccType;/主块类型DWORD dwDataOffset;/主块在文件中的偏移量DWORD dwFlags;/主块的标志 MMCKINFO; 为进入文件中的某主块,应将fccType 设置为需要定位的主块类型 332.进一步进入fmt子主块以获得具体的波形文件信息 可从fmt部分中读入PCMWAVEFORMAT的功能 3.当读出一个主块的数据后,退出该主块并准备读出下一个主块的内容 mmioAscend(h, (LPMMCKINFO)&mmSub, 0); 4.将波形文件数据部分读入内存中,由mmioDescend 调用所返回的cksize 用于确定内存的大

25、小。 34GLOBALHANDLE wavehandle;HPSTR wavepointer; MmSub.ckid=mmioFOURCC (d, a, t, a); if (mmioDescend (h, (LPMMCKINFO) &mmSub, (LPMMCKINFO) &mmParent, MMIO_FINDCHUNK) mmioClose (h, 0); return FALSE; if(wavehandle=GlobalAlloc (GMEN_MOVEABLE|GMEM_SHARE, mmSub. ckSize) ) =NULL) mmioClose (h, 0); return F

26、ALSE; if (wavepointer=(HPSTR) GlobalLock (wavehandle) = NULL) mmioClose (h, 0); return FALSE; 35if (mmioRead (h, wavepointer, mmSub.cksize)!=mmSub.cksize) GlobalUnlock (wavehandle);GlobalFree (wavehandle); mmioClose (h, 0); return FALSE; GlobalUnlock (wavehandle); 36二、二、 波形音频编程波形音频编程 MFC为用户提供的用于处理波形

27、音频文件的函数主要有4类:MessageBeep (播放对应给定的系统报警波形声音)PlaySound 和sndPlaySound (播放对应给定的文件名或注册项的波形声音)MCI调用 Wave低级设备函数 其中前两类为高层波形音频函数37v 使用使用MessageBeep播放波形音频播放波形音频 The MessageBeep function plays a waveform sound. The waveform sound for each sound type is identified by an entry in the sounds section of the registr

28、y.BOOLMessageBeep( UINTuType/soundtype ValueSoundFile0xFFFFFFFFStandard beep using the computer speakerNoMB_ICONASTERISKSystemAsteriskchord.wavMB_ICONEXCLAMATIONSystemExclamationchord.wavMB_ICONHANDSystemHandchord.wavMB_ICONQUESTIONSystemQuestionchord.wavMB_OKSystemDefaultding.wav38v 使用使用PlaySound播放

29、波形音频播放波形音频 PlaySound函数能播放硬盘或应用程序本身资源中的波形音频文件,或在win.ini文件中所定义的系统声音。BOOLPlaySound(LPCSTRpszSound,HMODULEhmod,DWORD fdwSound); Parameters pszSound 为包含要播放的音频文件名的字符串,如果该参数为NULL,停止播放所有波形音频文件。39v 使用使用PlaySound播放波形音频播放波形音频 hmod Handle of the executable file that contains the resource to be loaded. This para

30、meter must be NULL unless SND_RESOURCE is specified in fdwSound. fdwSound Flags for playing the sound. PlaySound函数在播放波形音频文件时,首先将音频文件读入内存中再播放,因此所播放的音频文件大小必须与系统当前的空闲内存适合。这一点正是PlaySound函数最大局限所在,它一般只能用于播放较小的波形音频文件。 40清清单GetSoundToMem函数函数void* CwaveAudio:GetSoundToMem (DWORD dwSize)HGLOBAL Global;HGLOBAL

31、* pGlobal;unsigned char* pMem;Global = GlobalAlloc (GMEM_FIXED, (DWORD) dwSize + 10); /分配内存If (! Global) return (NULL);PMem= (unsigned char *) GlobalLock (Global); / 锁住内存PGlobal = (HGLOBAL*) pMem;*pGlobal = Global;pMem + = sizeof (HGLOBAL);return (pMem); 41清清单 FreeMemvoid CwaveAudio:FreeMem (void fa

32、r *pMem)HGLOBAL Global;HGLOBAL *pGlobal;unsigned char * pUChar;pUChar= (unsigned char *) pMem;pUChar- = sizeof (HGLOBAL);pGlobal= (HGLOBAL*) pUChar;Global= *pUChar;GlobalUnlock (Global);GlobalFree (Global); 42CStringFilename; /波形音频文件名Void*m_pSoundData; /波形音频数据在内存中的指针CfileFile;If(!File.Open(Filename,

33、Cfile:modeRead) /打开波形音频文件ReturnFALSE;DWORDdwLength=File.GetLength(); / 得到波形音频文件的长度m_pSoundData=AllocMem(dwLength);if(!m_pSoundData)File.Close();ReturnFALSE;if (File.ReadHuge (m_pSoundData,dwLength) != dwLength) /将波形音频文件读入内存中File.Close();ReturnFALSE;File.Close();PlaySound(char*)m_pSoundData,NULL,SND_

34、MEMORY|SND_ASYNC|SND_NOSTOP);FreeMem(m_pSoundData); 43v 使用使用MCI播放波形音频播放波形音频 与播放与播放WAV音音频相关的相关的MCI命令命令 MCI命令命令命令功能命令功能MCI命令命令命令功能命令功能MCI_OPEN打开波形设备MCI_SET设置波形文件MCI_CLOSE关闭波形设备MCI_STATUS得到波形文件的信息MCI_PLAY播放波形音频文件MCI_RECORD 录制波形音频MCI_STOP停止播放波形音频文件MCI_SAVE 存储所录制的波形音频 MCI_SEEK跳到波形音频文件的指定位置44波形音波形音频常用的常用的

35、MCI_SET标志志 标志标志标志含义标志含义MCI_WAVE_SET_BITSPERSAMPLE设置播放或录制波形文件时每秒采样位数MCI_WAVE_SET_AVGBYTESPERSEC设置播放或录制波形文件时每秒字节数MCI_WAVE_SET_FORMATTAG设置播放或录制波形文件格式MCI_WAVE_SET_SAMPLESPERSEC设置播放或录制波形文件每秒采样数MCI_WAVE_INPUT设置录制波形文件的输入设备MCI_WAVE_OUTPUT设置播放波形文件的输出设备45波形音波形音频常用的常用的MCI_STATUS标志志注意:注意:所得的返回信息保存在MCI_STATUS结构的

36、dwReturn数据成员中 标志标志标志含义标志含义MCI_WAVE_FORMATTG获得波形文件的格式MCI_WAVE_INPUT获得波形文件的输入设备MCI_WAVE_OUTPUT获得波形文件的输出设备MCI_WAVE_STATUS_CHANNELS获得播放波形文件的声道数目MCI_WAVE_STATUS_BITSPERSAMPLE获得播放或录制波形文件时每秒的采样位数MCI_WAVE_STATUS_AVGBYTESPERSEC获得播放或录制波形文件时每秒的字节数46v 波形音频的波形音频的MCI编程步骤编程步骤 n使用MCI处理波形音频的一般步骤是:首先打开播放波形音频的MCI设备;然后

37、使用MCI设备处理波形音频;处理完毕后关闭MCI设备。 471)打开播放波形音频设备 WORD m_wDeveceID; /MCI设备IDCString FileName; /波形文件名MCI_OPEN_PARMS OpenParms;/ MCI设备打开参数OpenParms.lpstrDeviceType = “waveAudio”;/设备种类OpenParms.lpstrElementName = Filename;if(mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_OPEN_TYPE, (DWORD) (LPVOID) &OpenParms

38、)return FALSE;m_wDeviceID =OpenParms.wDeviceID; 482)获得波形音频的信息 DWORD SampleRate; /采样率MCI_STATUS_PARMS StatusParms;StatusParms.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;If(mciSendCommand(m_wDeviceID,MCI_STATUS, MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID) &StatusParms)return 1;SampleRate = StatusParms.dwRetu

39、rn;要从文件中获得有关信息,就要发送MCI_STATUS命令消息:493)播放波形音频 MCI_PLAY_PARMS PlayParms;MciSendCommand(m_wDeviceID,MCI_SEEK, CI_SEEK_TO_START, NULL);If(mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_NOTIFY, (DWORD)(LPVOID)&PlayParms)Return FALSE;ElseReturn true; 播放波形音频文件时,一般先发送MCI_SEEK命令将播放指针定位在波形文件的开始处,然后再发送MCI_PLAY命令进行播放:

40、504)关闭波形音频设备mciSendCommand (m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);mciSendCommand(m_wDeviceID, MCI_CLOSE, MCI_NOTIFY, NULL);在关闭波形音频设备时,一般先停止当前播放的声音,然后再关闭设备: 如果在调用mciSendCommand函数时,指定了MCI_NOTIFY标志,则当函数执行完毕后,会发送一个MM_MCINOTIFY消息。这样我们可以在程序中添加对MM_MCINOTIFY的消息处理函数,来对消息作出响应。例如,接收到该消息后,就关闭设备,或是播放下一个波形音频文件,这是PlaySound所无法解决的。51v建立处理波形音频的类建立处理波形音频的类 n类功能的设计 n类功能的实现 1)类的构造函数和析构函数 2)处理波形设备的成员函数 3)处理波形音频的成员函数 4)录制波形音频的成员函数 5)获取波形音频信息的函数 nCD player52

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号