Mp3解碼算法流程_第1頁
Mp3解碼算法流程_第2頁
Mp3解碼算法流程_第3頁
Mp3解碼算法流程_第4頁
Mp3解碼算法流程_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Mp3解碼算法流程 第1章     聲明本文檔版權(quán)歸屬于西安交通大學(xué)人工智能與機器人研究所 作者:李國輝  ghli第2章     Mp3解碼算法流程       MP3的全稱為MPEG1 Layer-3音頻文件, MPEG音頻文件是MPEG1標(biāo)準(zhǔn)中的聲音部分,也叫MPEG音頻層,它根據(jù)壓縮質(zhì)量和編碼復(fù)雜程度劃分為三層,即Layer1、Layer2、Layer3,且分別對應(yīng)MP1、MP2、MP3這三種聲音文件,并根據(jù)不同的用途,使用不同

2、層次的編碼。MPEG音頻編碼的層次越高,編碼器越復(fù)雜,壓縮率也越高,MP1和MP2的壓縮率分別為4:1和6:1-8:1,而MP3的壓縮率則高達(dá)10:1-12:1。一分鐘CD音質(zhì)的音樂,未經(jīng)壓縮需要10MB的存儲空間,而經(jīng)過MP3壓縮編碼后只有1MB左右。不過MP3對音頻信號采用的是有損壓縮方式,為了降低聲音失真度,MP3采取了“心理聲學(xué)模型”,即編碼時先對音頻文件進(jìn)行頻譜分析,然后再根據(jù)心理聲學(xué)模型把譜線分成若干個閾值分區(qū),并計算每個閾值分區(qū)的閾值,接著通過量化和熵編碼對每個譜線進(jìn)行編碼,最后形成具有較高壓縮比的MP3文件,并使壓縮后的文件在回放時能夠達(dá)到比較接近原音源的聲音效果。2.1. M

3、p3文件格式       MP3文件以一幀為一個編碼單元,各幀編碼數(shù)據(jù)是獨立的。為了清晰而準(zhǔn)確地描述mp3文件格式,下面采用位流語法描述,這種語法格式與c語言近似,易于理解,且描述清晰。其中粗體表示碼流中的數(shù)據(jù)項,bslbf代表位串,即“Bit string, left bit first ”,uimsbf代表無符號整數(shù),即”unsinged integer, mostsignificant bit first”,數(shù)字表示該數(shù)據(jù)項所占的比特數(shù)。2.1.1.      

4、0; Audio Sequenceaudio sequence()  while (true)         frame()   2.1.2.        Audio Frameframe()       header()       error_check() &

5、#160;     audio_data()       ancillary_data()2.1.3.        Headerheader()      syncword                &#

6、160;                                                 &#

7、160;        12           bslbf      ID                         &#

8、160;                                                 &#

9、160;          1             bslbf      layer                     

10、                                                  

11、           2             bslbf      protection_bit                   &

12、#160;                                               1   

13、;          bslbf      bitrate_index                                

14、60;                                   4             bslbf  &

15、#160;   sampling_frequency                                            

16、             2             bslbf      padding_bit                 

17、0;                                                 

18、0;   1             bslbf      private_bit                           &#

19、160;                                            1      

20、       bslbf      mode                                     &

21、#160;                                           2       

22、;      bslbf      mode_extension                                    &#

23、160;                          2             bslbf      copyright    &#

24、160;                                                 &#

25、160;                    1             bslbf      original/home         

26、0;                                                 

27、0;        1             bslbf      emphasis                       

28、;                                                  

29、;  2             bslbf2.1.4.        Error Checkerror_check() if (protection_bit=0)       crc_check          &#

30、160;                                                 &#

31、160;        16           rpchof2.1.5.        Audio data , Layer IIIaudio_data()      main_data_begin         &

32、#160;                              9             uimsbf      if(mode=s

33、ingle_channel)private_bits                         5             bslbf      else private_bits &

34、#160;                                      3             bsl

