您的位置:首页 > 其它

视音频数据源的分析【知识点整理】

2017-03-16 21:50 148 查看
1、 视频数据源分析

(1) 视频最原始采集的数据源是模拟的三基色电信号:

彩色景象通过3个基色滤色镜被分解为3幅基色图像,它们分别聚焦在摄象管靶面上,由3个分别对红、绿、蓝敏感的摄像管摄得这3个基色图像的信号,即可得到模拟的三基色电信号[1]。

(2) 原始的模拟三基色电信号经数字量化可得数字的RGB信号。RGB各有256级亮度,用数字表示为从0、1、2…直到255,信源编码的压缩便是对数字的RGB信号进行压缩[2]。

(3) 将RGB转换为YUV的理论前提:

根据格拉兹曼法则,人的视觉只能分辨图像的亮度、色调、色饱和度3种变化。故在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号B-Y(即U)、R-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的[3]。

(4) RGB空间与YUV空间的转换

1)、RGB及YUV的数据(参考:http://blog.csdn.net/beyond_cn/article/details/12998247

RGB中的R、G、B各有256个亮度,用数字表示为从0、1、2…直到255。YUV格式有两大类:planar和packed。

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。

对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,用以下三个图来直观地表示采集的方式,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量:



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

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

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

2)、用C语言实现RGB到YUV的转换

代码:

include

include

include

include

include “bmp2yuv.h”

sta
4000
tic float RGBYUV02990[256], RGBYUV05870[256], RGBYUV01140[256];

static float RGBYUV01684[256], RGBYUV03316[256];

static float RGBYUV04187[256], RGBYUV00813[256];

void InitLookupTable();

int RGB2YUV (int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip)

