老司机种菜


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 公益404

  • 搜索

OpenGL混色

发表于 2017-06-27 | 分类于 OpenGL

混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。 假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。 要使用OpenGL的混合功能,只需要调用:glEnable(GL_BLEND);即可。要关闭OpenGL的混合功能,只需要调用:glDisable(GL_BLEND);即可。 注意: 只有在RGBA模式下,才可以使用混合功能,颜色索引模式下是无法使用混合功能的。

1.源因子和目标因子

混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”,把原来的颜色称为“目标颜色”。 OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜 色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等) 下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。则混合产生的新颜色可以表示为: (Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da) 如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。

源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。

  • GL_ZERO:表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
  • GL_ONE:表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
  • GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
  • GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
  • GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
  • GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。
  • GL_SRC_COLOR: 把源颜色的四个分量分别作为因子的四个分量
  • GL_ONE_MINUS_SRC_COLOR
  • GL_DST_COLOR
  • GL_ONE_MINUS_DST_COLOR GL_SRC_COLOR与GL_ONE_MINUS_SRC_COLOR在OpenGL旧版本中只能用于设置目标因子,GL_DST_COLOR与GL_ONE_MINUS_DST_COLOR在OpenGL 旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为 因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、 GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha 值和RGB值采用不同的混合因子。

2.模式示例

  • 如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。
  • 如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途)
  • 如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha 值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减 小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。
  • 如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。 注意: 所谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则 红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。

3.对两种示例模式的具体解释:

模式一:

1
2
GLES20.glEnable(GLES20.GL_BLEND);  
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

模式二:

1
2
GLES20.glEnable(GLES20.GL_BLEND);  
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

模式一是传统的alpha通道混合,这种模式下颜色和alpha值是分立的,rgb决定颜色,alpha决定..(英文是决定how solid it is 水平有限找不到准确的中文来表达) 在数学上表达式是:blend(source, dest) = (source.rgb * source.a) + (dest.rgb * (1 – source.a)).要注意的是这种模式下,透明只跟alpha有关,跟rgb值无关,一个透明的颜色,不透明的颜色有相同的rgb值,只要alpha=0即可。

模式二是alpha预乘的混合(Premultiplied Alpha Blending),这种模式下rgb与alpha是联系在一起的,数学上的表达式是 blend(source, dest) = source.rgb + (dest.rgb * (1 – source.a)),在这种模式下,透明的表示是rgb值都为0.

4.EGLSurface背景透明设置

在OpenGL绘制中,除了设置混色外,还要设置EGLSurface配置支持Alpha,如果不设置EGL相关的EGLSurface支持透明,就算OpenGL函数中开启混色,绘制完成后仍是有黑色背景.

4.1GLSurfaceView

在onSurfaceCreated里,调用GLES20.glClearColor(0f, 0f, 0f, 0f);alpha为0,即透明。

然后,对surfaceview要作一定处理:

1
2
3
4
5
mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
TestRenderer renderer = new TestRenderer();
mGLSurfaceView.setRender(renderer);
mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
mGLSurfaceView.setZOrderOnTop(true);

4.2SurfaceTexture或Surface构造的Surface

EGL14.eglChooseConfig中config数组增加EGL10.EGL_ALPHA_SIZE配置:

1
2
3
4
5
6
7
8
int[] CONFIG_RGBA = {
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_ALPHA_SIZE, 8,
EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL10.EGL_NONE
};

5.实现三维混合

在进行三维场景的混合时必须注意的是深度缓冲。

深度缓冲是这样一段数据,它记录了每一个像素距离观察者有多近。在启用深度缓冲测试的情况下,如果将要绘制的像素比原来的像素更近,则像素将被绘制。否则,像素就会被忽略掉,不进行绘制。这在绘制不透明的物体时非常有用——不管是先绘制近的物体再绘制远的物体,还是先绘制远的物体再绘制近的物体,或者干脆以 混乱的顺序进行绘制,最后的显示结果总是近的物体遮住远的物体。 然而在你需要实现半透明效果时,发现一切都不是那么美好了。如果你绘制了一个近距离的半透明物体,则它在深度缓冲区内保留了一些信息,使得远处的物体将无法再被绘制出来。虽然半透明的物体仍然半透明,但透过它看到的却不是正确的内容了。 要 解决以上问题,需要在绘制半透明物体时将深度缓冲区设置为只读,这样一来,虽然半透明物体被绘制上去了,深度缓冲区还保持在原来的状态。如果再有一个物体 出现在半透明物体之后,在不透明物体之前,则它也可以被绘制(因为此时深度缓冲区中记录的是那个不透明物体的深度)。以后再要绘制不透明物体时,只需要再 将深度缓冲区设置为可读可写的形式即可。怎么绘制一个一部分半透明一部分不透明的物体?这个好办,只需要把物体分为两个部分,一部分全是半透明 的,一部分全是不透明的,分别绘制就可以了。 即使使用了以上技巧,我们仍然不能随心所欲的按照混乱顺序来进行绘制。必须是先绘制不透明的物体,然 后绘制透明的物体。否则,假设背景为蓝色,近处一块红色玻璃,中间一个绿色物体。如果先绘制红色半透明玻璃的话,它先和蓝色背景进行混合,则以后绘制中间 的绿色物体时,想单独与红色玻璃混合已经不能实现了。 总结起来,绘制顺序就是:首先绘制所有不透明的物体。如果两个物体都是不透明的,则谁先谁后 都没有关系。然后,将深度缓冲区设置为只读。接下来,绘制所有半透明的物体。如果两个物体都是半透明的,则谁先谁后只需要根据自己的意愿(注意了,先绘制 的将成为“目标颜色”,后绘制的将成为“源颜色”,所以绘制的顺序将会对结果造成一些影响)。最后,将深度缓冲区设置为可读可写形式。 调用glDepthMask(GL_FALSE);可将深度缓冲区设置为只读形式。调用glDepthMask(GL_TRUE);可将深度缓冲区设置为可读可写形式。

glBlendFunc函数官网文档

android系统编码MediaCodec

发表于 2017-06-25 | 分类于 Android

android编码器局限性

1. 颜色格式问题

MediaCodec在初始化的时候,在configure的时候,需要传入一个MediaFormat对象,当作为编码器使用的时候,我们一般需要在MediaFormat中指定视频的宽高,帧率,码率,I帧间隔等基本信息,除此之外,还有一个重要的信息就是,指定编码器接受的YUV帧的颜色格式。这个是因为由于YUV根据其采样比例,UV分量的排列顺序有很多种不同的颜色格式,而对于Android的摄像头在onPreviewFrame输出的YUV帧格式,如果没有配置任何参数的情况下,基本上都是NV21格式,但Google对MediaCodec的API在设计和规范的时候,显得很不厚道,过于贴近Android的HAL层了,导致了NV21格式并不是所有机器的MediaCodec都支持这种格式作为编码器的输入格式!

因此,在初始化MediaCodec的时候,我们需要通过codecInfo.getCapabilitiesForType来查询机器上的MediaCodec实现具体支持哪些YUV格式作为输入格式,一般来说,起码在4.4+的系统上,这两种格式在大部分机器都有支持:

1
2
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Plannder
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlannder

两种格式分别是YUV420P和NV21,如果机器上只支持YUV420P格式的情况下,则需要先将摄像头输出的NV21格式先转换成YUV420P,才能送入编码器进行编码,否则最终出来的视频就会花屏,或者颜色出现错乱

这个算是一个不大不小的坑,基本上用上了MediaCodec进行视频编码都会遇上这个问题

2. 编码器支持特性相当有限

如果使用MediaCodec来编码H264视频流,对于H264格式来说,会有一些针对压缩率以及码率相关的视频质量设置,典型的诸如Profile(baseline, main, high),Profile Level, Bitrate mode(CBR, CQ, VBR),合理配置这些参数可以让我们在同等的码率下,获得更高的压缩率,从而提升视频的质量,Android也提供了对应的API进行设置,可以设置到MediaFormat中这些设置项:

1
2
3
MediaFormat.KEY_BITRATE_MODE
MediaFormat.KEY_PROFILE
MediaFormat.KEY_LEVEL

但问题是,对于Profile,Level, Bitrate mode这些设置,在大部分手机上都是不支持的,即使是设置了最终也不会生效,例如设置了Profile为high,最后出来的视频依然还会是Baseline….

这个问题,在7.0以下的机器几乎是必现的,其中一个可能的原因是,Android在源码层级hardcode了profile的的设置:

1
2
3
4
5
//XXXX
if(h264type.eProfile != OMX_VIDEO_AVCProfileBaseline){
ALOGW("Use baseline profile instead of %d for AVC recording", h264type.eProfile);
h264type.eProfile = OMX_VIDEO_AVCProfileBaseline;
}

Android直到7.0之后才取消了这段地方的Hardcode:

1
2
3
4
5
6
if(h264type.eProfile == OMX_VIDEO_AVCProfileBaseline){
....
}else if(h264type.eProfile == OMX_VIDEO_AVCProfileMain
|| h264type.eProfile == OMX_VIDEO_AVCProfileBaseHigh)
.....
}

这个问题可以说间接导致了MediaCodec编码出来的视频质量偏低,同等码率下,难以获得跟软编码甚至iOS那样的视频质量。

3. 16位对齐要求

前面说到,MediaCodec这个API在设计的时候,过于贴近HAL层,这在很多Soc的实现上,是直接把传入MediaCodec的buffer,在不经过任何前置处理的情况下就直接送入了Soc中。而在编码h264视频流的时候,由于h264的编码块大小一般是16x16,于是乎在一开始设置视频的宽高的时候,如果设置了一个没有对齐16的大小,例如960x540,在某些cpu上,最终编码出来的视频就会直接花屏!

很明显这还是因为厂商在实现这个API的时候,对传入的数据缺少校验以及前置处理导致的,目前来看,华为,三星的Soc出现这个问题会比较频繁,其他厂商的一些早期Soc也有这种问题,一般来说解决方法还是在设置视频宽高的时候,统一设置成对齐16位之后的大小就好了。

4.软编解码介绍

