PCM,YUV數(shù)據(jù)詳解和常用算法

全文一覽

一 PCM
基本概念:聲道,通道,采樣率,采樣位數(shù),位速/比特率/碼率,存儲(chǔ)方式,字節(jié)序
算法
(1)分離PCM16LE雙聲道音頻采樣數(shù)據(jù)的左聲道和右聲道
(2)將PCM16LE雙聲道音頻采樣數(shù)據(jù)的聲音速度提高一倍
(3)將PCM16LE雙聲道音頻采樣數(shù)據(jù)轉(zhuǎn)換為PCM8音頻采樣數(shù)據(jù)

二 YUV
和RGB轉(zhuǎn)換公式,位深度,存儲(chǔ)方式
算法
(1)分離YUV420P像素?cái)?shù)據(jù)中的Y、U、V分量
(2)YUV420P像素?cái)?shù)據(jù)的亮度減半
(3) 將YUV420P像素?cái)?shù)據(jù)的周圍加上邊框
(4) 計(jì)算兩個(gè)YUV420P像素?cái)?shù)據(jù)的PSNR

三 為什么要學(xué)習(xí)音視頻?

四 參考資料

一 PCM

??PCM(Pulse Code Modulation)也被稱為脈沖編碼調(diào)制,未經(jīng)壓縮的音頻采樣數(shù)據(jù)裸流,它是由模擬信號(hào)經(jīng)過采樣、量化、編碼轉(zhuǎn)換成的標(biāo)準(zhǔn)的數(shù)字音頻數(shù)據(jù)。

聲道

??單聲道,雙聲道,多聲道

通道

??常用:揚(yáng)聲器,有線耳機(jī),聽筒,藍(lán)牙耳機(jī)

采樣率

??單位Hz,即一秒鐘內(nèi),我們可以把聲音分成多少段,采樣越頻繁意味著越能夠完美的還原采集的聲音,采樣頻率一般共分為11025Hz、22050Hz、24000Hz、44100Hz、48000Hz五個(gè)等級(jí),人耳能夠感覺到的頻率為20Hz到 20000Hz,為了復(fù)原波形,一次振動(dòng)中,必須有2個(gè)點(diǎn)的采樣

??因此要滿足人耳的聽覺要求,則需要每秒進(jìn)行40k次采樣,用40kHz

采樣位數(shù)
??采樣就是能播放的最小音頻片段聲音的數(shù)字表達(dá)范圍,用于實(shí)現(xiàn)數(shù)據(jù)的精準(zhǔn)還原,通常采樣位分8位字節(jié),和16字節(jié),即在采集音頻的某一個(gè)數(shù)據(jù)時(shí),我們需要一個(gè)數(shù)字來表達(dá)這個(gè)聲音的高低,音調(diào)等,8位字節(jié)能表達(dá)的最大數(shù)字就是255,即能夠把我們聽到的一串聲音,能夠切成256份,在計(jì)算機(jī)中存儲(chǔ)表達(dá)是0-255,最基本的聲音是七種,所以8位基本上能夠模擬出我們聽到所有聲音,還有16位采樣,可以把聲音分成65536份,在計(jì)算及中存儲(chǔ)的表達(dá)是-32768到32767,所以較8位來說能夠更加精細(xì)的表達(dá)聲音,當(dāng)然也意味著音頻文件也增大一倍。

位速/比特率/碼率
??三者表達(dá)的都是同一種意思,kbps,即千比特率,千比特就是1000個(gè)byte,單位byte,是儲(chǔ)存容量的基本單位,常用的存儲(chǔ)單位有:bit、B、KB、MB、GB、TB、PB...。
??比特率這個(gè)參數(shù)我們往往手機(jī)上都能看到,就是我們當(dāng)前的手機(jī)網(wǎng)速,不過一般單位寫成了b/s,k/s或者m/s,反映的是數(shù)據(jù)的傳輸速度。如果用在了音視頻文件上,則是一秒中需要傳輸多大的數(shù)據(jù)量。
??比特率 = 采樣率 x 采樣位數(shù) x 通道

存儲(chǔ)方式