{

static int init_done = 0;

long i, j, size;
unsigned char *r, *g, *b;
unsigned char *y, *u, *v;
unsigned char *pu1, *pu2, *pv1, *pv2, *psu, *psv;
unsigned char *y_buffer, *u_buffer, *v_buffer;
unsigned char *sub_u_buf, *sub_v_buf;

if (init_done == 0)
{
InitLookupTable();
init_done = 1;
}

// check to see if x_dim and y_dim are divisible by 2
if ((x_dim % 2) || (y_dim % 2)) return 1;
size = x_dim * y_dim;

// allocate memory
y_buffer = (unsigned char *)y_out;
sub_u_buf = (unsigned char *)u_out;
sub_v_buf = (unsigned char *)v_out;
u_buffer = (unsigned char *)malloc(size * sizeof(unsigned char));
v_buffer = (unsigned char *)malloc(size * sizeof(unsigned char));
if (!(u_buffer && v_buffer))
{
if (u_buffer) free(u_buffer);
if (v_buffer) free(v_buffer);
return 2;
}

b = (unsigned char *)bmp;
y = y_buffer;
u = u_buffer;
v = v_buffer;

// convert RGB to YUV
if (!flip) {
for (j = 0; j < y_dim; j ++)
{
y = y_buffer + (y_dim - j - 1) * x_dim;
u = u_buffer + (y_dim - j - 1) * x_dim;
v = v_buffer + (y_dim - j - 1) * x_dim;

for (i = 0; i < x_dim; i ++) {
g = b + 1;
r = b + 2;
*y = (unsigned char)(  RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
*u = (unsigned char)(- RGBYUV01684[*r] - RGBYUV03316[*g] + (*b)/2          + 128);
*v = (unsigned char)(  (*r)/2          - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
b += 3;
y ++;
u ++;
v ++;
}
}
} else
{

for(j=0;j<y_dim;j++)
{
y=y_buffer+j*x_dim;
u=u_buffer+j*x_dim;
v=v_buffer+j*x_dim;

for(i=0;i<x_dim;i++)
{
g=b+1;
r = b + 2;
*y = (unsigned char)(  RGBYUV02990[*r] + RGBYUV05870[*g] + RGBYUV01140[*b]);
*u = (unsigned char)(- RGBYUV01684[*r] - RGBYUV03316[*g] + (*b)/2          + 128);
*v = (unsigned char)(  (*r)/2          - RGBYUV04187[*g] - RGBYUV00813[*b] + 128);
b += 3;
y ++;
u ++;
v ++;
}
}


}

// subsample UV

/以下需填充/

b = (unsigned char *)bmp;

y = y_buffer;

u = u_buffer;

v = v_buffer;

for(j=0;j<y_dim/2;j++)
{

u=u_buffer+2*j*x_dim;
v=v_buffer+2*j*x_dim;
for(i=0;i<x_dim/2;i++)
{

*sub_u_buf=*u;
*sub_v_buf=*v;
u=u+2;
v=v+2;

sub_u_buf++;
sub_v_buf++;

}
}

free(u_buffer);
free(v_buffer);

return 0;


}

void InitLookupTable()

{

int i;

for (i = 0; i < 256; i++) RGBYUV02990[i] = (float)0.2990 * i;
for (i = 0; i < 256; i++) RGBYUV05870[i] = (float)0.5870 * i;
for (i = 0; i < 256; i++) RGBYUV01140[i] = (float)0.1140 * i;
for (i = 0; i < 256; i++) RGBYUV01684[i] = (float)0.1684 * i;
for (i = 0; i < 256; i++) RGBYUV03316[i] = (float)0.3316 * i;
for (i = 0; i < 256; i++) RGBYUV04187[i] = (float)0.4187 * i;
for (i = 0; i < 256; i++) RGBYUV00813[i] = (float)0.0813 * i;


}

void ReadRGB (FILE *pFile,BITMAPFILEHEADER &file_h,BITMAPINFOHEADER &info_h,unsigned char*rgbDataOut)

{

unsigned long height,width,w,h;

unsigned char* Data;

if((info_h.biWidth%4)==0)

w=info_h.biWidth;

else

w=(info_h.biWidth*info_h.biBitCount+31)/32*4;

if((info_h.biHeight%2)==0)

h=info_h.biHeight;

else

h=info_h.biHeight+1;

height=h;
width=w/8*info_h.biBitCount;

fseek(pFile,file_h.bfOffBits,0);
Data=(unsigned char*)malloc(height*width);

if(fread(Data,height*width,1,pFile)!=1)
{
printf("read file error!\n");
exit(0);
}
memcpy(rgbDataOut,Data,height*width);
free(Data);


}

bool WriteYUV(unsigned char *Y,unsigned char*U,unsigned char*V,unsigned long size,FILE *outFile )

{

if(fwrite(Y,1,size,outFile)!=size)

return false;

if(fwrite(U,1,size/4,outFile)!=size/4)

return false;

if(fwrite(V,1,size/4,outFile)!=size/4)

return false;

return true;

}

运行结果:可将jpg的图片生成一个.yuv的文件

2、 音频数据源分析

(1)、音频信号采用双极性编码的原因

因为采集到的模拟的声音电信号是双极性信号,为了保持这一特性,故采用双极性编码,如下图所示:



(2)声音信号的数字化

声音数字化的三要素:采样频率、量化位数、声道数。采样频率:每秒钟抽取声波幅度样本的次数,一般来讲采样频率越高声音质量越好,但数据量也越大,常用的采样频率有11.025 kHz、22.05 kHz、44.1kHz。量化位数:每个采样点用多少二进制位表示的数据范围,一般量化位数越多音质越好但数据量也越大,常用的量化位数为8位(256)和16位(65536)。声道数:使用声音通道的个数,分为单声道和立体声,立体声比单声道的表现力丰富,但数据量翻倍。

声音数字化后的音频数据量=采样频率量化位数声道/8(字节/秒)

(4) 常见的音频文件格式

a. WAV文件

WAV是Microsoft/IBM共同开发的PC波形文件。因未经压缩,文件数据量很大。

特点:声音层次丰富,还原音质好

b. MP3文件

MP3(MPEG Audio layer3)是一种按MPEG标准的音频压缩技术制作的音频文件。

特点:高压缩比(11:1),优美音质

c. WMA文件

WMA(Windows Media Audio)是Windows Media格式中的一个子集(音频格式)。

特点:压缩到MP3一半

d. MIDI文件

MIDI(乐器数字接口)是由一组声音或乐器符号的集合。特点:数据量很小,缺乏重现自然音

(5)音频信号能压缩的基本依据:一是声音信号存在大量的冗余度;二是人的听觉具有强音能抑制同时存在的弱音现象。

(6)以 WAV文件为例说明原始数据音频是如何保存的

1)、WAV文件详解:【本部分参考:http://blog.csdn.net/pi9nc/article/details/12570841

WAV是波形音频文件(Wave Audio),是由资源互换文件格式(简称RIFF)结构衍生出来的。 整个WAV文件分成两部分:WAV头文件和PCM编码的音频数据块。标准化的WAV文件是采用44.1K的采样率,采用16位的数字表示。

WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。

2)、故原始音频经44.1khz的频率采集之后,进行16位PCM编码(Pulse-code modulation脉冲编码调制),然后在WAV头文件中写入相应的信息,并在数据区保存经过编码后的音频信号数据,从而实现将原始音频保存为WAV文件。

参考:

[1] 《电视原理》

[2] 百科

[3] 博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: