视音频数据源的分析【知识点整理】
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的转换
代码:
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;
}
// subsample UV
/以下需填充/
b = (unsigned char *)bmp;
y = y_buffer;
u = u_buffer;
v = v_buffer;
}
void InitLookupTable()
{
int 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;
}
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] 博客
(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”
sta4000
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] 博客
相关文章推荐
- 作业1:视音频的数据源分析
- 视音频数据的数据源分析---音频
- 【信源编码作业】1. 视音频数据的数据源分析
- 简练软考知识点整理-软件测试之边界值分析
- 【数字视音频】知识点整理
- 视音频数据的数据源分析
- 简练软考知识点整理-ABC成本法和ABC分析图法
- 简练软考知识点整理-ABC成本法和ABC分析图法
- 视频音频的数据源分析
- 简练软考知识点整理-软件测试之边界值分析
- C语言难点分析整理
- lucene搜索引擎技术的分析与整理
- lucene搜索引擎技术的分析与整理(lucene代码分析)
- 原创系分下午1 知识点整理(2)
- c 语言难点分析整理
- 关于知识点整理的一点想法
- 原创系分下午1 知识点整理(3)
- lucene搜索引擎技术的分析与整理(代码情景分析)
- 整理磁盘碎片时候,分析出来:驱动器C盘可能已损坏.提示的是:驱动器C盘可能已损坏,要检查并修复驱动器.请运行 chkdsk/f
- 原创系分下午1 知识点整理(1)