??可以看到如果是雙聲道,數(shù)據(jù)是左右,左右依次存儲(chǔ)

??mac上的Hex Friends可以查看pcm文件數(shù)據(jù),如下為雙聲道立體聲音頻文件數(shù)據(jù)(16進(jìn)制)

字節(jié)序

??表示音頻PCM數(shù)據(jù)存儲(chǔ)的方式,分為大端存儲(chǔ)(big-endian)還是小端存儲(chǔ)(little-endian),不同平臺(tái)存儲(chǔ)方式有區(qū)別,通過下圖演示

??上圖是PCM16LE的音頻存儲(chǔ)數(shù)據(jù),從上面看剛開始的4個(gè)字節(jié)是同一個(gè)采樣點(diǎn),其中0x04e8是左聲道,0x01c9是右聲道,這就是小端排序的特點(diǎn),整體是內(nèi)存地址從低往高,但是每個(gè)數(shù)據(jù)中的前后順序是相反的。

提問:
【例1】請(qǐng)計(jì)算對(duì)于5分鐘雙聲道、16位采樣位數(shù)、44.1kHz采樣頻率聲音的不壓縮數(shù)據(jù)量是多少?
??根據(jù)公式:數(shù)據(jù)量=(采樣頻率×采樣位數(shù)×聲道數(shù)×?xí)r間)/8
得,數(shù)據(jù)量(MB)=[44.1×1000×16×2×(5×60)] /(8×1024×1024)=50.47MB
??計(jì)算時(shí)要注意幾個(gè)單位的換算細(xì)節(jié):
??時(shí)間單位換算:1分=60秒
??采樣頻率單位換算:1kHz=1000Hz
??數(shù)據(jù)量單位換算:1MB=1024×1024=1048576B

【例2】請(qǐng)計(jì)算對(duì)于雙聲道立體聲、采樣頻率為44.1kHz、采樣位數(shù)為16位的激光唱盤(CD-A),用一個(gè)650MB的CD-ROM可存放多長(zhǎng)時(shí)間的音樂?
??已知音頻文件大小的計(jì)算公式如下:
??文件的字節(jié)數(shù)/每秒=采樣頻率(Hz)X采樣位數(shù)(位)X聲道數(shù)/8
??根據(jù)上面的公式計(jì)算一秒鐘時(shí)間內(nèi)的不壓縮數(shù)據(jù)量:(44.1×1000×16×2)/8=0.168MB/s
??那么,一個(gè)650MB的CD-ROM可存放的時(shí)間為:(650/0.168)/(60×60)=1.07小時(shí)。

常見音頻處理算法
(1)分離PCM16LE雙聲道音頻采樣數(shù)據(jù)的左聲道和右聲道

int simplest_pcm16le_split(char *url){
    FILE *fp=fopen(url,"rb+");
    FILE *fp1=fopen("output_l.pcm","wb+");
    FILE *fp2=fopen("output_r.pcm","wb+");
 
    unsigned char *sample=(unsigned char *)malloc(4);
    while(!feof(fp)){
        fread(sample,1,4,fp);
        //L
        fwrite(sample,1,2,fp1);
        //R
        fwrite(sample+2,1,2,fp2);
    }
    free(sample);
    fclose(fp);
    fclose(fp1);
    fclose(fp2);
    return 0;
}

??算法分析:PCM16LE雙聲道數(shù)據(jù)中左聲道和右聲道的采樣值是間隔存儲(chǔ)的。每個(gè)采樣值占用2Byte空間。代碼運(yùn)行后,會(huì)把NocturneNo2inEflat_44.1k_s16le.pcm的PCM16LE格式的數(shù)據(jù)分離為兩個(gè)單聲道數(shù)據(jù)

(2)將PCM16LE雙聲道音頻采樣數(shù)據(jù)的聲音速度提高一倍

int simplest_pcm16le_doublespeed(char *url){
    FILE *fp=fopen(url,"rb+");
    FILE *fp1=fopen("output_doublespeed.pcm","wb+");
    int cnt=0;
    unsigned char *sample=(unsigned char *)malloc(4);
    while(!feof(fp)){
        fread(sample,1,4,fp);
        if(cnt%2!=0){
            //L
            fwrite(sample,1,2,fp1);
            //R
            fwrite(sample+2,1,2,fp1);
        }
        cnt++;
    }
    printf("Sample Cnt:%d\n",cnt);
    free(sample);
    fclose(fp);
    fclose(fp1);
    return 0;
}

??算法分析:只采樣了每個(gè)聲道奇數(shù)點(diǎn)的樣值。處理完成后,原本22秒左右的音頻變成了11秒左右。音頻的播放速度提高了2倍,音頻的音調(diào)也變高了很多

(3)將PCM16LE雙聲道音頻采樣數(shù)據(jù)轉(zhuǎn)換為PCM8音頻采樣數(shù)據(jù)

int simplest_pcm16le_to_pcm8(char *url){
    FILE *fp=fopen(url,"rb+");
    FILE *fp1=fopen("output_8.pcm","wb+");
    int cnt=0;
    unsigned char *sample=(unsigned char *)malloc(4);
    while(!feof(fp)){
        short *samplenum16=NULL;
        char samplenum8=0;
        unsigned char samplenum8_u=0;
        fread(sample,1,4,fp);
        //(-32768-32767)
        samplenum16=(short *)sample;
        samplenum8=(*samplenum16)>>8;
        //(0-255)
        samplenum8_u=samplenum8+128;
        //L
        fwrite(&samplenum8_u,1,1,fp1);
        samplenum16=(short *)(sample+2);
        samplenum8=(*samplenum16)>>8;
        samplenum8_u=samplenum8+128;
        //R
        fwrite(&samplenum8_u,1,1,fp1);
        cnt++;
    }
    printf("Sample Cnt:%d\n",cnt);
    free(sample);
    fclose(fp);
    fclose(fp1);
    return 0;
}

??算法分析:PCM16LE格式的采樣數(shù)據(jù)的取值范圍是-32768到32767,而PCM8格式的采樣數(shù)據(jù)的取值范圍是0到255。所以PCM16LE轉(zhuǎn)換到PCM8需要經(jīng)過兩個(gè)步驟:第一步是將-32768到32767的16bit有符號(hào)數(shù)值轉(zhuǎn)換為-128到127的8bit有符號(hào)數(shù)值,第二步是將-128到127的8bit有符號(hào)數(shù)值轉(zhuǎn)換為0到255的8bit無符號(hào)數(shù)值。在本程序中,16bit采樣數(shù)據(jù)是通過short類型變量存儲(chǔ)的,而8bit采樣數(shù)據(jù)是通過unsigned char類型存儲(chǔ)的。

二 YUV

??YUV 是一種彩色編碼系統(tǒng),主要用在視頻、圖形處理流水線中(pipeline)。相對(duì)于 RGB 顏色空間,設(shè)計(jì) YUV 的目的就是為了編碼、傳輸?shù)姆奖悖瑴p少帶寬占用和信息出錯(cuò)。它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設(shè)計(jì)很好地解決了彩色電視機(jī)與黑白電視的兼容問題。并且,YUV不像RGB那樣要求三個(gè)獨(dú)立的視頻信號(hào)同時(shí)傳輸,所以用YUV方式傳送占用極少的頻寬。

和RGB轉(zhuǎn)換公式

Y = 0.298R + 0.612G + 0.117B;
U = -0.168R - 0.330G + 0.498B + 128;
V = 0.449R - 0.435G - 0.083B + 128;

R = Y + 1.4075( V - 128);
G = Y - 0.3455( U - 128) - 0.7169( V - 128);
B = Y + 1.779( U - 128);

位深度

??黑白二色的圖像是數(shù)字圖像中最簡(jiǎn)單的一種,它只有黑、白兩種顏色,也就是說它的每個(gè)像素只有1位顏色,位深度是1,用2的一次冪來表示;考慮到位深度平均分給R, G, B和Alpha,而只有RGB可以相互組合成顏色。所以4位顏色的圖,它的位深度是4,只有2的4次冪種顏色,即16種顏色或16種灰度等級(jí) ) 。8位顏色的圖,位深度就是8,用2的8次冪表示,它含有256種顏色 ( 或256種灰度等級(jí) )。24位顏色可稱之為真彩色,位深度是24,它能組合成2的24次冪種顏色,即:16777216種顏色 ( 或稱千萬種顏色 ),超過了人眼能夠分辨的顏色數(shù)量。當(dāng)我們用24位來記錄顏色時(shí),實(shí)際上是以2^(8×3),即紅、綠、藍(lán) ( RGB ) 三基色各以2的8次冪,256種顏色而存在的,三色組合就形成一千六百萬種顏色。

存儲(chǔ)方式

??在生理學(xué)中,有一條規(guī)律,那就是人類視網(wǎng)膜上的視網(wǎng)膜桿細(xì)胞要多于視網(wǎng)膜錐細(xì)胞,說得通俗一些,視網(wǎng)膜桿細(xì)胞的作用就是識(shí)別亮度,而視網(wǎng)膜錐細(xì)胞的作用就是識(shí)別色度。所以,你的眼睛對(duì)于亮和暗的分辨要比對(duì)顏色的分辨精細(xì)一些。

??YUV碼流的存儲(chǔ)格式其實(shí)與其采樣的方式密切相關(guān),主流的采樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0,存儲(chǔ)方式分倆種:平面格式(planar)和壓縮格式(packed)。

??planar格式:先連續(xù)存儲(chǔ)所有像素點(diǎn)的Y,緊接著存儲(chǔ)所有像素點(diǎn)的U,隨后是所有像素點(diǎn)的V。

??packed格式:每個(gè)像素點(diǎn)的Y,U,V是連續(xù)交*存儲(chǔ)的。

??用三個(gè)圖來直觀地表示采集的方式吧,以黑點(diǎn)表示采樣該像素點(diǎn)的Y分量,以空心圓圈表示采用該像素點(diǎn)的UV分量。


??YUV 4:4:4采樣,每一個(gè)Y對(duì)應(yīng)一組UV分量。
??YUV 4:2:2采樣,每?jī)蓚€(gè)Y共用一組UV分量。
??YUV 4:2:0采樣,每四個(gè)Y共用一組UV分量。
??Cb、Cr的含義等同于U、V。

因?yàn)閅UV420比較常用, 在這里就重點(diǎn)介紹YUV420。YUV420細(xì)分為兩類:YUV420p和YUV420sp,具體排列方式又可分以下四種。

I420: YYYYYYYY UU VV    =>YUV420P
YV12: YYYYYYYY VV UU    =>YUV420P
NV12: YYYYYYYY UVUV     =>YUV420SP
NV21: YYYYYYYY VUVU     =>YUV420SP

I420如下



NV12如下


提問:

【例1】根據(jù)前面的介紹,如果用 yuv420p 來表示分辨率為 1280 * 720 的圖片,位深度為8,需要占用多少存儲(chǔ)空間呢?

??每一個(gè)像素都需要一個(gè)y值。那么總共需要 1280 * 720 = 921600 bytes ; 每四個(gè)像素需要一個(gè)u 值,那么總共需要 1280 * 720 / 4 = 230400 bytes ; 每四個(gè)像素需要一個(gè)v 值,那么總共需要 1280 * 720 / 4 = 230400 bytes。
??把 y、u、v 三個(gè) plane 加起來就是:921600 + 230400 + 230400 = 1382400 bytes。

常見算法

(1)分離YUV420P像素?cái)?shù)據(jù)中的Y、U、V分量

int simplest_yuv420_split(char *url, int w, int h,int num){
FILE *fp=fopen(url,"rb+");
FILE *fp1=fopen("output_420_y.y","wb+");
FILE *fp2=fopen("output_420_u.y","wb+");
FILE *fp3=fopen("output_420_v.y","wb+");
unsigned char *pic=(unsigned char *)malloc(w*h*3/2);
for(int i=0;i<num;i++){
fread(pic,1,w*h*3/2,fp);
//Y
fwrite(pic,1,w*h,fp1);
//U
fwrite(pic+w*h,1,w*h/4,fp2);
//V
fwrite(pic+w*h*5/4,1,w*h/4,fp3);
}
free(pic);
fclose(fp);
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}