除了使用MediaCodec进行编码之外,另外一种比较流行的方案就是使用ffmpeg+x264/openh264进行软编码,ffmpeg是用于一些视频帧的预处理。这里主要是使用x264/openh264作为视频的编码器。

  1. x264基本上被认为是当今市面上最快的商用视频编码器,而且基本上所有h264的特性都支持,通过合理配置各种参数还是能够得到较好的压缩率和编码速度的,限于篇幅,这里不再阐述h264的参数配置,有兴趣可以看下这两篇文章对x264编码参数的调优:
  • https://www.nmm-hd.org/d/index.php?title=X264%E4%BD%BF%E7%94%A8%E4%BB%8B%E7%BB%8D&variant=zh-cn
  • http://www.cnblogs.com/wainiwann/p/5647521.html
  1. openh264(https://github.com/cisco/openh264)则是由思科开源的另外一个h264编码器,项目在2013年开源,对比起x264来说略显年轻,不过由于思科支付满了h264的年度专利费,所以对于外部用户来说,相当于可以直接免费使用了,另外,firefox直接内置了openh264,作为其在webRTC中的视频的编解码器使用。

但对比起x264,openh264在h264高级特性的支持比较差:

  • Profile只支持到baseline, level 5.2
  • 多线程编码只支持slice based,不支持frame based的多线程编码

从编码效率上来看,openh264的速度也并不会比x264快,不过其最大的好处,还是能够直接免费使用吧。

参考微信Android视频编码爬过的那些坑

android编码器支持参数

Supported Media Formats

Video encoding recommendations The table below lists the Android media framework video encoding profiles and parameters recommended for playback using the H.264 Baseline Profile codec. The same recommendations apply to the Main Profile codec, which is only available in Android 6.0 and later.

SD (Low quality) SD (High quality) HD 720p (N/A on all devices)
Video resolution 176 x 144 px 480 x 360 px 1280 x 720 px
Video frame rate 12 fps 30 fps 30 fps
Video bitrate 56 Kbps 500 Kbps 2 Mbps
Audio codec AAC-LC AAC-LC AAC-LC
Audio channels 1 (mono) 2 (stereo) 2 (stereo)
Audio bitrate 24 Kbps 128 Kbps 192 Kbps

The table below lists the Android media framework video encoding profiles and parameters recommended for playback using the VP8 media codec.

SD (Low quality) SD (High quality) HD 720p (N/A on all devices) HD 1080p (N/A on all devices)
Video resolution 320 x 180 px 640 x 360 px 1280 x 720 px 1920 x 1080 px
Video frame rate 30 fps 30 fps 30 fps 30 fps
Video bitrate 800 Kbps 2 Mbps 4 Mbps 10 Mbps

CamcorderProfile

Retrieves the predefined camcorder profile settings for camcorder applications. These settings are read-only.

The compressed output from a recording session with a given CamcorderProfile contains two tracks: one for audio and one for video.

Each profile specifies the following set of parameters:

  • The file output format
  • Video codec format
  • Video bit rate in bits per second
  • Video frame rate in frames per second
  • Video frame width and height,
  • Audio codec format
  • Audio bit rate in bits per second,
  • Audio sample rate
  • Number of audio channels for recording.

Android编码器常见问题

MediaCodec KEY_FRAME_RATE seems to be ignored

总结起来就是和输入编码器的帧率有关系

I am trying to modify the source for screenrecord in android 4.4 and lower the captured frame rate, but no matter what value I put in:

1
format->setFloat("frame-rate", 5);

the result is always the same ( a very high frame rate ) Is the encoder ignoring this property ? how can I control the frame rate ?

The frame-rate value is not ignored, but it doesn’t do what you want.

The combination of frame-rate and i-frame-interval determines how often I-frames (also called “sync frames”) appear in the encoded output. The frame rate value might also play a role in meeting the bitrate target on some devices, but I’m not sure about that (see e.g. this post).

The MediaCodec encoder does not drop frames. If you want to reduce the frame rate, you have to do so by sending fewer frames to it.

The screenrecord command doesn’t “sample” the screen at a fixed frame rate. Instead, every frame it receives from the surface compositor (SurfaceFlinger) is sent to the encoder, with an appropriate time stamp. If screenrecord receives 60 frames per seconds, you’ll have 60fps output. If it receives 10 frames in quick succession, followed by nothing for 5 seconds, followed by a couple more, you’ll have exactly that in the output file.

You can modify screenrecord to drop frames, but you have to be a bit careful. If you try to reduce the maximum frame rate from 60fps to 30fps by dropping every-other frame, you run the risk that in a “frame0 - frame1 - long_pause - frame2” sequence you’ll drop frame1, and the video will hold on frame0 instead, showing a not-quite-complete animation. So you need to buffer up a frame, and then encode or drop frame N-1 if the difference in presentation times between that and frame N is ~17ms.

The tricky part is that screenrecord, in its default operating mode, directs the frames to the encoder without touching them, so all you see is the encoded output. You can’t arbitrarily drop individual frames of encoded data, so you really want to prevent the encoder from seeing them in the first place. If you use the screenrecord v1.1 sources you can tap into “overlay” mode, used for –bugreport, to have the frames pass through screenrecord on their way to the encoder.

In some respects it might be simpler to write a post-processor that reduces the frame rate. I don’t know how much quality would be lost by decoding and re-encoding the video.

多媒体技术(三)之多媒体信息的存储与传输编码

发表于 2017-06-20 | 分类于 media

多媒体技术(五)之数字音频视频信号的压缩

发表于 2017-06-20 | 分类于 media

概述

数字视频编码概述(熵编码/Huffman编码)

1. 数字视频压缩的必要性和可能性

按ITU-R BT. 601建议,数字化后的输入图像格式为720*576像素,帧频为25帧/s,采样格式为4:2:2,量化精度为8bit, 则数码率:(720 * 576 + 360 * 576 + 360 * 576) * 25帧/s * 8bit = 165.888Mbit/s。 如果视频信号数字化后直接存放在650MB的光盘中,在不考虑音频信号的情况下,每张光盘只能存储31s的视频信号。 数据压缩的理论基础是信息论。从信息论的角度来看,压缩就是去掉数据中的冗余,即保留不确定的信息,去掉确定的信息(可推知的),也就是用一种更接近信息本质的描述来代替原有冗余的描述。数据图像和视频数据中存在着大量的数据冗余和主观视觉冗余,因此图像和视频数据压缩不仅是必要的,而且也是可能的。

1.1 空间冗余

空间冗余也称空域冗余,是一种与像素间相关性直接联系的数据冗余。例如:数字图像的亮度信号和色度信号在空间域(X,Y坐标系)虽然属于一个随机场分布,但是他们可以看成为一个平稳的马尔可夫场。通俗讲,图像像素点在空间域中的亮度值和色度信号值,除了边界轮毂外,都是缓慢变化。因此,图像的帧内编码,即以减少空间冗余进行数据压缩。

1.2 时间冗余

时间冗余也称为时域冗余,它是针对视频序列图像而言的。视频序列每秒有25 ~ 30帧图像,相邻帧之间的时间间隔很小(例如,帧频为25Hz的电视信号,期帧间间隔只有 0.04s),使得图像有很强的相关性。因此,对于视频压缩而言,通常采用运动估值和运动补偿预测技术来消除时间冗余。

1.3 统计冗余

统计冗余也称编码表示冗余或符合冗余。由信息论的有关原来可知,为了表示图像数据的一个像素点,只要按其信息熵的大小分配相应的比特数即可。若用相同码长表示不同出现概率的符号,则会造成比特数的浪费。如果采用可变长编码技术,对出现概率大的符号用短码字表示,对出现概率小的符号用长码字表示,则可去除符号冗余,从而节约码字,这就是熵编码的思想。

1.4 结构冗余

在有些图像的部分区域内有着很相似的纹理结构,或是图像的各个部分之间存在着某种关系,例如自相似性等,这些都是结构冗余的表现。分形图像编码的基本思想就是利用了结构冗余。

1.5 知识冗余

在某些特定的应用场合,编码对象中包含的信息与某些先验的基本知识有关。这时,可以利用这些先验知识为编码对象建立模型。通过提取模型参数,对参数进行编码,而不是对图像像素值直接进行编码,可以达到非常高的压缩比。这是模型基编码(或称知识基编码、语义基编码)的基本思想。

1.6 人眼的视觉冗余

视觉冗余度是相对于人眼的视觉特性而言。压缩视觉冗余的核心思想是去掉那些相对人眼而言是看不到的或可有可无的图像数据。对视觉冗余的压缩通常反映在各种具体的压缩编码中。如对于离散余弦变换(DCT)系数的直流与低频部分采用细量化,而对高频部分采用粗量化。在帧间预测编码中,高压缩比的预测帧及双向预测帧的采用,也是利用了人眼对运动图像细节不敏感的特性。

2. 无失真编码和限失真编码

从信息论的角度出发,根据解码后还原的数据是否与原始数据完全相同,可将数据压缩方法分为两大类:无失真编码和限失真编码。

无失真编码:

无失真编码又称无损编码、信息保持编码、熵编码。

熵指的是具体数据所含的平均信息量,定义为在不丢失信息的前提下描述该信息内容所需的最小比特数。

熵编码事纯粹基于信号统计特性的一种编码方法,他利用信源概率分布的不均匀性,通过变长编码来减少信源数据冗余,解码后还原的数据与压缩编码前的原始数据完全相同而不引入任何失真。

但无失真编码的压缩比较低,可达到的最高压缩比受到信源熵的理论限制:一般是2:1到5:1。最常用的无失真编码方法有哈夫曼(Huffman)编码、算术编码和游程编码(Run-Length Encoding,RLE)等。

限失真编码:

限失真编码也称有损编码、非信息保持编码、熵压缩编码。也就是说,解码后还原的数据与压缩编码前的原始数据有差别的,编码会一定程度的失真。

限失真编码方法利用了人类视觉的感知特性,允许压缩过程中损失一部分信息,虽然在解码时不能完全恢复原始数据,但是如果把失真控制在视觉阈值一下或者控制在可容忍的限度你,则不影响人们对图像的理解,却换来了高压缩比。在限失真编码中,允许的是真愈大,则可达到的压缩比愈高。

常见的限失真编码方法:预测编码、变化编码、矢量量化、基于模型编码等。

3. 熵编码

3.1 熵(Entropy):信源的平均信息量,更精确的描述为表示信源所有符号包含信息的平均比特数。
  • 信源编码要尽可能的减少信源的冗余,使之接近熵
  • 用更少的比特传递更多的信源信息

3.2 熵编码:数据压缩中根据信源消息的概率模型使消息的熵最小化

  • 无损压缩
  • 变长压缩

压缩编码基础

H.264中普通I帧和IDR帧究竟有什么区别

在MPEG2中,有个重要的概念叫GOP(group of pictures),假设编码的帧类型为:IBBPBBPBBPBBIBBPBBPBBPBBI…, 那么这个IBBPBBPBBPBB就叫一个GOP. 由于误差会积累,但MPEG2中的I帧可以阻断误差的积累,也就是说,在MPEG中I帧后面的帧永远不会参考I帧前面的帧,也就是说,一个GOP中的帧永远不会参考前一个GOP中的帧.(另外说句题外话:B帧可以参考下一个GOP的I帧,但在MPEG2中,B帧不会作为参考帧,所以B帧不会导致误差积累)

在H.264中就不同了.很多人说,在H.264中没有I帧这个概念了,当然这也是有道理的,标准中的确没有这么叫,但是,为了方便,也可以延续I帧这个概念,那么H.264中什么叫I帧呢? 定义:H.264中的I帧是指帧中的宏块都是采用帧内预测方式,在H.264中有两种I帧: 普通I帧和IDR帧(特殊I帧).

在H.264中,是IDR帧阻断了误差的积累, IDR帧后面的帧都不能参考该IDR帧前面的帧. 在H.264中,普通的I帧并没有阻断误差的积累,那就是说普通I帧后面的帧就可以参考该I帧之前的帧么?

多媒体技术(三)之视频

发表于 2017-06-20 | 分类于 media

多媒体技术(二)之声音

发表于 2017-06-20 | 分类于 media

信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余。音频信号在时域和频域上具有相关性,也即存在数据冗余。将音频作为一个信源,音频编码的实质是减少音频中的冗余。 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。

内容介绍

声音三要素

声音的特性可由三个要素来描述,即响度、音调和音色。

  • 响度:人耳对声音强弱的主观感觉称为响度。响度和声波振动的幅度有关。一般说来,声波振动幅度越大则响度也越大。当我们用较大的力量敲鼓时,鼓膜振动的幅度大,发出的声音响;轻轻敲鼓时,鼓膜振动的幅度小,发出的声音弱。 音叉振动时发出的声波为单音,即只有一个频率成分。若设法将音叉的振动规律记录下来,可发现其振动波形为一正弦波。当用不同力量敲击某个音叉时,音叉发出的声波幅度不同,这意味着声音的响度不同。给出了两个声音波形,其幅度一大一小,幅度大的波形其声音响度大,幅度小的波形其声音响度小。另外,人们对响度的感觉还和声波的频率有关,同样强度的声波,如果其频率不同,人耳感觉到的响度也不同。
  • 音调:人耳对声音高低的感觉称为音调。音调主要与声波的频率有关。声波的频率高,则音调也高。当我们分别敲击一个小鼓和一个大鼓时,会感觉它们所发出的声音不同。小鼓被敲击后振动频率快,发出的声音比较清脆,即音调较高;而大鼓被敲击后振动频率较慢,发出的声音比较低沉,即音调较低。如果分别敲击一个小音叉和一个大音叉时,同样会感觉到小音叉所发声音的音调较高,大音叉所发声音音调较低。如果设法把大、小音叉所发出的声波记录下来,可发现小音叉在单位时间内振动的次数多,即频率高,大音叉在单位时间内振动的次数少,即频率低。给出了两个频率不同的声音波形,从声音可听出,频率高的声音波形听起来音调较高,而频率低的声音波形听起来则音调较低。
  • 音色:音色是人们区别具有同样响度、同样音调的两个声音之所以不同的特性,或者说是人耳对各种频率、各种强度的声波的综合反应。音色与声波的振动波形有关,或者说与声音的频谱结构有关。前面说过,音叉可产生一个单一频率的声波,其波形为正弦波。但实际上人们在自然界中听到的绝大部分声音都具有非常复杂的波形,这些波形由基波和多种谐波构成。谐波的多少和强弱构成了不同的音色。各种发声物体在发出同一音调声音时,其基波成分相同。但由于谐波的多少不同,并且各次谐波的幅度各异,因而产生了不同的音色。 例如当我们听胡琴和扬琴等乐器同奏一个曲子时,虽然它们的音调相同,但我们却能把不同乐器的声音区别开来。这是因为,各种乐器的发音材料和结构不同,它们发出同一个音调的声音时,虽然基波相同,但谐波构成不同,因此产生的波形不同,从而造成音色不同。给出了小提琴和钢琴的波形和声音,这两个声音的响度和音调都是相同的,但听起来却不一样,这就是因为这两个声音的音色不同(波形不同)。

音调是指声音的高低,它是由声源振动的频率决定的.响度是指声音的大小,它是由声源振动的振幅决定的且与距离有关。比如我们看电视时,调节音量开关,可以控制声音的大小,而不能改变音调的高低.在日常生活用的语言中,往往用“高低”来表示声音的大小,比如“高声喧哗”中的“高”,不是指音调高低,而是指声音“大小”.在学习中不注意声音大小和高低的区别,会造成音调和响度两个不同的概念模糊不清,这在学习中应该引起特别注意。

采样率和采样大小

声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用40kHz表达,这个40kHz就是采样率。我们常见的CD,采样率为44.1kHz。光有频率信息是不够的,我们还必须获得该频率的能量值并量化,用于表示信号强度。量化电平数为2的整数次幂,我们常见的CD位16bit的采样大小,即2的16次方。采样大小相对采样率更难理解,因为要显得抽象点,举个简单例子:假设对一个波进行8次采样,采样点分别对应的能量值分别为A1-A8,但我们只使用2bit的采样大小,结果我们只能保留A1-A8中4个点的值而舍弃另外4个。如果我们进行3bit的采样大小,则刚好记录下8个点的所有信息。采样率和采样大小的值越大,记录的波形更接近原始信号。

有损和无损

根据采样率和采样大小可以得知,相对自然界的信号,音频编码最多只能做到无限接近,至少目前的技术只能这样了,相对自然界的信号,任何数字音频编码方案都是有损的,因为无法完全还原。在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。我们而习惯性的把MP3列入有损音频编码范畴,是相对PCM编码的。强调编码的相对性的有损和无损,是为了告诉大家,要做到真正的无损是困难的,就像用数字去表达圆周率,不管精度多高,也只是无限接近,而不是真正等于圆周率的值。

使用音频压缩技术的原因

要算一个PCM音频流的码率是一件很轻松的事情,采样率值×采样大小值×声道数 bps。一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的WAV文件,它的数据速率则为 44.1K×16×2 =1411.2 Kbps。我们常说128K的MP3,对应的WAV的参数,就是这个1411.2 Kbps,这个参数也被称为数据带宽,它和ADSL中的带宽是一个概念。将码率除以8,就可以得到这个WAV的数据速率,即176.4KB/s。这表示存储一秒钟采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的音频信号,需要176.4KB的空间,1分钟则约为10.34M,这对大部分用户是不可接受的,尤其是喜欢在电脑上听音乐的朋友,要降低磁盘占用,只有2种方法,降低采样指标或者压缩。降低指标是不可取的,因此专家们研发了各种压缩方案。由于用途和针对的目标市场不一样,各种音频压缩编码所达到的音质和压缩比都不一样,在后面的文章中我们都会一一提到。有一点是可以肯定的,他们都压缩过。

频率与采样率的关系

采样率表示了每秒对原始信号采样的次数,我们常见到的音频文件采样率多为44.1KHz,这意味着什么呢?假设我们有2段正弦波信号,分别为20Hz和20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行40KHz的采样,我们可以得到一个什么样的结果呢?结果是:20Hz的信号每次振动被采样了40K/20=2000次,而20K的信号每次振动只有2次采样。显然,在相同的采样率下,记录低频的信息远比高频的详细。这也是为什么有些音响发烧友指责CD有数码声不够真实的原因,CD的44.1KHz采样也无法保证高频信号被较好记录。要较好的记录高频信号,看来需要更高的采样率,于是有些朋友在捕捉CD音轨的时候使用48KHz的采样率,这是不可取的!这其实对音质没有任何好处,对抓轨软件来说,保持和CD提供的44.1KHz一样的采样率才是最佳音质的保证之一,而不是去提高它。较高的采样率只有相对模拟信号的时候才有用,如果被采样的信号是数字的,请不要去尝试提高采样率。

亨利·奈奎斯特(Harry Nyquist)采样定理:当对连续变化的信号波形进行采样时,若采样率fs高于该信号所含最高频率的两倍,那么可以由采样值通过插补技术正确的回复原信号中的波形,否则将会引起频谱混叠(Aliasing),产生混叠噪音(Aliasing Noise),而重叠的部分是不能恢复的.(同样适用于模拟视频信号的采样) 人声语音的特点。人类的听力感知范围是从20Hz到20kHz。这个频宽范围被划分成四个频宽类别:窄带、宽带、超宽带和全带。

音轨和声道的区别?

  • 音轨:过去,当歌手在录音棚里录音的情况跟现在大不一样 就是让歌手和乐队一起录音 歌手一边唱,乐队一边伴奏 然后录音机把这些声音一起录下来。 大多数读者都认为录音就是这样录 而且过去也的确这样录的 不过这样录音有一个很不方便的地方 那就是,如果歌手唱错了,录音师要歌手从新开始唱 那么乐队也要重新开始伴奏 如果歌手唱错一两次还没大关系 如果歌手唱错三、四次甚至是更多次数 那么乐队就要跟着重新伴奏四、五次或更多 而且这样的情况并不少见 这样乐队就会产生不满的情绪 还会产生其他一┎环奖? 后来就采用了一项新技术,可以避免这样的不便 那就是让乐队单独演奏,并用录音设备录下来,只是录在单独一条音轨上 然后让歌手带上耳机,听着乐队的伴奏录音演唱, 并录下来,录在另一条和伴奏音轨平行的音轨上 如果歌手唱错了,需要重新唱,只要把伴奏录音重新放就可以了 这种技术就是双音轨技术,这种技术能够把多种声音混合的录在一起,实现各种美妙的音效 其实我们唱的卡拉OK就是采用了音轨技术 其实以上说的是双音轨技术,还有多音轨技术,可以把三、四种声音或者更多的声音分别录制成单独的音轨然后一起播放出来
  • 声道数:声卡所支持的声道数是衡量声卡档次的重要指标之一,从单声道到最新的环绕立体声,下面一一详细介绍:
  1. 单声道 单声道是比较原始的声音复制形式,早期的声卡采用的比较普遍。当通过两个扬声器回放单声道信息的时候,我们可以明显感觉到声音是从两个音箱中间传递到我们耳朵里的。这种缺乏位置感的录制方式用现在的眼光看自然是很落后的,但在声卡刚刚起步时,已经是非常先进的技术了。
  2. 立体声 单声道缺乏对声音的位置定位,而立体声技术则彻底改变了这一状况。声音在录制过程中被分配到两个独立的声道,从而达到了很好的声音定位效果。这种技术在音乐欣赏中显得尤为有用,听众可以清晰地分辨出各种乐器来自的方向,从而使音乐更富想象力,更加接近于临场感受。立体声技术广泛运用于自Sound Blaster Pro以后的大量声卡,成为了影响深远的一个音频标准。时至今日,立体声依然是许多产品遵循的技术标准。
  3. 准立体声 准立体声声卡的基本概念就是:在录制声音的时候采用单声道,而放音有时是立体声,有时是单声道。采用这种技术的声卡也曾在市面上流行过一段时间,但现在已经销声匿迹了。
  4. 四声道环绕 人们的欲望是无止境的,立体声虽然满足了人们对左右声道位置感体验的要求,但是随着技术的进一步发展,大家逐渐发现双声道已经越来越不能满足我们的需求。由于PCI声卡的出现带来了许多新的技术,其中发展最为神速的当数三维音效。三维音效的主旨是为人们带来一个虚拟的声音环境,通过特殊的HRTF技术营造一个趋于真实的声场,从而获得更好的游戏听觉效果和声场定位。而要达到好的效果,仅仅依靠两个音箱是远远不够的,所以立体声技术在三维音效面前就显得捉襟见肘了,但四声道环绕音频技术则很好的解决了这一问题。 四声道环绕规定了4个发音点:前左、前右,后左、后右,听众则被包围在这中间。同时还建议增加一个低音音箱,以加强对低频信号的回放处理(这也就是如今4.1声道音箱系统广泛流行的原因)。就整体效果而言,四声道系统可以为听众带来来自多个不同方向的声音环绕,可以获得身临各种不同环境的听觉感受,给用户以全新的体验。如今四声道技术已经广泛融入于各类中高档声卡的设计中,成为未来发展的主流趋势。
  5. 5.1声道
  6. 1声道已广泛运用于各类传统影院和家庭影院中,一些比较知名的声音录制压缩格式,譬如杜比AC-3(Dolby Digital)、DTS等都是以5.1声音系统为技术蓝本的,其中“.1”声道,则是一个专门设计的超低音声道,这一声道可以产生频响范围20~120Hz的超低音。其实5.1声音系统来源于4.1环绕,不同之处在于它增加了一个中置单元。这个中置单元负责传送低于80Hz的声音信号,在欣赏影片时有利于加强人声,把对话集中在整个声场的中部,以增加整体效果。相信每一个真正体验过Dolby AC-3音效的朋友都会为5.1声道所折服。

流特征

随着网络的发展,人们对在线收听音乐提出了要求,因此也要求音频文件能够一边读一边播放,而不需要把这个文件全部读出后然后回放,这样就可以做到不用下载就可以实现收听了;也可以做到一边编码一边播放,正是这种特征,可以实现在线的直播,架设自己的数字广播电台成为了现实。

编码分类

根据编码方式的不同,音频编码技术分为三种:波形编码、参数编码和混合编码。一般来说,波形编码的话音质量高,但编码速率也很高;参数编码的编码速率很低,产生的合成语音的音质不高;混合编码使用参数编码技术和波形编码技术,编码速率和音质介于它们之间。

1、波形编码

波形编码是指不利用生成音频信号的任何参数,直接将时间域信号变换为数字代码,使重构的语音波形尽可能地与原始语音信号的波形形状保持一致。波形编码的基本原理是在时间轴上对模拟语音信号按一定的速率抽样,然后将幅度样本分层量化,并用代码表示。 波形编码方法简单、易于实现、适应能力强并且语音质量好。不过因为压缩方法简单也带来了一些问题:压缩比相对较低,需要较高的编码速率。一般来说,波形编码的复杂程度比较低,编码速率较高、通常在16 kbit/s以上,质量相当高。但编码速率低于16 kbit/s时,音质会急剧下降。 最简单的波形编码方法是PCM(Pulse Code Modulation,脉冲编码调制),它只对语音信号进行采样和量化处理。优点是编码方法简单,延迟时间短,音质高,重构的语音信号与原始语音信号几乎没有差别。不足之处是编码速率比较高(64 kbit/s),对传输通道的错误比较敏感。

2、参数编码

参数编码是从语音波形信号中提取生成语音的参数,使用这些参数通过语音生成模型重构出语音,使重构的语音信号尽可能地保持原始语音信号的语意。也就是说,参数编码是把语音信号产生的数字模型作为基础,然后求出数字模型的模型参数,再按照这些参数还原数字模型,进而合成语音。 参数编码的编码速率较低,可以达到2.4 kbit/s,产生的语音信号是通过建立的数字模型还原出来的,因此重构的语音信号波形与原始语音信号的波形可能会存在较大的区别、失真会比较大。而且因为受到语音生成模型的限制,增加数据速率也无法提高合成语音的质量。不过,虽然参数编码的音质比较低,但是保密性很好,一直被应用在军事上。典型的参数编码方法为LPC(Linear Predictive Coding,线性预测编码)。

3、混合编码

混合编码是指同时使用两种或两种以上的编码方法进行编码。这种编码方法克服了波形编码和参数编码的弱点,并结合了波形编码高质量和参数编码的低编码速率,能够取得比较好的效果。

编码格式

PCM编码

PCM 脉冲编码调制是Pulse Code Modulation的缩写。前面的文字我们提到了PCM大致的工作流程,我们不需要关心PCM最终编码采用的是什么计算方式,我们只需要知道PCM编码的音频流的优点和缺点就可以了。PCM编码的最大的优点就是音质好,最大的缺点就是体积大。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。 WAV格式 这是一种古老的音频文件格式,由微软开发。WAV是一种文件格式,符合RIFF (Resource Interchange File Format) 规范。所有的WAV都有一个文件头,这个文件头包含了音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。很多朋友没有这个概念,我们拿AVI做个示范,因为AVI和WAV在文件结构上是非常相似的,不过AVI多了一个视频流而已。我们接触到的AVI有很多种,因此我们经常需要安装一些Decode才能观看一些AVI,我们接触到比较多的DivX就是一种视频编码,AVI可以采用DivX编码来压缩视频流,当然也可以使用其他的编码压缩。同样,WAV也可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了。 在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。

MP3编码

动态图像专家组-1或动态图像专家组-2 音频层III(MPEG-1 or MPEG-2 Audio Layer III),经常称为MP3,是当今相当流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量,它舍弃PCM音讯资料中,对人类听觉不重要的资料,从而达到了压缩成较小的档案。而对于大多数用户的听觉感受来说,MP3的音质与最初的不压缩音频相比没有明显的下降。它是在1991年,由位于德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。MP3的普及,曾对音乐产业造成冲击与影响。 MP3是一个数据压缩格式。它舍弃脉冲编码调制(PCM)音频数据中,对人类听觉不重要的数据(类似于JPEG是一个有损图像压缩),从而达到了压缩成小得多的文件大小。

在MP3中使用了许多技术,其中包括心理声学,以确定音频的哪一部分可以丢弃。MP3音频可以按照不同的比特率进行压缩,提供了权衡数据大小和音质之间的依据。

MP3格式使用了混合的转换机制将时域信号转换成频域信号:

  • 32波段多相积分滤波器(PQF)
  • 36或者12 tap 改良离散余弦滤波器(MDCT);每个子波段大小可以在0…1和2…31之间独立选择
  • 混叠衰减后处理

尽管有许多创造和推广其他格式的重要努力,如 MPEG 标准中的 AAC(Advanced Audio Coding)和 Xiph.Org 开源无专利的 Ogg Vorbis。然而,由于MP3的空前的流通,在目前来说,其他格式不可能威胁其地位。MP3不仅有广泛的用户端软体支持,也有很多的硬件支持,比如便携式数位音频播放器(泛指MP3播放器)、移动电话、DVD和CD播放器。

MP3作为目前最为普及的音频压缩格式,为大家所大量接受,各种与MP3相关的软件产品层出不穷,而且更多的硬件产品也开始支持MP3,我们能够买到的VCD/DVD播放机都很多都能够支持MP3,还有更多的便携的MP3播放器等等,虽然几大音乐商极其反感这种开放的格式,但也无法阻止这种音频压缩的格式的生存与流传。MP3发展已经有10个年头了,他是MPEG(MPEG:Moving Picture Experts Group) Audio Layer-3的简称,是MPEG1的衍生编码方案,1993年由德国Fraunhofer IIS研究院和汤姆生公司合作发展成功。MP3可以做到12:1的惊人压缩比并保持基本可听的音质,在当年硬盘天价的日子里,MP3迅速被用户接受,随着网络的普及,MP3被数以亿计的用户接受。MP3编码技术的发布之初其实是非常不完善的,由于缺乏对声音和人耳听觉的研究,早期的mp3编码器几乎全是以粗暴方式来编码,音质破坏严重。随着新技术的不断导入,mp3编码技术一次一次的被改良,其中有2次重大技术上的改进。

发展 MPEG-1 Audio Layer II编码开始时是德国Deutsche Forschungs- und Versuchsanstalt für Luft- und Raumfahrt(后来称为Deutsches Zentrum für Luft- und Raumfahrt, 德国太空中心)Egon Meier-Engelen管理的数字音频广播(DAB)项目。这个项目是欧盟作为EUREKA研究项目资助的,它的名字通常称为EU-147。EU-147的研究期间是1987年到1994年。

到了1991年,就已经出现了两个提案:Musicam(称为Layer 2)和ASPEC(自适应频谱感知熵编码)。荷兰飞利浦公司、法国CCETT和德国Institut für Rundfunktechnik提出的Musicam方法由于它的简单、出错时的稳定性以及在高质量压缩时较少的计算量而被选中。基于子带编码的Musicam格式是确定MPEG音频压缩格式(采样率、帧结构、数据头、每帧采样点)的一个关键因素。这项技术和它的设计思路完全融合到了ISO MPEG Audio Layer I、II以及后来的Layer III(MP3)格式的定义中。在Mussmann教授(汉诺威大学)的主持下,标准的制定由Leon van de Kerkhof(Layer I)和Gerhard Stoll(Layer II)完成。

一个由荷兰Leon Van de Kerkhof、德国Gerhard Stoll、法国Yves-François Dehery和德国Karlheinz Brandenburg组成的工作小组吸收了Musicam和ASPEC的设计思想,并添加了他们自己的设计思想从而开发出了MP3,MP3能够在128kbit/s达到MP2 192kbit/s音质。

所有这些算法最终都在1992年成为了MPEG的第一个标准组MPEG-1的一部分,并且生成了1993年公布的国际标准ISO/IEC 11172-3。MPEG音频上的更进一步的工作最终成为了1994年制定的第二个MPEG标准组MPEG-2标准的一部分,这个标准正式的称呼是1995年首次公布的ISO/IEC 13818-3。

编码器的压缩效率通常由比特率定义,因为压缩率依赖于位数(bit depth)和输入信号的采样率。然而,经常有产品使用CD参数(44.1kHz、两个通道、每通道16位或者称为2x16位)作为压缩率参考,使用这个参考的压缩率通常较高,这也说明了压缩率对于有损压缩存在的问题。

Karlheinz Brandenburg使用CD介质的Suzanne Vega的歌曲Tom’s Diner来评价MP3压缩算法。使用这首歌是因为这首歌的柔和、简单旋律使得在回放时更容易听到压缩格式中的缺陷。一些人开玩笑地将Suzanne Vega称为“MP3之母”。来自于EBU V3/SQAM参考CD的更多一些严肃和critical音频选段(钟琴,三角铁,手风琴,…)被专业音频工程师用来评价MPEG音频格式的主观感受质量。

MP3走向大众 为了生成位兼容的MPEG Audio文件(Layer 1、Layer 2、Layer 3),ISO MPEG Audio委员会成员用C语言开发的一个称为ISO 11172-5的参考模拟软件。在一些非实时操作系统上它能够演示第一款压缩音频基于DSP的实时硬件解码。一些其他的MPEG Audio实时开发出来用于面向消费接收机和机顶盒的数字广播(无线电DAB和电视DVB)。

后来,1994年7月7日Fraunhofer-Gesellschaft发布了第一个称为l3enc的MP3编码器。

Fraunhofer开发组在1995年7月14日选定扩展名:”.mp3”(以前扩展名是”.bit”)。使用第一款实时软件MP3播放器Winplay3(1995年9月9日发布)许多人能够在自己的个人电脑上编码和回放MP3文件。由于当时的硬盘相对较小(如500MB),这项技术对于在计算机上存储娱乐音乐来说是至关重要的。

MP2、MP3与因特网 1993年10月,MP2(MPEG-1 Audio Layer 2)文件在因特网上出现,它们经常使用Xing MPEG Audio Player播放,后来又出现了Tobias Bading为Unix开发的MAPlay。MAPlay于1994年2月22日首次发布,现在已经移植到微软视窗平台上。

刚开始仅有的MP2编码器产品是Xing Encoder和CDDA2WAV,CDDA2WAV是一个将CD音轨转换成WAV格式的CD抓取器。

Internet Underground Music Archive(IUMA)通常被认为是在线音乐革命的鼻祖,IUMA是因特网上第一个高保真音乐网站,在MP3和网络流行之前它有数千首授权的MP2录音。

从1995年上半年开始直到整个九十年代后期,MP3开始在因特网上蓬勃发展。MP3的流行主要得益于如Nullsoft于1997年发布的Winamp和于1999年发布的Napster,这样的公司和软件包的成功,并且它们相互促进发展。这些程序使得普通用户很容易地播放、制作、共享和收集MP3文件。

关于MP3文件的点对点技术文件共享的争论在最近几年迅速蔓延—这主要是由于压缩使得文件共享成为可能,未经压缩的文件过于庞大难于共享。由于MP3文件通过因特网大量传播,一些主要唱片厂商通过法律起诉Napster来保护它们的版权(参见知识产权)。

如iTunes Store这样的商业在线音乐发行服务通常选择其他或者专有的支持数字版权管理(DRM)的音乐文件格式以控制和限制数字音乐的使用。支持DRM的格式的使用是为了防止受版权保护的素材免被侵犯版权,但是大多数的保护机制都能被一些方法破解。这些方法能够被计算机高手用来生成能够自由复制的解锁文件。如果希望得到一个压缩的音频文件,这个录制的音频流必须进行压缩且代价是音质的降低。 比特率 比特率对于MP3文件来说是可变的。总的原则是比特率越高则声音文件中包含的原始声音信息越多,这样回放时声音质量也越高。在MP3编码的早期,整个文件使用一个固定的比特率,称为固定码率(CBR)。

MPEG-1 Layer 3允许使用的比特率是32、40、48、56、64、80、96、112、128、160、192、224、256和320 kbit/s,允许的采样频率是32、44.1和48kHz。44.1kHz是最为经常使用的速度(与CD的采样速率相同),128kbit/s是事实上“好品质”的标准,尽管320kbit/s在P2P文件共享网络上越来越受到欢迎。MPEG-2和[非正式的]MPEG-2.5包括其他一些比特率:6、12、24、32、40、48、56、64、80、96、112、128、144、160kbit/s。

可变码率(VBR)也是可能的。MP3文件的中的音频切分成有自己不同比特率的帧,这样在文件编码的时候就可以动态地改变比特率。尽管在最初的实现中并没有这项功能。VBR技术现在音频/视频编码领域已经得到了广泛的应用,这项技术使得在声音变化大的部分使用较大的比特率而在声音变化小的部分使用较小的比特率成为可能。这个方法类似于声音控制的磁带录音机不记录静止部分节省磁带消耗。一些编码器在很大程度上依赖于这项技术。

高达640kbit/s的比特率可以使用LAME编码器和自由格式来实现,但是由于它并非标准比特率之一,有些低端或早期的MP3播放器不能够播放这些文件。

MP3的音频质量 因为MP3是一种有损压缩格式,它提供了多种不同“比特率”(bit rate)的选项—也就是用来表示每秒音频所需的编码数据位数。典型的速度介于128kbps和320kbps(kbit/s)之间。与此对照的是,CD上未经压缩的音频比特率是1411.2 kbps(16位/采样点× 44100采样点/秒× 2通道)。

使用较低比特率编码的MP3文件通常回放质量较低。使用过低的比特率,“压缩噪声(compression artifact)”(原始录音中没有的声音)将会在回放时出现。说明压缩噪声的一个好例子是:压缩欢呼的声音;由于它的随机性和急剧变化,所以编码器的错误就会更明显,并且听起来就象回声。

除了编码文件的比特率之外;MP3文件的质量,也与编码器的质量以及编码信号的难度有关。使用优质编码器编码的普通信号,一些人认为128kbit/s的MP3以及44.1kHz的CD采样的音质近似于CD音质,同时得到了大约11:1的压缩率。在这个比率下正确编码的MP3只能够获得比调频广播更好的音质,这主要是那些模拟介质的带宽限制、信噪比和其他一些限制。然而,听力测试显示经过简单的练习测试听众能够可靠地区分出128kbit/s MP3与原始CD的区别[来源请求]。在许多情况下他们认为MP3音质不佳是不可接受的,然而其他一些听众或者换个环境(如在嘈杂的车中或者聚会上)他们又认为音质是可接受的。很显然,MP3编码的瑕疵在低端声卡或者扬声器上比较不明显,而在连接到计算机的高质量立体声系统,尤其是使用高保真音响设备或者高质量的耳机时则比较明显。

Fraunhofer Gesellschaft(FhG)在他们的官方网站上,公布了下面的MPEG-1 Layer 1/2/3的压缩率和数据速率用于比较:

  • Layer 1: 384 kbit/s,压缩率4:1
  • Layer 2: 192 - 256 kbit/s,压缩率8:1-6:1
  • Layer 3: 112 - 128 kbit/s,压缩率12:1-10:1 不同层面之间的差别是因为它们使用了不同的心理声学模型导致的;Layer 1的算法相当简单,所以透明编码就需要更高的比特率。然而,由于不同的编码器使用不同的模型,很难进行这样的完全比较。

许多人认为所引用的速率,出于对Layer 2和Layer 3记录的偏爱,而出现了严重扭曲。他们争辩说实际的速率如下所列:

  • Layer 1: 384 kbit/s优秀
  • Layer 2: 256 - 384 kbit/s优秀,224 - 256 kbit/s很好,192 - 224 kbit/s好
  • Layer 3: 224 - 320 kbit/s优秀,192 - 224 kbit/s很好,128 - 192 kbit/s好

当比较压缩机制时,很重要的是要使用同等音质的编码器。将新编码器与基于过时技术甚至是带有缺陷的旧编码器比较可能会产生对于旧格式不利的结果。由于有损编码会丢失信息这样一个现实,MP3算法通过创建人类听觉总体特征的模型尽量保证丢弃的部分不被人耳识别出来(例如,由于noise masking),不同的编码器能够在不同程度上实现这一点。

一些可能的编码器:

  • Mike Cheng在1998年早些时候首次开发的LAME。与其他相比,它是一个完全遵循LGPL的MP3编码器,它有良好的速度和音质,甚至对MP3技术的后继版本形成了挑战[来源请求]。
  • Fraunhofer Gesellschaft:有些编码器不错,有些有缺陷。 有许多的早期编码器现在已经不再广泛使用:
  • ISO dist10
  • Xing
  • BladeEnc
  • ACM Producer Pro.

好的编码器能够在128到160kbit/s下达到可接受的音质,在160到192kbit/s下达到接近透明的音质。所以不在特定编码器或者最好的编码器话题内说128kbit/s或者192kbit/s下的音质是容易引起误解的。一个好的编码器在128kbit/s下生成的MP3有可能比一个不好的编码器在192kbit/s下生成的MP3音质更好。另外,即使是同样的编码器同样的文件大小,一个不变比特率的MP3可能比一个变比特率的MP3音质要差很多。

需要注意的一个重要问题是音频信号的质量是一个主观判断。安慰效果(Placebo effect)是很严重的,许多用户声明要有一定水准的透明度。许多用户在A/B测试中都没有通过,他们无法在更低的比特率下区分文件。一个特定的比特率对于有些用户来说是足够的,对于另外一些用户来说是不够的。每个人的声音感知可能有所不同,所以一个能够满足所有人的特定心理声学模型并不明显存在。仅仅改变试听环境,如音频播放系统或者环境可能就会显现出有损压缩所产生的音质降低。上面给出的数字只是大多数人的一个大致有效参考,但是在有损压缩领域真正有效的压缩过程质量测试手段就是试听音频结果。

如果你的目标是实现没有质量损失的音频文件或者用在演播室中的音频文件,就应该使用无损压缩(Lossless)算法,目前能够将16位PCM音频数据压缩到38%并且声音没有任何损失,这样的无损压缩编码有LA、Sony ATRAC Advanced Lossless、Dolby TrueHD、DTS Master Lossless Audio、MLP、Sony Reality Audio、WavPack、Apple Lossless、TTA、FLAC、Windows Media Audio 9 Lossless(WMA)和APE(Monkey’s Audio)等等。

对于需要进行编辑、混合处理的音频文件要尽量使用无损格式,否则有损压缩产生的误差可能在处理后无法预测,多次编码产生的损失将会混杂在一起,在处理之后进行编码这些损失将会变得更加明显。无损压缩在降低压缩率的代价下能够达到最好的结果。

一些简单的编辑操作,如切掉音频的部分片段,可以直接在MP3数据上操作而不需要重新编码。对于这些操作来说,只要使用合适的软件(”mp3DirectCut”和”MP3Gain”),上面提到的问题可以不必考虑。

MP3的设计限制 MP3格式存有设计限制,即使使用更好的编码器仍旧不能克服这些限制。一些新的压缩格式如AAC、Ogg Vorbis等不再有这些限制。

按照技术术语,MP3有如下一些限制:

  • 编码的比特率位速最高质量可达320Kbps,基本不损失原本音效质量[4]。
  • 时间分辨率相对于变化迅速的信号来说太低。
  • 采样频率最高为48kHz,对于超过48kHz采样频率的音频无法编码在MP3内,而CD经常使用的采样速率为44.1kHz。
  • 联合立体声(Joint stereo)是基于帧与帧完成的。
  • 没有定义编码器/解码器的整体时延,这就意味着gapless playback缺少一个正式的规定。 然而,即使有这些限制,一个经良好的调整MP3编码器仍能够提供与其他格式相提并论或更高的编码质量。

MPEG-1标准中没有MP3编码器的一个精确规范,然而与此相反,解码算法和文件格式却进行了细致的定义。人们设想编码的实现是设计自己的适合去除原始音频中部分信息的算法(或者是它在频域中的修正离散余弦(MDCT)表示)。在编码过程中,576个时域样本被转换成576个频域样本,如果是瞬变信号就使用192而不是576个采样点,这是限制量化噪声随着随瞬变信号短暂扩散。

这是听觉心理学的研究领域:人类主观声音感知。

这样带来的结果就是出现了许多不同的MP3编码器,每种生成的声音质量都不相同。有许多它们的比较结果,这样一个潜在用户很容易选择合适的编码器。需要记住的是高比特率编码表现优秀的编码器(如LAME这个在高比特率广泛使用的编码器)未必在低比特率的表现也同样好。

MP3音频编码 MPEG-1标准中没有MP3编码器的一个精确规范,然而与此相反,解码算法和文件格式却进行了细致的定义。人们设想编码的实现是设计自己的适合去除原始音频中部分信息的算法(或者是它在频域中的修正离散余弦(MDCT)表示)。在编码过程中,576个时域样本被转换成576个频域样本,如果是瞬变信号就使用192而不是576个采样点,这是限制量化噪声随着随瞬变信号短暂扩散。

这是听觉心理学的研究领域:人类主观声音感知。

这样带来的结果就是出现了许多不同的MP3编码器,每种生成的声音质量都不相同。有许多它们的比较结果,这样一个潜在用户很容易选择合适的编码器。需要记住的是高比特率编码表现优秀的编码器(如LAME这个在高比特率广泛使用的编码器)未必在低比特率的表现也同样好。

MP3音频解码 另一方面,解码在标准中进行了细致的定义。

多数解码器是bitstream compliant,也就是说MP3文件解码出来的非压缩输出信号将与标准文档中数学定义的输出信号一模一样(在规定的近似误差范围内)。

MP3文件有一个标准的格式,这个格式就是包括384、576、或者1152个采样点(随MPEG的版本和层不同而不同)的帧,并且所有的帧都有关联的头信息(32位)和辅助信息(9、17或者32字节,随着MPEG版本和立体声或者单通道的不同而不同)。头和辅助信息能够帮助解码器正确地解码相关的霍夫曼编码数据。

所以,大多数的解码器比较几乎都是完全基于它们的计算效率(例如,它们在解码过程中所需要的内存或者CPU时间)。

关于VBR VBR:MP3格式的文件有一个有意思的特征,就是可以边读边放,这也符合流媒体的最基本特征。也就是说播放器可以不用预读文件的全部内容就可以播放,读到哪里播放到哪里,即使是文件有部分损坏。虽然mp3可以有文件头,但对于mp3格式的文件却不是很重要,正因为这种特性,决定了MP3文件的每一段每一帧都可以单独的平均数据速率,而无需特别的解码方案。于是出现了一种叫VBR(Variable bitrate,动态数据速率)的技术,可以让MP3文件的每一段甚至每一帧都可以有单独的bitrate,这样做的好处就是在保证音质的前提下最大程度的限制了文件的大小。这种技术的优越性是显而易见的,但要运用确实是一件难事,因为这要求编码器知道如何为每一段分配bitrate,这对没有波形分析的编码器而言,这种技术如同虚设。正是如此,VBR技术并没有一出现就显得光彩夺目。 专家们通过长期的声学研究,发现人耳存在 遮蔽效应。声音信号实际是一种能量波,在空气或其他媒介中传播,人耳对声音能量的多少即响度或声压最直接的反应就是听到这个声音的大小,我们称它为响度,表示响度这种能量的单位为分贝(dB)。即使是同样响度的声音,人们也会因为它们频率不同而感觉到声音大小不同。人耳最容易听到的就是4000Hz的频率,不管频率是否增高或降低,即使是响度在相同的情况下,大家都会觉得声音在变小。但响度降到一定程度时,人耳就听不到了,每一个频率都有着不同的值。 可以看到这条曲线基本成一个V字型,当频率超过15000Hz时,人耳的会感觉到声音很小,很多听觉不是很好的人,根本就听不到20000Hz的频率,不管响度有多大。当人耳同时听到两个不同频率、不同响度的声音时,响度较小的那个也会被忽略,例如:在白天我们很难听到电脑中散热风扇的声音,晚上却成了噪声源,根据这种原理,编码器可以过滤掉很多听不到的声音,以简化信息复杂度,增加压缩比,而不明显的降低音质。这种遮蔽被称为同时遮蔽效应。但声音A被声音B遮蔽,如果A处于B为中心的遮蔽范围内,遮蔽会更明显,这个范围叫临界带宽。每一种频率的临界带宽都不一样,频率越高的临界带宽越宽。

频率(Hz) 临界带宽(Hz) 频率(Hz) 临界带宽(Hz) 根据这种效应,专家们设计出人耳听觉心理模型,这个模型被导入到mp3编码中后,导致了一场翻天覆地的音质革命,mp3编码技术一直背负着音质差的恶名,但这个恶名现在已经逐渐被洗脱。到了此时,一直被埋没的VBR技术光彩四射,配合心理模型的运用便现实出强大的诱惑力与杀伤力。 长期来,很多人对MP3印象不好,更多人认为WMA的最佳音质要好过MP3,这种说法是不正确的,在中高码率下,编码得当的MP3要比WMA优秀很多,可以非常接近CD音质,在不太好的硬件设备支持下,没有多少人可以区分两者的差异,这不是神话故事,尽管你以前盲听就可以很轻松区分MP3和CD,但现在你难保证你可以分辨正确。因为MP3是优秀的编码,以前被埋没了。

OGG编码

网络上出现了一种叫Ogg Vorbis的音频编码,号称MP3杀手!Ogg Vorbis究竟什么来头呢?OGG是一个庞大的多媒体开发计划的项目名称,将涉及视频音频等方面的编码开发。整个OGG项目计划的目的就是向任何人提供完全免费多媒体编码方案!OGG的信念就是:OPEN!FREE!Vorbis这个词汇是特里·普拉特柴特的幻想小说《Small Gods》中的一个”花花公子”人物名。这个词汇成为了OGG项目中音频编码的正式命名。目前Vorbis已经开发成功,并且开发出了编码器。 Ogg Vorbis是高质量的音频编码方案,官方数据显示:Ogg Vorbis可以在相对较低的数据速率下实现比MP3更好的音质!Ogg Vorbis这种编码也远比90年代开发成功的MP3先进,它可以支持多声道,这意味着什么?这意味着Ogg Vorbis在SACD、DTSCD、DVD AUDIO抓轨软件(目前这种软件还没有)的支持下,可以对所有的声道进行编码,而不是MP3只能编码2个声道。多声道音乐的兴起,给音乐欣赏带来了革命性的变化,尤其在欣赏交响时,会带来更多临场感。这场革命性的变化是MP3无法适应的。 和MP3一样,Ogg Vorbis是一种灵活开放的音频编码,能够在编码方案已经固定下来后还能对音质进行明显的调节和新算法的改良。因此,它的声音质量将会越来越好,和MP3相似,Ogg Vorbis更像一个音频编码框架,可以不断导入新技术逐步完善。和MP3一样,OGG也支持VBR。

MPC编码

MPC是又是另外一个令人刮目相看的实力派选手,它的普及过程非常低调,也没有什么复杂的背景故事,她的出现目的就只有一个,更小的体积更好的音质!MPC以前被称作MP+,很显然,可以看出她针对的竞争对手是谁。但是,只要用过这种编码的人都会有个深刻的印象,就是她出众的音质。

mp3PRO编码

2001年6月14日,美国汤姆森多媒体公司(Thomson Multimedia SA)与佛朗赫弗协会(Fraunhofer Institute)于6月14日发布了一种新的音乐格式版本,名称为mp3PRO,这是一种基于mp3编码技术的改良方案,从官方公布的特征看来确实相当吸引人。从各方面的资料显示,mp3PRO并不是一种全新的格式,完全是基于传统mp3编码技术的一种改良,本身最大的技术亮点就在于SBR(Spectral Band Replication 频段复制),这是一种新的音频编码增强算法。它提供了改善低位率情况下音频和语音编码的性能的可能。这种方法可在指定的位率下增加音频的带宽或改善编码效率。SBR最大的优势就是在低数据速率下实现非常高效的编码,与传统的编码技术不同的是,SBR更像是一种后处理技术,因此解码器的算法的优劣直接影响到音质的好坏。高频实际上是由解码器(播放器)产生的,SBR编码的数据更像是一种产生高频的命令集,或者称为指导性的信号源,这有点駇idi的工作方式。我们可以看到,mp3PRO其实是一种mp3信号流和SBR信号流的混合数据流编码。有关资料显示,SBR技术可以改善低数据流量下的高频音质,改善程度约为30%,我们不管这个30%是如何得来的,但可以事先预知这种改善可以让64kbps的mp3达到128kbps的mp3的音质水平(注:在相同的编码条件下,数据速率的提升和音质的提升不是成正比的,至少人耳听觉上是这样的),这和官方声称的64kbps的mp3PRO可以媲美128kbps的mp3的宣传基本是吻合的。

WMA格式

WMA就是Windows Media Audio编码后的文件格式,由微软开发,WMA针对的不是单机市场,是网络!竞争对手就是网络媒体市场中著名的Real Networks。微软声称,在只有64kbps的码率情况下,WMA可以达到接近CD的音质。和以往的编码不同,WMA支持防复制功能,她支持通过Windows Media Rights Manager 加入保护,可以限制播放时间和播放次数甚至于播放的机器等等。WMA支持流技术,即一边读一边播放,因此WMA可以很轻松的实现在线广播,由于是微软的杰作,因此,微软在Windows中加入了对WMA的支持,WMA有着优秀的技术特征,在微软的大力推广下,这种格式被越来越多的人所接受。

RA格式

RA就是RealAudio格式,这是各位网虫接触得非常多的一种格式,大部分音乐网站的在线试听都是采用了RealAudio,这种格式完全针对的就是网络上的媒体市场,支持非常丰富的功能。最大的闪烁点就是这种格式可以根据听众的带宽来控制自己的码率,在保证流畅的前提下尽可能提高音质。RA可以支持多种音频编码,包括ATRAC3。和WMA一样,RA不但都支持边读边放,也同样支持使用特殊协议来隐匿文件的真实网络地址,从而实现只在线播放而不提供下载的欣赏方式。这对唱片公司和唱片销售公司很重要,在各方的大力推广下,RA和WMA是目前互联网上,用于在线试听最多的音频媒体格式。

APE格式

APE是Monkey’s Audio提供的一种无损压缩格式。Monkey’s Audio提供了Winamp的插件支持,因此这就意味着压缩后的文件不再是单纯的压缩格式,而是和MP3一样可以播放的音频文件格式。这种格式的压缩比远低于其他格式,但能够做到真正无损,因此获得了不少发烧用户的青睐。在现有不少无损压缩方案种,APE是一种有着突出性能的格式,令人满意的压缩比以及飞快的压缩速度,成为了不少朋友私下交流发烧音乐的唯一选择。

格式特点

各种各样的音频编码都有其技术特征及不同场合的适用性,我们大致讲解一下如何去灵活应用这些音频编码。

PCM编码的WAV

前面就提到过,PCM编码的WAV文件是音质最好的格式,Windows平台下,所有音频软件都能够提供对她的支持。Windows提供的WinAPI中有不少函数可以直接播放wav,因此,在开发多媒体软件时,往往大量采用wav,用作事件声效和背景音乐。PCM编码的wav可以达到相同采样率和采样大小条件下的最好音质,因此,也被大量用于音频编辑、非线性编辑等领域。

  • 特点:音质非常好,被大量软件所支持。
  • 适用于:多媒体开发、保存音乐和音效素材。

MP3

MP3具有不错的压缩比,使用LAME编码的中高码率的mp3,听感上已经非常接近源WAV文件。使用合适的参数,LAME编码的MP3很适合于音乐欣赏。由于MP3推出年代已久,加之还算不错的音质及压缩比,不少游戏也使用mp3做事件音效和背景音乐。几乎所有著名的音频编辑软件也提供了对MP3的支持,可以将mp3象wav一样使用,但由于mp3编码是有损的,因此多次编辑后,音质会急剧下降,mp3并不适合保存素材,但作为作品的demo确实相当优秀的。mp3长远的历史和不错的音质,使之成为应用最广的有损编码之一,网络上可以找到大量的mp3资源,mp3player日渐成为一种时尚。不少VCDPlayer、DVDPlayer甚至手机都可以播放mp3,mp3是被支持的最好的编码之一。MP3也并非完美,在较低码率下表现不好。MP3也具有流媒体的基本特征,可以做到在线播放。

  • 特点:音质好,压缩比比较高,被大量软件和硬件支持,应用广泛。
  • 适用于:适合用于比较高要求的音乐欣赏。

OGG

Ogg是一种非常有潜力的编码,在各种码率下都有比较惊人的表现,尤其中低码率下。Ogg除了音质好之外,她还是一个完全免费的编码,这对ogg被更多支持打好了基础。Ogg有着非常出色的算法,可以用更小的码率达到更好的音质,128kbps的Ogg比192kbps甚至更高码率的mp3还要出色。Ogg的高音具有一定的金属味道,因此在编码一些高频要求很高的乐器独奏时,Ogg的这个缺陷会暴露出来。OGG具有流媒体的基本特征,但现在还没有媒体服务软件支持,因此基于ogg的数字广播还无法实现。Ogg目前的被支持的情况还不够好,无论是软件的还是硬件的,都无法和mp3相提并论。

  • 特点:可以用比mp3更小的码率实现比mp3更好的音质,高中低码率下均具有良好的表现。
  • 适用于:用更小的存储空间获得更好的音质(相对MP3)。

MPC

和OGG一样,MPC的竞争对手也是mp3,在中高码率下,MPC可以做到比竞争对手更好音质,在中等码率下,MPC的表现不逊色于Ogg,在高码率下,MPC的表现更是独孤求败,MPC的音质优势主要表现在高频部分,MPC的高频要比MP3细腻不少,也没有Ogg那种金属味道,是目前最适合用于音乐欣赏的有损编码。由于都是新生的编码,和Ogg际遇相似,也缺乏广泛的软件和硬件支持。MPC有不错的编码效率,编码时间要比OGG和LAME短不少。

  • 特点:中高码率下,具有有损编码中最佳的音质表现,高码率下,高频表现极佳。
  • 适用于:在节省大量空间的前提下获得最佳音质的音乐欣赏。

    WMA

    微软开发的WMA同样也是不少朋友所喜爱的,在低码率下,有着好过mp3很多的音质表现,WMA的出现,立刻淘汰了曾经风靡一时的VQF编码。有微软背景的WMA获得了很好的软件及硬件支持,Windows Media Player就能够播放WMA,也能够收听基于WMA编码技术的数字电台。因为播放器几乎存在于每一台PC上,越来越多的音乐网站都乐意使用WMA作为在线试听的首选了。除了支持环境好之外,WMA在64-128kbps码率下也具有相当出色的表现,虽然不少要求较高的朋友并不够满意,但更多要求不高的朋友接受了这种编码,WMA很快的普及开了。
  • 特点:低码率下的音质表现难有对手。
  • 适用于:数字电台架设、在线试听、低要求下的音乐欣赏。

mp3PRO

作为mp3的改良版本的mp3PRO表现出了相当不错的素质,高音丰满,虽然mp3PRO是通过SBR技术在播放过程中插入的,但实际听感相当不错,虽然显得有点单薄,但在64kbps的世界里已经没有对手了,甚至超过了128kbps的mp3,但很遗憾的是,mp3PRO的低频表现也象mp3一样的破,所幸的是,SBR的高频插值可以或多或少的掩盖掉这个缺陷,因此mp3PRO的低频弱势反而不如WMA那么明显。大家可以在使用RCA mp3PRO Audio Player的PRO开关来切换PRO模式和普通模式时深深的感觉到。整体而言,64kbps的mp3PRO达到了128kbps的mp3的音质水平,在高频部分还略有胜出。

  • 特点:低码率下的音质之王。
  • 适用于:低要求下的音乐欣赏。

APE

一种新兴的无损音频编码,可以提供50-70%的压缩比,虽然比起有损编码来太不值得一提了,但对于追求完美音质的朋友简直是天大的福音。APE可以做到真正的无损,而不仅是听起来无损,压缩比也要比类似的无损格式要好。

  • 特点:音质非常好。
  • 适用于:最高品质的音乐欣赏及收藏。

相关算法

音量计算

音量值计算:db=20*lg(x/2^15),其中x表示样点幅度值,db表示分贝值。

声音是一种波,PCM数据是波形的描述,音量值表示波的能量,和波的振幅相关,和各点的相对差值有关。16bits的采样值表示范围是-3276832767。把每个点依次连接起来就是声音的波形了。求音量先将数据转换成-11之间(因为位率是是精度表示,要转换成相对最大值的比例),进行傅立叶变换,提高速度使用快速傅立叶变换(FFT),求出当时的频谱图,就是各个频率的音量大小。求平均就是总音量。

FFT变换有实部数据和虚部数据,其能量值是(实部实部+虚部虚部)的开方,而声音的大小是分贝,20lg(能量值),所以频谱图各音量是10lg(实部实部+虚部虚部)

音频编码技术比较

image 说明:质量评价共五个等级(1、2、3、4、5),其中5.0为最高分。 上表中各种算法、应用领域中缩略语的中文和英文全称参见下面说明。

  • PCM:Pulse Code Modulation,脉冲编码调制。
  • ADPCM:Adaptive Differential Pulse Code Modulation,自适应差分脉冲编码调制。
  • SB-ADPCM:Subband Adaptive Differential Pulse Code Modulation,子带-自适应差分脉冲编码调制。
  • LPC:Linear Predictive Coding,线性预测编码。
  • CELPC:Code Excited Linear Predictive Coding,码激励线性预测编码。
  • VSELPC:Vector Sum Excited Linear Predictive Coding,矢量和激励线性预测编码。
  • RPE-LTP:Regular Pulse Excited-Long Term Predictive,规则脉冲激励长时预测。
  • LD-CELP:Low Delay-Code Excited Linear Predictive,低时延码激励线性预测。
  • MPE:Multi-Pulse Excited,多脉冲激励。
  • PSTN:Public Switched Telephone Network,公共交换电话网。
  • ISDN:Integrated Services Digital Network,综合业务数字网。

Android Audio相关api

  • AcousticEchoCanceler:回声消除器
  • AutomaticGainControl:自动增强控制器
  • NoiseSuppressor:噪音抑制器
  • BassBoost:重低音调节器
  • Equalizer:均衡器
  • PresetReverb:预设音场控制器
  • Visualizer:示波器

多媒体技术(一)之图形图像

发表于 2017-06-20 | 分类于 media

1.图形与图像的基本概念

1.1图形与图像的颜色模型

1.1.1颜色的基本概念

1.1.1.1 物体的颜色

物体的颜色不同是因为他们对光的吸收和反射的属性不同.物体的颜色是由该物体所反射的光的波长来决定的.

人眼看到的物体的颜色不仅取决于该物体所反射的光的波长,还与照射它的光源有关.如果用单一蓝色去照射绿色的树叶, 则此时的树叶只能是黑色的.因为蓝色光源中没有绿色成分,树叶吸收了全部蓝色而呈现黑色.

在彩色显示器中,为了使颜色具有较好的还原度和真实感,通常采用类似自然光作为照明光源.

1.1.1.2 彩色三要素

颜色信息对人的视觉反应,可通过色调,色饱和度和亮度这三个参量来表示:

  • 色调:用来描述颜色的不同类别的物理量称为色调,如红,橙,黄,绿,青,蓝,紫.色调取决于该种颜色的主要波长.
  • 色饱和度:色饱和度则是描述颜色的深浅程度的物理量,它按该种颜色混入白光的比例来表示,当某色光的饱和度为100%时,就是表示该色光是完全没有混入白色光的单色光饱和度越高则颜色也越浓.如果大量混入白色光使饱和度降低,人视觉会感到颜色变淡.例如,在浓的的红色光中混入大量的白光,由于饱和度降低就变成了粉红色,但是因为红色是基本色,所以色调并不改变.在某颜色中混入白光与增强白光对某颜色物体的照射是不同的.前者是在摄入人眼的眸色光中混入白光,而后者的结果则是加强了某色物体的反射光的强度,在摄入人眼的反射光中并没有混入白光,因此它并没有改变该色的饱和度.
  • 亮度:用来描述色光的明暗变化的强度的物理量成为亮度.亮度是色光能量的一种描述,是指色调和色饱和度已经固定的光,当它的全部能量增强时感觉明亮,否则感觉暗淡.

色调和色饱和度统称为色度.

1.1.1.3 三基色原理

三基色原理认为自然界中景物的绝大多数的彩色光,能分解为互相独立的红(R),绿(G),蓝(B)三种基色光;反之,用互相独立的红,绿,蓝3种基色光以不同的比例混合,可模拟出自然界中绝大多数景色的光.RGB三基色相互独立的含义是指,任一种基色都不能由另外两种基色混合而产生.三基色的选择并不是唯一的.

1.1.1.4 像素(pixel)

像素是计算机图形与图像中能被单独处理的最小基本单元. 从像素的视觉属性看,它是一个最小可是单位.一幅彩色图像可以看成是由许多很小的可是点组成的,这个点就是像素.每个像素点都有确定的颜色和亮度,这个颜色就是有互相独立的红,绿,蓝三种基色光以不同的比例混合而成的. 从像素的量值属性看,它的数据结构应同时显示地址,色彩,亮度等数据信息,这些数据就称为像素值.

1.1.2 颜色模型

颜色模型(或称色彩模型)就是定量颜色方法.在不同的领域应用于图像时,为了尽可能多地,有效地描述各种颜色,往往采用不同的颜色模型,例如,用显示器这类发光物体显示时采用的是RGB模型,用打印机这类吸光物体输出图像时用CMY模型,进行彩色电视信号的显示与传输时采用YUV模型,从事艺术绘画时习惯采用HSL模型.

1.1.2.1 RGB模型

RGB模型也称为加色法混色模型.其混色规律是:以等量的红,绿,蓝基色光混合时:

  • 红 + 绿 = 黄色
  • 红 + 蓝 = 品红色
  • 绿 + 蓝 = 青色
  • 红 + 绿 + 蓝 = 白色
  • 3种基色光全无 = 黑色

加色法的混色规律可以使用下图表示,3个圆分别红绿蓝3种基色,圆与圆的叠加区域表示以等量的基色相混合时所合成的颜色,其色调如该区域的文字表示.当3种基色等量相加时,就会得到白色.其中,又尝尝把品红色成为绿色的补色,青色称为红色的补色,黄色称为蓝色的补色. image 物体的颜色是丰富多彩的,任何一种颜色和这3种基色之间的关系可以用下面的配色方程式来描述: F(物体颜色)=R(红色的百分比) + G(绿色的百分比) + B(蓝色的百分比)

由于人类的视觉特性,两种或3种基色产生混色效果,不一定要同时和同一空间位置混合.例如,在心理学实验中有一个色轮实验,它是在可旋转的圆盘上按扇形面积均等的分成3部分,并涂上3种基色,当圆盘慢慢旋转时能够分辨出3中基色,但当圆盘旋转的频率提高到闪光融合频率以上时,人眼不再能分辨出3种基色,而产生白颜色的感觉,以达到混色的效果.这就是 “时间混色法” .最初的顺序制彩色电视就应用了人的这一视觉效果.例如,很细小的红点和旅店均匀间置互相靠的很近,只有在近距离仔细观看才能区分出来,当观看距离很远时就只感觉到黄色的一篇了,这就是 “空间混色法” .目前广泛使用的彩色显像管以及大型LED真彩色广告屏就是利用了这一混色视觉效应.

在多媒体技术中,RGB颜色模型是最基本的模型,因为彩色显示器只有按RGB分量式输入,才能在显示屏幕上合成任意颜色.

1.1.2.2 CMY模型

CMY(Cyan Magenta Yellow)模型是采用青,品红,黄色3种基本颜色按一定比例合成颜色的方法.CMY模型又称为减色法混色模型,因为色彩的显示不是直接来自于光线的色彩,而是光线被物体吸收掉一部分之后发射回来的剩余光线所产生的.光线都被吸收时称为黑色,当光线都被反射时成为白色.这种模式适合于彩色打印机等用彩色墨水或颜料进行混合显示的情况.

在相减混色中,当3种基本颜色等量相减时得到黑色;等量黄色(Y)和品红(M)相减而青色为0时,等到红色(R);等量青色(C)和品红(M)相减而黄色为0时,得到蓝色(B);等量黄色(Y)和青色(C)相减而品红(M)为0时,得到绿色(G).

由于颜料的化学特性,实际上等量的CMY混合后并不能产生真正的黑色,因此在印刷时通常再加上黑色(Black),这样又称为CMYK模式,四色印刷便是由此而来.

显然,RGB与CMY模型是颜色互补的模型,它们之间可以互相转换.如果按每个像素每种颜色用一位二进制数表示的话,RGB与CMY模型之间的颜色关系如下表所示.利用它们之间的关系,可以把显示器显示的颜色转换成打印的颜色.但实际上因为发射光与反射光的性质完全不同,显示器上的颜色不可能精确地在打印机上复制出来,因此实际的转换过程会利用一定的算法进行一定程度上的失真补偿. |RGB|CMY|颜色| |—|—|—| |000|111|黑| |001|110|蓝| |010|101|绿| |011|100|青| |100|011|红| |101|010|品红| |110|001|黄| |111|000|白|

1.1.2.3 YUV与YIQ模型

在彩色电视系统中不采用RGB颜色模型,而采用YUV或YIQ模型表示彩色图像.YUV适用于PAL(Phase Altermation Line,同行倒相制式)和SECAM(法文)(Sequential C欧了让Memo,顺序传送彩色与存储制式)彩色电视制式,而YIQ适用于美国国家电视标准委员会(NTSC,National Television System Committee)彩色电视制式.

Y是亮度信号,U和V则是两个色差信号,分别传送红基色分量和蓝基色分量与亮度分量的差值信号.

采用YUV颜色模型的好处是:其一,亮度信号Y解决了彩色电视与黑白电视的兼容性问题;其二,由于人眼对颜色细节的分辨率低于对亮度细节的分辨率,所以可以用一个通道来传送,Y,U,V这3个信号,给亮度信号较大的带宽(6MHz)来传送图像的细节,而给色差信号较小的带宽(1.3MHz)来进行大面积涂色.这样,总的传输数据量和RGB模型相比,要明显小一些,起到了一种数据压缩节省存储空间的作用,而对于这种数据压缩带来的画面变化人眼一般是感觉不到的.

电视系统通常采用摄像机把摄得的彩色图像信号经分色,放大和校正分成RGB这3个分量的信号,再经过矩阵变换电路将彩色信号分解成亮度信号Y和色差信号,U,V,而后对其进行编码,用同一信道发送出去.接收端再通过编码及矩阵逆变换还原成3个基色显示.

在NTSC彩色电视制式中使用YIQ模型,其特性与YUV模型相近.其中的Y表示亮度,I,Q也是两个色差分量,但它们在色度矢量图中与U,V的位置不同.Q,I正交坐标轴与U,V正交坐标轴之间有33度夹角,如图所示:

image

I,Q与U,V之间的关系如下: I = Vcos33 - Usin33 Q = Vsin33 + Ucos33

人眼的彩色视觉特性表明,人眼分辨红与黄之间的颜色变化的能力最强,而分辨蓝,紫之间颜色变化的能力最弱.因此YIQ模型在色度矢量图中,选择I轴正好处于夹角123度处,即人眼具有最大彩色分辨率的红与黄之间的橙色和青色(相角为303度)处,选择与I轴正交的色度信号轴为Q轴(相角为33度),正是人眼最不敏感的色轴位置.因而YIQ模型传送分辨力较强的I信号时,用较宽的频带(1.3MHz~1.5MHz),传送分辨力弱的Q信号时,可用较窄的频带(0.5MHz),这就可以在保证较好的颜色传输特性情况下,最大限度地节省存储空间.

1.1.2.4 HSI颜色模型

HSI或HSL是Hue Saturation Intensity(Lightness)的英文缩写,颜色模型用H,S,I这三个参数描述颜色特性,其中H定义颜色的波长,称为色调;S表示颜色的深浅程度,称为饱和度;I表示强度或亮度,这正是颜色的三要素.

HSI模型更接近人对颜色更接近人对彩色的认识,符合人眼对颜色的感知方式,是一种从事艺术绘画的画家们习惯使用的描述色彩的方法.它比RGB模型使用更方便,从而能减少彩色图像处理的复杂性,增加快速性,因此一般的图像处理软件中,都提供了这种定量色彩的方式.

1.1.3 颜色模型的转换

无论采用什么颜色模型来表示彩色图形与图像,由于所有的显示器都需要RGB值来驱动,所以在显示每个像素之前,必须要把彩色分量值转换成RGB值.

1.1.3.1 YUV与RGB颜色模型变换

RGB与YUV的对应关系可以近似地用下面的方程表示:

  • Y = 0.299R + 0.587G + 0.114B
  • U = -0.147R - 0.289G + 0.436B
  • V = 0.615R - 0.515G - 0.096B
    1.1.3.2 YIQ与RGB颜色模型变换
    YIQ与RGB的对应关系可以近似地用下面的方程表示:
  • Y = 0.229R + 0.587G + 0.114B
  • I = 0.596R - 0.275G - 0.321B
  • Q = 0.212R - 0.523G + 0.311B
HSI 与 RGB颜色变换

HSI与RGB空间的转换关系可以用下面的方程表示:

  • H = [90 - arctan(F/sqr(3)) + [0, G>B;180,G<B]]/360
  • S = 1 - min(R,G,B)/I
  • I = (R+G+B)/3 其中,F=(2R-G-B)/(G-B),sqr为求平方根

1.2图形与图像的基本属性

一幅彩色图像可以看成二维连续函数f(x,y),其彩色幅度是位置(x,y)的函数.计算机多媒体技术从其图像的生成,显示,处理和存储的机制出发,需要对彩色图像数字化.数字化一幅彩色图像就是要把连续函数f(x,y)在空间的坐标和彩色幅度进行离散和量化.空间坐标x,y的离散化通常以分辨率来表征,而彩色幅度的离散化则由像素的颜色深度来表征.

1.2.1分辨率

分辨率是一个统称,分为显示分辨率,图像分辨率,扫描分辨率和打印分辨率等.

1.2.1.1显示分辨率

是指某一种显示方式下,显示屏上能够显示出的像素数目,以水平和垂直的像素表示.例如,显示分辨率为640*480表示显示屏分成480行,每行显示640个像素,整个显示屏就含有307200个显像点.屏幕上的像素越多,分辨率就越高,显示出来的图像也就越细腻,显示的图像质量也就约高.屏幕能够显示的最大像素数目越多,也说明显示设备的最大分辨率越高.显示屏上的每个彩色像素由代表R,G,B这3种模拟信号的相对强度决定,这些彩色像素点就构成一幅彩色图像.

1.2.1.2图像分辨率

图像分辨率指数字化图像的大小,以水平和垂直的像素数表示.如果组成图像的像素数目越多,则说明图像的分辨率越高,看起来就越逼真,图像分辨率实际上决定了图像的显示质量,也就是说,即使提高了显示分辨率,也无法真正改善图像的质量.图像分辨率与显示分辨率是两个不同的概念.图像分辨率的确定组成一幅图像的像素数目,而显示分辨率是确定显示图像的区域大小.当图像分辨率与屏幕分辨率一致时,图像正好占据满屏;当图像分辨率小于屏幕分辨率时,图像占据屏幕的一部分;当图像分辨率大于屏幕分辨率时,则屏幕仅能显示图像的一部分.

1.2.1.3扫描分辨率和打印分辨率

在用于扫描仪扫描图像时,通常要指定扫描的分辨率,用每英寸包含的点(d/i,dots per inch)表示.如果用300d/i来扫描一幅86的彩色图像,就得到一幅24001800个像素的图像.分辨率越高,像素就越多.

打印分辨率是指图像打印时每英寸可识别的点数,也使用d/i(dots per inch)为衡量单位.两种分辨率之间是有区别的,扫描分辨率反映了扫描后的图像与原始图像之间的差异程度,分辨率越高,差异越小.打印分辨率反映了打印的图像与原数字图像之间的差异程度,分辨率越接近原图像的分辨率,打印质量越高.两种分辨率的最高值都受到设备的限制.

1.2.2颜色深度

颜色深度是指图像中每个像素的颜色(或亮度)信息所占的二进制数位数,记做位/像素(b/p,bits per pixel).屏幕上的每一个像素都占有一个或多个位,用于存放与它相关的颜色信息.颜色深度决定了构成图像的每个像素可能出现的最大颜色数,因而颜色深度值越高,显示的图像色彩越丰富.反之,颜色深度太浅,会影响图像的质量,图像看起来让人觉得很粗糙和很不自然.常见颜色深度有一下5种:

  1. 4bit:这是VGA标准支持的颜色深度,共2的四次方16种颜色;
  2. 8bit:这是多媒体应用中的最低颜色深度,共2的8次方256种颜色,称为索引彩色图(由颜色查找决定);
  3. 16bit:在16bit中,用其中的15bit表示RGB这3种颜色,每种颜色5bit,用剩余的以为表示图像的其他属性,如透明度.所以16bit的颜色深度实际可以表示为2的15次方323232共32768种颜色.称为HI-Color(高彩色)图像.
  4. 24bit:用3个8bit分别表示RGB,可生成的颜色数2的24次16777216种,约16M种颜色,这已经成为真彩色;
  5. 32bit:同24bit颜色深度一样,也是用3个bit分别表示RGB这三种颜色,剩余的8bit用来表示图像的其他属性,如透明度等.

虽然像素的颜色颜色深度值越大图像色彩越丰富,但由于设备的限制,人眼分辨率的限制,不一定要追求特别深的颜色深度,一般来说,32bit的颜色深度已经足够.此外,像素颜色深度越深,所占用的存储空间越大.

一个像素的颜色深度位数除R,G,B分量占用固定bit数表示颜色外,一般要腾出1bit或几bit作为属性(Attribute)位.属性位用来指定该像素应具有的性质.例如,像素的颜色深度为32bit时,R,G,B分别用8bit表示,那么余下的8bit常称为a通道(Alpha Channel)位,或称为覆盖(Overlay)位,中断位,属性位,它用来控制该像素点的透明度.假如定义一个像素值(A,R,G,B)的4个分量(其中A为Alpha属性位数值)都用归一化的数值表示,那么像素91,1,0,0)时显示红色.当像素为(0.5,1,0,0)时,预乘的结果就变成了(0.5.0.5,0,0),这表示现在显示的红色的强度减低一半.用这种定义像素属性的办法可以实现两幅彩色图像之间的透明叠加效果.当Alpha数值很小时,渲染出来的效果是几乎透明的,如玻璃;当Alpha数值处于中间的位置时,则可以得到一种半透明的效果;当Alpha数值接近255时,是几乎不透明的效果.这种属性位的加入为实现透明和半透明的显示掉过带来了方便.

