视音频数据存储基本知识整理

    xiaoxiao2021-03-25  44

    一、视频(图像)

        1、颜色分量

        原始视频信源采集后的数据为RGB格式,每一帧图像都分成红、绿、蓝3个通道,RGB三个分量分别用8bit来表示,其取值范围为0--255。

        为了将色度信号和亮度信号分开,将三基色RGB信号转成YUV信号,YUV,分为三个分量,“Y”表示明亮度(LuminanceLuma),也就是灰度值;而“U”和“V”表示的则是色度(ChrominanceChroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。转换关系如下:

        Y0.299R+0.587G+0.114B

        U-0.1678R-0.3313G+0.5B

        V0.5R-0.4187G-0.0813B

        在对亮度分量信号进行8比特均匀量化时,共分为256个等间隔的量化级。在数字电视显示时,为了防止信号变动造成过载,在256级上端留20级,下端留16级作为信号超越动态范围的保护带。而在对该信号进行传送时,则不用预留保护带,范围直接是0-255

        色差信号经过归一化处理后,动态范围为-0.50.5,让色差零电平对应码电平128,色差信号总共占225个量化级。在256级上端留15级,下端留16级作为信号超越动态范围的保护带。另外,要表示负数不方便,所以上抬128电平。对该信号进行传送时,则不用预留保护带,范围直接是0-255。

      2、色度采样

        人眼对彩色细节分辨率低于对亮度细节分辨率,所以为了节约带宽,将人眼敏感的亮度信号用宽带传送,人眼不敏感的色差信号用窄带传送,来保证质量。

        由于人眼对彩色信号不敏感,所以可以采用色度采样:

        简单来说,就是:

        YUV 4:4:4采样,每一个Y对应一组UV分量。

        YUV 4:2:2采样,每两个Y共用一组UV分量。 

        YUV 4:2:0采样,每四个Y共用一组UV分量。 

      3、转换代码

        以下是RGB转成4:2:0 YUV的函数代码:

    int rgb2yuv(int w,int h,void *rgb,void *y_out,void *u_out,void *v_out) { u_int i,j; //定义j为行数,i为列数 u_int8_t *y,*u,*v;//定义中间指针变量,防止出现野指针 u_int8_t *r,*g,*b; //定义中间指针变量,防止出现野指针 if((w%2)||(h%2)) return 1; //确定传入该函数的w,h变量是偶数,即保证行,列都是偶数,好进行压缩,使UV数据只存在于奇数行奇数列 b=(u_int8_t*) rgb; y=(u_int8_t*) y_out; u=(u_int8_t*) u_out; v=(u_int8_t*) v_out;//将函数传入的地址赋给新定义的中间指针变量 for(j=0;j<h;j++) { for(i=0;i<w;i++)//逐行逐列进行转化 { g=b+1; r=b+2;//在buffer中bgr顺序 *y=(u_int8_t)(0.299*(*r)+0.587*(*g)+0.114*(*b));//Y逐个利用公式变换 if(j%2==0){ if(i%2==0)//在奇数行奇数列uv进行计算 { *u=(u_int8_t)(-0.168*(*r)-0.332*(*g)+0.500*(*b)+128); *v=(u_int8_t)(0.500*(*r)-0.419*(*g)-0.081*(*b)+128); if(*u<16) *u=16; if(*u>235) *u=235; if(*v<16) *v=16; if(*v>235) *v=235;//确保UV在16,235之间 u++; v++;//移至下一个地址 } } if(*y<16) *y=16; if(*y>235) *y=235;//确保Y在16,235之间 b+=3;//b往后移三个地址 y++;//移至下一个地址 } } return 1; }

    二、音频(语音)

       1、双极性音频信号

        音频信号是双极性信号,是因为信号本身产生时就是有正有负的,例如打鼓,就是在标准鼓面上下震荡产生的声音。

      2、wav文件格式

          WAV声音文件格式是目前Windows最直接保存声音数据的文件格式。它是以RIFF格式为标准的。RIFF是英文Resource Interchange FileFormat的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFFWAV文件标识段和声音数据格式说明段两部分。数据体又是 PCM(脉冲编码调制)格式表示的样本组成。常见的wav文件有两种,分别对应于单声道(11.025kHz采样率,8bit/样值)和双声道(44.1kHz采样率,16bit/样值),对于双声道音频文件,每个采样数据用16bit表示,高八位和低八位分别代表左右两个声道。

           (1)RIFF格式

        在Windows环境下,大部分多媒体文件都依循着一种结构来存放信息,称为资源互换文件格式(Resources Interchange File Format),简称RIFF。比如声音的WAV文件,视频的AVI文件,动画的MMM文件等均是由此结构衍生出来的。所以,要掌握多媒体文件格式,首先得认识RIFF的结构。以下是RIFF的结构:

    辨识码 4Byte 4ASCII 数据大小 4 Byte 紧跟其后的数据长度 数据

            (2)文件头格式

    地址偏移 字节数 数据类型 内容描述 0 4 char “RIFF”标志 4 4 longint 文件长度 8 4 char “WAVE”标志 12 4 char “fmt”标志 16 4 过度字节(不定) 20 2 int 格式类别(0x10PCM形式的声音格式) 22 2 int 通道数(1为单声道,2为双声道) 24 4 int 采样率 28 4 longint

    波形音频数据传输速率(通道数x每秒数据位数x样本的数据位数/8

    32 4 int 数据块的调整数 34 2 每样本的数据位数(88bit样本,1616bit样本)

        (3)数据体格式

    地址偏移 字节数 数据类型 内容描述 36 4 char 数据标记符”data” 40 4 longint 语音数据的长度 44 声音数据

        (4)举例分析

        以下是一个wav格式文件的72byte

        52 49 46 46 24 08 00 00 5741 56 45 66 6d 74 20 10 00 00 00 01 00 02 00

        22 56 00 00 88 58 01 00 0400 10 00 64 61 74 61 00 08 00 00 00 00 00 00

        24 17 1e f3 3c 13 3c 14 16 f9 18 f9 34 e7 23 a6 3c f2 24 f2 11 ce 1a 0d

        分析如下:

        参考资料

     [1] 姜秀华,柴剑平等.现代电视原理[M].北京:高等教育出版社,2008:272

     [2] http://blog.csdn.net/beyond_cn/article/details/12998247

     [3] http://blog.csdn.net/huang546213693/article/details/50054243

     [4] http://wenku.baidu.com/view/c8357e6baf1ffc4ffe47ac08.html

     [5] http://www.2cto.com/os/201312/267541.html

     [6] http://blog.csdn.net/poechant/article/details/7436710

     [7] http://soundfile.sapp.org/doc/WaveFormat/

      
    转载请注明原文地址: https://ju.6miu.com/read-50143.html

    最新回复(0)