調(diào)用方式:

simplest_yuv420_split("lena_256x256_yuv420p.yuv",256,256,1);

原圖

YUV單獨(dú)存儲(chǔ)分量的三張圖片

??算法分析:如果視頻幀的寬和高分別為w和h,那么一幀YUV420P像素?cái)?shù)據(jù)一共占用wh3/2 Byte的數(shù)據(jù)。其中前wh Byte存儲(chǔ)Y,接著的wh1/4 Byte存儲(chǔ)U,最后wh*1/4 Byte存儲(chǔ)V。上述調(diào)用函數(shù)的代碼運(yùn)行后,將會(huì)把一張分辨率為256x256的名稱為lena_256x256_yuv420p.yuv的YUV420P格式的像素?cái)?shù)據(jù)文件分離成為三個(gè)文件

output_420_y.y:純Y數(shù)據(jù),分辨率為256x256。
output_420_u.y:純U數(shù)據(jù),分辨率為128x128。
output_420_v.y:純V數(shù)據(jù),分辨率為128x128。

(2)YUV420P像素?cái)?shù)據(jù)的亮度減半

int simplest_yuv420_halfy(char *url, int w, int h,int num){
FILE *fp=fopen(url,"rb+");
FILE *fp1=fopen("output_half.yuv","wb+");
unsigned char *pic=(unsigned char *)malloc(w*h*3/2);
for(int i=0;i<num;i++){
fread(pic,1,w*h*3/2,fp);
//Half
for(int j=0;j<w*h;j++){
unsigned char temp=pic[j]/2;
//printf("%d,\n",temp);
pic[j]=temp;
}
fwrite(pic,1,w*h*3/2,fp1);
}
free(pic);
fclose(fp);
fclose(fp1);
return 0;
}

調(diào)用方式:

simplest_yuv420_halfy("lena_256x256_yuv420p.yuv",256,256,1);

原圖



處理后



??算法分析:如果打算將圖像的亮度減半,只要將圖像的每個(gè)像素的Y值取出來分別進(jìn)行除以2的工作就可以了。圖像的每個(gè)Y值占用1 Byte,取值范圍是0至255,對(duì)應(yīng)C語言中的unsigned char數(shù)據(jù)類型。上述調(diào)用函數(shù)的代碼運(yùn)行后,將會(huì)把一張分辨率為256x256的名稱為lena_256x256_yuv420p.yuv的YUV420P格式的像素?cái)?shù)據(jù)文件處理成名稱為output_half.yuv的YUV420P格式的像素?cái)?shù)據(jù)文件。

(3) 將YUV420P像素?cái)?shù)據(jù)的周圍加上邊框

int simplest_yuv420_border(char *url, int w, int h,int border,int num){
FILE *fp=fopen(url,"rb+");
FILE *fp1=fopen("output_border.yuv","wb+");
unsigned char *pic=(unsigned char *)malloc(w*h*3/2);
for(int i=0;i<num;i++){
fread(pic,1,w*h*3/2,fp);
//Y
for(int j=0;j<h;j++){
for(int k=0;k<w;k++){
if(k<border||k>(w-border)||j<border||j>(h-border)){
pic[j*w+k]=255;
//pic[j*w+k]=0;
}
}
}
fwrite(pic,1,w*h*3/2,fp1);
}
free(pic);
fclose(fp);
fclose(fp1);
return 0;
}

調(diào)用方式:

simplest_yuv420_border("lena_256x256_yuv420p.yuv",256,256,20,1);

原圖



處理后



??算法分析:圖像的邊框的寬度為border,本程序?qū)⒕嚯x圖像邊緣border范圍內(nèi)的像素的亮度分量Y的取值設(shè)置成了亮度最大值255。上述調(diào)用函數(shù)的代碼運(yùn)行后,將會(huì)把一張分辨率為256x256的名稱為lena_256x256_yuv420p.yuv的YUV420P格式的像素?cái)?shù)據(jù)文件處理成名稱為output_border.yuv的YUV420P格式的像素?cái)?shù)據(jù)文件。