1.2.3文件的大小

图形和图像文件的大小(也称为数据量)是指在磁盘上存储整幅图像所有点的字节数(Bytes),反映了图像所需数据存储空间的大小,可按下面的公式计算: 文件字节数 = 图像分辨率 * 图像深度/8

从公式看,图像文件的大小与图像的颜色和内容无关.其实在实际应用中,为了节省存储空间,总要对图像应用某种压缩文件格式.这样,不同的图像会因为内容的不同而使文件的大小有所不同.相对于颜色层次多,图形复杂的图像文件较大.但各种图像文件的最大值(文件字节数)都不会超越由上式决定的字节数.

1.2.4 真彩色,伪彩色与直接色

  1. 真彩色(True Color):真彩色是指在组成一幅彩色图像的每个像素值中,有R,G,B这3个基色分量,每个基色分量直接决定显示设备的基色强度,这样产生的彩色称为真彩色.例如,用RGB的8:8:8方式表示一幅彩色图像,就是R,G,B都用8bit来表示,每个基色分量占一个字节,共3个字节,每个像素的颜色就是由这3字节中的数值直接决定,可生成的颜色数就是2的24次中,共计16777216中.
  2. 伪彩色(Pseudo Color) 伪彩色图像是每个像素的颜色不是由每个基色分量的数值直接决定,而是把像素值当做彩色查找表(CLUT,Color-Look-Up Table)的表项入口地址,去查找一个显示图像时使用的RGB强度值,用查找出的R,G,B强度值产生的彩色称为伪彩色.彩色查找表是一个事先制作好的表,表项入口地址也称为索引号.彩色图像本身的像素值和彩色查找表中的索引号有一个变换关系,也可以是用自己定义的变换关系.使用查找得到的数值在显示器上显示的颜色是真的,但不是图像本身真正的颜色,因此称其为伪彩色;
  3. 直接色(Direct Color):把像素值的R,G,B分量作为单独的索引值,通过相应的彩色变换表找出R,G,B各自的基色程度,用这个强度值产生的彩色称其为直接色.真彩色系统虽然也是采用R,G,B分量来决定基色强度,但这是由R,G,B经变换后决定的,这与直接用R,G,B决定基色基色强度产生的颜色就有差别.比较而言,直接色在显示器上显示彩色图像看起来更真实,更自然.

伪彩色系统是把整个像素当做查找表的索引值进行彩色变换,而直接色系统是对R,G,B分量分别采用查找表进行变换,因此伪彩色系统色彩还原度自然就查多了.

1.3图形与图像的基本类型

1.3.1位图与矢量图

  1. 位图(Bit-mapped Graphics)

  2. 矢量图(Vector Graphic)

  3. 位图和矢量图的关系

1.3.2 图形与图像的区别与联系

2.图形与图像的处理

2.1图形与图像的获取

2.1.1 图形与图像的数字化

2.1.2 图形的获取

2.1.3 图像的获取

2.2图形与图像的存储

2.2.1静态图形与图像常见文件存储格式

2.2.2 动态图形与图像常见文件存储格式

2.2.3 文件存储格式的数据结构

2.3图形与图像的显示

2.3.1映射显示原理

2.3.2硬复制设备

2.4图形与图像的处理

2.4.1 图形与图像处理的基本内容

2.4.2 图像处理实例分析-图像识别

2.4.3 图形与图像处理软件

3.计算机动画

3.1计算机动画的原理

3.2计算机动画的类型

3.3计算机动画的制作

3.4虚拟现实动画技术

4.图像术语

4.1 高反差保留

高反差保留主要是将图像中颜色、明暗反差较大两部分的交界处保留下来,比如图像中有一个人和一块石头,那么石头的轮廓线和人的轮廓线以及面部、服装等有明显线条的地方会变被保留,而其他大面积无明显明暗变化的地方则生成中灰色。要配合混合模式的使用才有实际效果 实际用途: 比如有一种算不上高清的图片,把它拉到PS中,CTRL+J复制一层,在复制的层上做高反差保留,然后将这层的混合模式(图层面板的最上端)改为“柔光”,你会发现图像的清晰度增加了。