35、bf       for(ch=0;ch<nch;ch+)         for(scfsi_band=0;scfsi_band<4;scfsi_band+)          scfsichscfsi_band             

36、0;                   1             bslbf       for(gr=0;gr<2;gr+)         for(ch=0;ch&l

37、t;nch;ch+)          part2_3_lengthgrch                              12        &#

38、160;  uimsbf          big_valuesgrch                                 9     

39、        uimsbf          global_gaingrch                                

40、; 8             uimsbf          scalefac_compressgrch                         &#

41、160; 4             bslbf          window_switching_flaggrch                         1

42、             bslbf           if(window_switching_flaggrch)            block_typegrch          &

43、#160;                     2             bslbf            mixed_block_flaggrch   

44、                         1             uimsbf             for(region=0

45、;region<2;region+)              table_selectgrchregion                             5  &

46、#160;          bslbf             for(window=0;window<3;window+)              subblock_gaingrchwindow      &

47、#160;               3             uimsbf              else       for(region=0;re

48、gion<3;region+)        table_selectgrchregion                                     

49、      5             bslbf      region0_countgrch                        

50、60;             4             bslbf      region1_countgrch                &

51、#160;                                      3            

52、; bslbf             preflaggrch                                   

53、0;                               1             bslbf      scalefa

54、c_scalegrch                                                &

55、#160;      1             bslbf      count1table_selectgrch                      

56、                             1             bslbf       main_data2.1.6.

57、        Main_datamain_data()       for(gr=0;gr<2;gr+)         for(ch=0;ch<nch;ch+)           if(window_switching_flaggrch=1)&&(block_typ

58、egrch=2)             if(mixed_block_flaggrch)               for(sfb=0;sfb<8;sfb+)                scalefac_l

59、grchsfb                                   0.4         uimsbf     

60、          for(sfb=3;sfb<12;sfb+)                 for(window=0;window<3;window+)                  sc

61、alefac_sgrchsfbwindow                0.4         uimsbf              else       for(sfb=0;sfb&l

62、t;12;sfb+)         for(window=0;window<3;window+)          scalefac_sgrchsfbwindow                       &#