(4)計(jì)算兩個(gè)YUV420P像素?cái)?shù)據(jù)的PSNR
??PSNR是最基本的視頻質(zhì)量評(píng)價(jià)方法。本程序中的函數(shù)可以對(duì)比兩張YUV圖片中亮度分量Y的PSNR。

int simplest_yuv420_psnr(char *url1,char *url2,int w,int h,int num){
    FILE *fp1=fopen(url1,"rb+");
    FILE *fp2=fopen(url2,"rb+");
    unsigned char *pic1=(unsigned char *)malloc(w*h);
    unsigned char *pic2=(unsigned char *)malloc(w*h);
    for(int i=0;i<num;i++){
        fread(pic1,1,w*h,fp1);
        fread(pic2,1,w*h,fp2);
        double mse_sum=0,mse=0,psnr=0;
        for(int j=0;j<w*h;j++){
            mse_sum+=pow((double)(pic1[j]-pic2[j]),2);
        }
        mse=mse_sum/(w*h);
        psnr=10*log10(255.0*255.0/mse);
        printf("%5.3f\n",psnr);
        fseek(fp1,w*h/2,SEEK_CUR);
        fseek(fp2,w*h/2,SEEK_CUR);
    }
    free(pic1);
    free(pic2);
    fclose(fp1);
    fclose(fp2);
    return 0;
}

調(diào)用方式:

simplest_yuv420_psnr("lena_256x256_yuv420p.yuv","lena_distort_256x256_yuv420p.yuv",256,256,1);

算法分析:對(duì)于8bit量化的像素?cái)?shù)據(jù)來說,PSNR的計(jì)算公式如下所示。


上述公式中mse的計(jì)算公式如下所示。

??其中M,N分別為圖像的寬高,xij和yij分別為兩張圖像的每一個(gè)像素值。PSNR通常用于質(zhì)量評(píng)價(jià),就是計(jì)算受損圖像與原始圖像之間的差別,以此來評(píng)價(jià)受損圖像的質(zhì)量。本程序輸入的兩張圖像的對(duì)比圖如下圖所示。其中左邊的圖像為原始圖像,右邊的圖像為受損圖像。

??經(jīng)過程序計(jì)算后得到的PSNR取值為26.693。PSNR取值通常情況下都在20-50的范圍內(nèi),取值越高,代表兩張圖像越接近,反映出受損圖像質(zhì)量越好。

三 為什么要學(xué)習(xí)音視頻?

音視頻作為技術(shù)知識(shí)點(diǎn),有以下幾大優(yōu)勢(shì)

門檻高
??學(xué)習(xí)音視頻的同學(xué)想必都遇到找資料難的問題,國(guó)內(nèi)的研究缺乏,國(guó)外的資料又看不懂,導(dǎo)致出現(xiàn)要么是音視頻新手,要么是音視頻大神,很難尋找到循序漸進(jìn)的資料,導(dǎo)致很多學(xué)習(xí)的同學(xué)望而止步,同樣的,別人做不到的你做到才是核心競(jìng)爭(zhēng)力。

廣度,深度
??音視頻設(shè)計(jì)幾乎涉及到了我們生活的方方面面,小到拍照錄像,大到短視頻的應(yīng)用,可以說學(xué)好了音視頻,不愁就業(yè),另說深度,無論是安卓,IOS,window等,都提供了簡(jiǎn)單的API調(diào)用,屬于淺層,你不會(huì),依然可以完成簡(jiǎn)單的功能,再深層,如H.264,H.265算法的研究,ffmpeg的熟悉,學(xué)無止境。

跨平臺(tái)
??不同于其他的知識(shí)點(diǎn),音視頻的知識(shí)適用于任何具有播放功能的設(shè)備,無論是安卓,IOS等,音視頻知識(shí)都是相同的,寫好一套兼容性的SDK,就可以給很多平臺(tái)使用,突破了平臺(tái)限制。

四 參考資料
https://blog.csdn.net/leixiaohua1020/article/details/50534150
https://blog.csdn.net/leixiaohua1020/article/details/50534316
https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容