4.2 柔光

根据混合色的情况选择使基色层图像变暗或变亮.使颜色变亮或变暗,具体取决于混合色。此效果与发散的聚光灯照在图像上相似。 如果混合色(光源)比 50%灰色亮,则图像变亮,就像被减淡了一样。如果混合色(光源)比 50%
灰色暗,则图像变暗,就象被加深了一样。用纯黑色或纯白色绘画会产生明显较暗或较亮的区域,但不会产生纯黑色或纯白色。 它的作用效果如同是打上一层色调柔和的光,因而被我们称之为柔光。作用时将上层图像以柔光的方式施加到下层。当底层图层的灰阶趋于高或低,则会调整图层合成结果的阶调趋于中间的灰阶调,而获得色彩较为柔和的合成效果。形成的结果是:图像的中亮色调区域变得更亮,暗色区域变得更暗,图像反差增大类似于柔光灯的照射图像的效果。变暗还是提亮画面颜色,取决于上层颜色信息。产生的效果类似于为图像打上一盏散射的聚光灯。如果上层颜色(光源)亮度高于50%灰,底层会被照亮(变淡)。如果上层颜色(光源)亮度低于50%灰,底层会变暗,就好像被烧焦了似的。如果直接使用黑色或白色去进行混合的话,能产生明显的变暗或者提亮效应,但是不会让覆盖区域产生纯黑或者纯白。 Soft Light模式根据背景中的颜色色调,把颜色用于变暗或加亮背景图像。例如,如果在背景图像上涂了50%黑色,这是一个从黑色到白色的梯度,那着色时梯度的较暗区域变得更暗,而较亮区域呈现出更亮的色调。