63、160;        0.4         uimsbf              else           if(scfsich0=0|(gr=0)       

64、0;      for(sfb=0;sfb<6;sfb+)             scalefac_lgrchsfb                          &#

65、160;          0.4         uimsbf           if(scfsich1=0|(gr=0)              for(sfb=6;sfb<11;sfb+)  &

66、#160;          scalefac_lgrchsfb                                     0.4

67、60;        uimsbf           if(scfsich2=0|(gr=0)              for(sfb=11;sfb<16;sfb+)             scal

68、efac_lgrchsfb                                     0.3         uimsbf  

69、         if(scfsich3=0|(gr=0)              for(sfb=16;sfb<21;sfb+)             scalefac_lgrchsfb        

70、60;                            0.3         uimsbf              Hu

71、ffmancodebits()              for(b=0;b<no_of_ancillary_bits;b+)         ancillary_bit      1     bslbf2.1.7.        H

72、uffmancodebitsHuffmancodebits()       for(l=0;l<big_values*2;l+=2)        hcod|x|y|                         

73、0;                                         0.19       bslbf  

74、;      if(|x|=15&&linbits>0)  linbitsx                                   1.13   

75、;    uimsbf        if(x!=0)signx                                     &

76、#160;                            1             bslbf        if(|y|=15&&

77、amp;linbits>0)  linbitsy                                   1.13       uimsbf  

78、0;     if(y!=0) signy                                           &

79、#160;                  1              bslbf         isl=x         isl+1=y &

80、#160;     for(;l<big_values*2+count1*4;l+=4)        hcod|v|w|x|y|                              &#

81、160;                       1.6         bslbf        if(v!=0) signv        &

82、#160;                                                 &

83、#160;   1             bslbf        if(w!=0) signw                        &#

84、160;                                   1             bslbf  

85、      if(x!=0) signx                                          

86、60;                   1             bslbf        if(y!=0) signy        

87、0;                                                 

88、0;   1             bslbf         isl=v         isl+1=w         isl+2=x         isl+3=y

89、0;             for(;l<576;l+)         isl=02.1.8.        Ancillary dataancillary_data()       if(layer=1|layer=2)    

90、     for(b=0;b<no_of_ancillary_bits;b+)          ancillary_bit                              

91、                                1             bslbf 2.2. 數(shù)據(jù)項的含義2.2.1.  

92、;      HeaderØ       Syncword 同步頭,表示一幀數(shù)據(jù)的開始,共12位,全1即0XFFF。表格 21 LayerLayer '11'Layer I'10'Layer II'01'Layer III'00'reserved 表格 22 Bitrate_index bitrate specified (kBit/s)bitrate_index

93、Layer ILayer IILayer III '0000'freefreefree '0001'323232 '0010'644840 '0011'965648 '0100'1286456 '0101'1608064 '0110'1929680 '0111'22411296 '1000'256128112 '1001'28816012

94、8 '1010'320192160 '1011'352224192 '1100'384256224 '1101'416320256 '1110'448384320 '1111'forbiddenforbiddenforbidden  Ø       ID 算法標(biāo)識位,“1”表示MPEG音頻,“0”保留。Ø  &#

95、160;    Layer 用來說明是哪一層編碼,如表格 21 Layer所示。Ø       Protection_bit 用來表明冗余信息是否被加到音頻流中,以進(jìn)行錯誤檢測和錯誤隱蔽。“1”表示未增加,“0”表示增加。Ø       Bitrate_index用來指示該幀的bitrate,如表格 22 Bitrate_index所示。Ø    

96、   Sampling_frequency用來指示采樣頻率,如表格 23 Sampling_frequency所示。表格 23 Sampling_frequencysampling_frequencyfrequency specified (kHz)'00'44.1'01'48'10'32'11'reserved Ø       Padding_bit如果該位為1,那么幀中包含一個額外槽,用于把平均位率調(diào)節(jié)到采樣

97、頻率,否則該位必須為0。在采樣頻率為44.1kHz時,填補是必要的,在自由格式中也可能需要填補。Ø       Private_bit留做私用,沒有定義。Ø       Mode定義通道模式,如表格 24  Mode所示。 表格 24  Modemodemode specified'00'stereo'01'joint_stereo (intensity_stereo and

98、/or ms_stereo) '10'dual_channel'11'single_channel  Ø       Mode_extension用來標(biāo)識采用了哪一種joint_stereo,具體對應(yīng)的頻帶范圍隱含在算法中,如表格 25  Mode_extension所示。表格 25  Mode_extensionmode_extension '00'subbands  4-31 in intensity_stereo

99、, bound=4'01'subbands  8-31 in intensity_stereo, bound=8'10'subbands 12-31 in intensity_stereo, bound=12'11'subbands 16-31 in intensity_stereo, bound=16 Ø       Copyright表明版權(quán)用,“1”表示有版權(quán),“0”表示沒有版權(quán)。Original/copy :表明原版還是復(fù)制,“1”表示原版

100、,“0”表示復(fù)制。Emphasis :表明加重音類型,如表格 26  Emphasis所示。表格 26  Emphasisemphasisemphasis specified'00'none'01'50/15 microseconds'10'reserved'11'CCITT J.17 2.2.2.        Error Check       CRC校驗的基

101、本思想是利用線性編碼理論,在發(fā)送端根據(jù)要傳送的k 位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個校驗用的監(jiān)督碼(既CRC 碼)r 位,并附在信息后邊,構(gòu)成一個新的二進(jìn)制碼序列數(shù)共(k+r)位,最后發(fā)送出去。在接收端,則根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進(jìn)行檢驗,以確定傳送中是否出錯。在MP3協(xié)議中采用了CRC-16生成CRC碼,其生成多項式如下:2.2.3.        Side information       Sideinformation 指的是在aud

102、io_data中main_data之前的一部分信息。這部分提供了解碼中一些輔助的信息,用來幫助整個解碼過程。為了幫助理解這一部分?jǐn)?shù)據(jù)項的含義,會在下面大致闡述mp3解碼所用的基本概念。Ø       Main_data_begin       表示一幀數(shù)據(jù)main data的開始位置。它表示main data相對于該幀同步頭的負(fù)偏移。這里涉及到一個bit reservoir的技術(shù),它改變了每幀的可用比特數(shù)為常數(shù)的限制,而是圍繞一個長時間的平均值(目標(biāo)比特率

103、)變化。因為MP3的編碼方式是采用Huffman編碼,所以編碼后每一幀的數(shù)據(jù)長度是不一樣的,可能有的大于目標(biāo)比特率為每一幀分配的空間,有的可能小于這個空間,所以為了增加空間利用率,當(dāng)前幀未使用完的空間可以保存起來留給后面需要的幀使用,因此每一幀的main data開始位置可能在它的header和sideinformation之前,而main_data_begin就是用來指示這個開始位置的,這種技術(shù)就叫做bit reservoir。Ø       Private_bits留做私用。Ø  

104、     Scfsi、scalefac_compress參考2.3.4 縮放因子(scalefactor)Ø       Part_2_3_length表示main data中scalefactor和huffman數(shù)據(jù)所占用的比特數(shù)。Ø       Global_gain全局量化步長。Ø       Wind

105、ow_switching_flag、block_type和mixed_block_flag參考2.3.5 節(jié)的長短塊切換Ø       Table_select、big_values、count1_table_select、region0_count和region1_count參考2.3.2 Huffman碼表的選擇Ø       Subblock_gain短窗塊量化時所用的增益偏移量。Ø   &

106、#160;   Preflag和scalefac_scale在反量化過程中對壓縮數(shù)據(jù)還原時用到的變量。2.3. Mp3解碼算法所用的基本概念2.3.1.        子帶和縮放因子頻帶       壓縮之后的mp3數(shù)據(jù)是以一楨為單位的,每一楨分為兩節(jié)(granule),這兩節(jié)在編解碼時相對獨立,從每一節(jié)中可以解碼出576個pcm數(shù)據(jù),兩節(jié)可解出1152個pcm數(shù)據(jù)。從二進(jìn)制101碼流中得到我們所需要的信息的第一步就是huff

107、man解碼,huffuman編碼信息存放在每一節(jié)中的Huffmancodebits( )中,通過huffman解碼可以得到576個值,這576個值在不同節(jié)類型(參考2.3.5 節(jié)的長短塊切換)下有不同的含義,下面分情況描述: u     該節(jié)為長塊       這576個值代表576條頻率線上的值,它們是時域中576個pcm值經(jīng)過時頻變換的結(jié)果。這576條頻率線從低到高分為32個子帶,每個子帶包含18條頻率線。解出來的這576個值是整數(shù),需要進(jìn)行反量化變成浮點數(shù),反量化的過程

108、并不是一條頻率線為單位進(jìn)行的,而是若干條頻率線為單位進(jìn)行的,這若干條頻率線組成了頻帶(band),叫做縮放因子頻帶(scalefactorband),顧名思義,在一個縮放因子頻帶內(nèi)的頻率線在反量化時共用縮放因子。在44.1khz的采樣率下,縮放因子頻帶的劃分如所示:表格 27  長塊的縮放因子頻帶劃分scalefactor bandwidth of bandindex of startindex of end04031447248113412154416195420236624297630358836439844511010526111126273121674891320901091

109、424110133152813416116341621951742196237185023828719542883412076342417              其中,頻率線418至575不需要歸屬于某一個scalefactor band, 因為屬于這一個頻帶的頻率線在進(jìn)行反量化時,系統(tǒng)提供默認(rèn)的反量化因子。 u     該節(jié)為短塊       這576

110、個值代表192條頻率線上的值,這192條頻率線從低到高分為32個子帶,每個子帶包含6條頻率線。每一條頻率線上有三個值,分別屬于三個窗(window0、window1和window2)。這192條頻率線被劃分為若干縮放因子頻帶,在44.1khz情況下,劃分方式如下:表格 28  短塊的縮放因子頻帶劃分scalefactor bandwidth of band index of startindex of end040314472481134121546162158222961030397124051814526591866831022841051130106135  

111、;            其中,頻率線136至192不需要歸屬于某一個scalefactor band, 因為屬于這一個頻帶的頻率線在進(jìn)行反量化時,系統(tǒng)提供默認(rèn)的反量化因子。按先后順序解出來的這576個值先是按縮放因子頻帶從低到高排列,在每一個縮放因子頻帶內(nèi),按window0,window1,window2排列,在每一個window中,頻率線從低到高排列。 u     該節(jié)是混合塊    

112、0;  在這種情況下,按先后順序解出來的576個值分為兩部分,第一部分(前36個值)是長塊部分,故它們代表36條頻率線,這36條頻率線(參考表格 27  長塊的縮放因子頻帶劃分)劃分為8個縮放因子頻帶;第二部分(后540個值)是短塊部分,它們代表180個頻率線,每個頻率線上有三個值,分別屬于window0、window1和window2,這180個頻率線(參考表格 28  短塊的縮放因子頻帶劃分)劃分為9個縮放因子頻帶(scalefactorband3àscalefactor band11)。     &

113、#160; 綜合上述三種情況,這576值排列方式如下所示:圖 21不同情況下huffman解碼得到的576個值的含義2.3.2.        Huffman碼表的選擇       從Huffmancodebits( )中解碼得到576個值的過程不是一個簡單的查表過程,這涉及到換表的過程。在解碼時,當(dāng)從一個縮放因子頻帶過渡到另一個縮放因子頻帶時,huffman碼表可能需要改變。Huffman解碼得到的576個值分為三個部分,如下所示:圖 22 

114、bigvalues和count1的含義        在大值區(qū)(xxx),得到的值較大,一共有bigvalues*2個值,每兩個值一起編碼;在小值區(qū)(-),值只能為-1,0,+1,一共有count1*4個值,每四個值一起編碼;在零值區(qū)(000)值為零,不需要編碼。       在不同區(qū)域編碼時,用到的huffman表是不一樣的。 u     在大值區(qū)編碼時,為了進(jìn)一步提高編碼效率,大值區(qū)又分為三個區(qū)域:re

115、gion0、region1和region2,在不同區(qū)域用不同的huffman表編碼。region的劃分是以縮放因子頻帶為單位劃分的。在side information中,region0_countgrch和region1_countgrch提供了劃分信息。region0_count+1表示在region0區(qū)的縮放因子頻帶的個數(shù),region1_count+1表示在region1區(qū)的縮放因子頻帶的個數(shù)。需要說明的是,如果是短塊或者混合塊中的短塊部分,一個縮放因子頻帶被計數(shù)三次,例如,對于短塊來說,region0_count為8意味著region1從scalefactor band 3開始。Reg

116、ion2區(qū)的長度在side information中并沒有給出,但是根據(jù)big_valuesgrch、region0_count和region1_count可以計算出來。在得到大值區(qū)region的劃分之后,就可以根據(jù)table_selectgrchregion來選擇在每個區(qū)域所用的huffman碼表,一共有32個huffman碼表可供選擇,在mp3官方協(xié)議錯誤!未找到引用源。AnnexB Table 3-B.7中給出了這32個表。 u     在小值區(qū),所用huffman表的選擇信息由count1table_selectgrch提供。

117、需要說明的是,小值區(qū)的長度是count1*4,雖然在side information中并沒有count1,但解碼程序知道在耗盡part2_3_lengthgrch長度的碼流之后就可以判斷已經(jīng)達(dá)到了小值區(qū)的末尾。        2.3.3.        huffman碼表的特點       大值區(qū)的huffuman表一個入口項可得到兩個值,小值區(qū)的huffman表一個入口項可得到四個值。

118、大值區(qū)的huffman表有一個參數(shù)為linbits(見2.1.7)。當(dāng)linbit為0時,該huffman表只能用來編碼小于等于15的數(shù)。當(dāng)linbit不為0時,該huffman表可用來編碼值大于15的數(shù),當(dāng)用這樣的huffman碼表編碼時,在hcod|x|y|之后的碼流中有l(wèi)inbit位,這長度為linbit的位串表示無符號整數(shù),它與x(或者y)相加后表示x(或者y)真正的編碼值。 2.3.4.        縮放因子(scalefactor)     

119、  如前所述,一個縮放因子頻帶內(nèi)的頻率線在反量化時共用縮放因子,在碼流中,縮放因子被編碼于main_data中(見2.1.6)。要解碼得到縮放因子,首先需要知道該縮放因子所占的比特數(shù),在side information中scale_compressgrch提供了這樣的信息,首先需要查找如下表格:表格 29  scale_compressscale_compressslen1slen2000101202303430511612713821922102311311232133314421543       

120、下面針對不同的節(jié)(塊)類型說明slen1和slen2的含義。 u     該節(jié)為長塊slen1表示縮放因子頻帶0到10所用縮放因子的長度;slen2表示縮放因子頻帶11到20所用縮放因子的長度。 u     該節(jié)為短塊slen1表示縮放因子頻帶0到5所用縮放因子的長度;slen2表示縮放因子頻帶6到11所用縮放因子的長度。 u     該節(jié)為混合塊在這種情況下,長塊部分(sfb0到sfb7)和短塊部分(sfb3到sf

121、b5)所用的縮放因子的長度相同,為slen1;短塊部分(sfb6到sfb11)所用的縮放因子長度相同,為slen2。 為了進(jìn)一步地減少mp3碼流的大小,節(jié)1(granule1)有時會共用節(jié)0(granule 0)的縮放因子信息,是否共用由字段scfsiscfsi_band來決定,如下所示:表格 210  scfsiscfsiscfsi_band 0scalefactors are transmitted for each granule1scalefactors transmitted for granule 0 are also valid for granul

122、e 1 表格 211  scfsi_bandscfsi_bandscalefactor bands (see Annex B,Table3-B.8)00,1,2,3,4,516,7,8,9,102111531620        只有g(shù)ranule1的長塊才可以共用前一節(jié)的縮放因子信息,對于短塊來說,scfsi為0。知道縮放因子的共用就不難理解在2.1.6(Main_data)中位流的組織形式。 2.3.5.       &#

123、160;節(jié)的長短塊切換       節(jié)的類型由block_type來定義,如果window_switching_flag未置位,那么block_type的值為0。如果window_switching_flag置位,那么block_type由字段block_typegrch給出,如下所示:表格 212  block_typeblock_typegr 0reserved 1start block23 short windows3end block      

124、當(dāng)block_type為0、1、3時,該節(jié)屬于長塊。當(dāng)block_type為2時,如果mixed_block_flaggrch為0,則該節(jié)為短塊;mixed_block_flaggrch為1,則該節(jié)為混合塊。長塊和短塊在解碼時算法有較大區(qū)別。 2.4. mp3解碼具體流程       MP3解碼的流程如下所示,解碼的主要過程包括Preprocessing、Huffman decoding、Requantization、Reordering、Stereo decoding、Alias reduction、IMDCT、Frequ

125、ency inversion、Synthesis filter bank,最后輸出原始的PCM數(shù)據(jù)。圖 23  解碼流程圖2.4.1.        預(yù)處理(Preprocessing)       這個步驟主要是完成Header和Side information的解碼,得到后面解碼所需要的一些信息,并保存起來。2.4.2.        Huffman decodi

126、ng       在2.3.1(子帶和縮放因子頻帶)和2.3.2(Huffman碼表的選擇)中已經(jīng)詳細(xì)介紹了,在這里就不再重敘。2.4.3.        反量化(Requantization)       經(jīng)過Huffman解碼之后的值必須經(jīng)過反量化的處理,反量化過程根據(jù)使用的windows使用不同的反量化運算公式,其反量化的公式如下: u     短塊:公式 21u   &

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論