4.3 灰度图

Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。 灰度就是没有色彩,RGB色彩分量全部相等.

mac下打包qt程序成dmg

发表于 2017-06-18 | 分类于 QT
  1. 参考http://doc.qt.digia.com/4.7-snapshot/appicon.html
  2. 图片格式在线转换http://iconverticons.com/,可以生成icns格式图片。
  3. Test.pro中添加macx{ICON = Test.icns} (记得把Test.icns添加到工程中)
  4. 发布dmb包
  • QT在mac下有个发布命令:macdeployqt
  • 我的mac上macdeployqt目录如下:/Users/duobianxing/QtSDK/Desktop/Qt/4.8.1/gcc/bin
  • 将macdeployqt的路径添加到环境变量里面 终端里 vim /etc/profile(如果在保存时有问题,可以用 sudo vim /etc/profile)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #在最后添加一行,如下所示:
    # System-wide .profile for sh(1)

    if [ -x /usr/libexec/path_helper ]; then

    eval `/usr/libexec/path_helper -s`

    fi

    if [ "${BASH-no}" != "no" ]; then

    [ -r /etc/bashrc ] && . /etc/bashrc

    fi

export PATH=/Users/duobianxing/QtSDK/Desktop/Qt/4.8.1/gcc/bin:$PATH

  • cd进入到Test.app所在目录,然后执行macdeployqt extractor.app -verbose=1 -dmg,即可生成Test.dmg包。

mpeg编码seekto方法精确定位到指定帧

发表于 2017-06-18 | 分类于 media

MediaExtractor有一个方法如下:

1
2
//All selected tracks seek near the requested time according to the specified mode.
public void seekTo (long timeUs, int mode)

timeUs是要seek的时间戳,mode是seek的模式,可以是SEEK_TO_PREVIOUS_SYNC, SEEK_TO_CLOSEST_SYNC, SEEK_TO_NEXT_SYNC,分别是seek指定帧的上一帧,最近帧和下一帧。 此方法可用于视频播放时动态定位播放帧,用于动态改变视频播放进度,比如使用seekBar来跟踪视频播放进度,同时可拖动来动态改变播放进度。

mpeg编码决定seekTo方法无法精确定位到指定帧。即使使用的是某一帧精确的时间戳作为seekTo方法的输入参数也无法实现精确定位。

在google, stackoverlfow查询得出的结论是:在每次seekTo方法调用后,MediaCodec必须从关键帧开始解码。因此seekTo方法只会seek到最近的/上一个/下一个关键帧,也就是I-Frame(key frame = I frame = sync frame)。之所以要从关键帧开始解码,是因为每一帧不一定是单独编码的,只有I frame才是帧内编码,而P, B frame都是要参考别的帧来进行编码,因此单独拿出来是不完整的一帧。

stackoverflow上有人对此的做法是:seekTo的输入参数mode设置为SEEK_TO_PREVIOUS_SYNC,即seek的是指定帧的上一个关键帧。然后判断当前的时间戳是否小于定位关键帧的时间戳,如果是就调用MediaExtractor的advance方法,“快进”到指定帧。

1
2
3
4
extractor.seekTo(expectedPts, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);  
while (currentPts < expectedPts) {
extractor.advance();
}

但是这个方法仍不理想,如果seek的位置和当前位置比较远的话,会有一定延迟。而且视频内容偶尔会出现不完整的帧的闪现。 经过一段时间的研究,终于解决了这个问题,现在播放时可以根据seekBar随时拖动到视频任何一帧,不会有任何延迟,甚至可以实现倒播了。 因为之前播放视频的是自己用MediaCodec, MediaMuxer等编码合成的视频文件,在编码参数设置的时候,将关键帧间隔KEY_I_FRAME_INTERVAL设置为了1(因为要求参数为整数)。注意这个参数的单位是秒,而不是帧数!网上看到很多例子包括fadden的bigflake和Grafika上都将这里设置为了20几。搞得我一开始还以为是每隔二十几帧就有一个关键帧。如果设置为20几,那么就是说你用MediaCodec编码录制一段20多秒的视频,只有开头的一个关键帧!剩下的都是P或者B帧。 这显然是不合理的。一般来说是每隔1秒有一个关键帧,这样就可以seek到对应秒的关键帧。或者说1秒内如果有30帧,那么这30帧至少有一个关键帧。因此我将KEY_I_FRAME_INTERVAL设置为了1。

1
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);

这也是为什么我在播放用这种参数编码的视频的时候,使用seekTo方法不能准确定位帧了。之前有讲,seekTo是定位到关键帧的,如果不是关键帧,那么它会去找上一个/最近一个/下一个关键帧,这取决于你输入参数mode的设置。 因此如果想使用seekBar准确拖动定位到任何一帧播放,必须保证每一帧都是关键帧。 于是,我将KEY_I_FRAME_INTERVAL设置为了0:

1
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0);

事实也证明这样可以保证录制的每一帧都是关键帧,因此在使用seekTo方法的时候终于可以准确定位任何一帧了。拖动seekBar的时候视频内容也会立刻改变,无论是往前还是往后,都不会有任何延迟和画面不完整的情况. 但是,把视频每一帧都设置为关键帧是否合理呢?是否会占太大空间呢? 带着这个疑问,我使用ffmpeg查看了我测试使用的手机(Lenovo X2)内置相机录制的视频。 只需一行代码:

1
ffprobe -show_frames video.mp4  > frames.txt

打开frames.txt可以看到每一帧的key_frame=1,表示是关键帧

这说明了手机本来录像就是把每一帧都作为关键帧的。 当然,不能以偏概全,于是我使用iPhone 6s录制的一段普通视频和慢动作视频。使用ffmpeg查看,发现每一帧也都是关键帧(慢动作视频1秒有240帧也都全部作为关键帧也是蛮拼的)。

目前我测试的两部手机都是如此,具体为什么手机录的视频每一帧都是关键帧我也不明白。而视频文件体积大小和是否将每一帧设为关键帧似乎不成线性关系,所以将KEY_I_FRAME_INTERVAL设置为0的方案是可行的。 因此只要保证视频每帧都是关键帧,那么seekTo方法就可以精确定位指定帧了。

多媒体技术简介

发表于 2017-06-07 | 分类于 media

关键帧间隔

关键帧包含了显示帧需要的所有信息

所有的视频都至少包含一个关键帧,作为文件的第一个帧。其它的关键帧可用来改善视频的质量,不过它们也会增加文件大小。一般而言,每一秒视频至少需要使用 1 个关键帧。若使用此公式,在每秒播放 25个帧的视频中,每 25 个帧就会有 1 个关键帧。增加关键帧个数可改善质量,但是同时增加带宽和网络负载。

两种彩电视频制式:

  • NTSC (525 lines @ 59.94 Hz) 29.97 fps
  • PAL (625 lines @ 50 Hz) 25 fps

NTSC和PAL属于全球两大主要的电视广播制式,但是由于系统投射颜色影像的频率而有所不同。NTSC是National Television System Committee的缩写,其标准主要应用于日本、美国,加拿大、墨西哥等等,PAL 则是Phase Alternating Line的缩写,主要应用于中国,香港、中东地区和欧洲一带。

GOP最大可含帧数目:18 (NTSC) / 15 (PAL)

GOP是由固定模式的一系列I帧、P帧、B帧组成。 I帧编码是为了减少空间域冗余,P帧和B帧是为了减少时间域冗余。 常用的结构由15个帧组成,具有以下形式IBBPBBPBBPBBPBB。简称GOP(4,2),指的是该图像组除了一个I帧外,包含了4个P帧,并且任何两个P帧或者I、P之间都有两个B帧。

GOP(Group of Pictures)策略影响编码质量:所谓GOP,意思是画面组,一个GOP就是一组连续的画面。MPEG编码将画面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变化。没有I帧,P帧和B帧就无法解码,这就是MPEG格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。

MPEG-2 帧结构   MPEG-2压缩的帧结构有两个参数,一个是GOP(Group Of Picture)图像组的长度,一般可按编码方式从1-15;另一个是I帧和P帧之间B帧的数量,一般是1-2个。前者在理论上记录为N,即多少帧里面出现一次I帧;后者描述为多少帧里出现一次P帧,记录为M。

1…16171819
轻口味

轻口味

190 日志
27 分类
63 标签
RSS
GitHub 微博 豆瓣 知乎
友情链接
  • SRS
© 2015 - 2019 轻口味
京ICP备17018543号
本站访客数 人次 本站总访问量 次