当前位置:首页 » 文件管理 » 解压缩一帧图像

解压缩一帧图像

发布时间: 2024-10-04 18:17:00

A. 什么是JEPG

JPEG压缩技术可以说是所有图像压缩技术的基础。它适合静态图像的压缩,直接处理整个画面,压缩倍数为20-80倍,分辨率没有选择的余地。所以要等到整个压缩档案传输完成才开始进行解压缩成影像画面,而这样的方式造成传输一个高解析画面时须耗时数十秒甚至数分钟。

而MJPEG(Motion JPEG)是在JPEG基础发展起来的动态图像压缩技术,它只单独的对某一帧进行压缩,而基本不考虑视频流中不同帧之间的变化。使得可获取清晰度很高的视频图像,而且可灵活设置每路的视频清晰度和压缩帧数。其压缩后的画面还可任意剪接。但它的缺陷也非常明显,其一:丢帧现象严重、实时性差,在保证每路都必须是高清晰的前提下,很难完成实时压缩。其二:压缩效率低,存储占用空间较大。

后来又出现了多层式JPEG(ML-JPEG)压缩技术,它采取渐层式技术,先传输低解析的图档,然后再补送更细节的压缩资料,使画面品质改善。这种方式所需的时间虽然与原先的方式一样。但由于可以先看到画面,所以使用者会觉得这种方式较好。

B. 附加: FFmpeg概念理解

FFmpeg 介绍

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。

FFmpeg模块

libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;

libavcodec:用于各种类型声音/图像编解码;

libavutil:包含一些公共的工具函数;

libswscale:用于视频场景比例缩放、色彩映射转换;

libpostproc:用于后期效果处理;

ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

ffsever:一个 HTTP 多媒体即时广播串流服务器;

ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

H.264编码原理I/B/P帧

三种帧的说明

I帧:帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)

I帧特点:

1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;

2.解码时仅用I帧的数据就可重构完整图像;

3.I帧描述了图像背景和运动主体的详情;

4.I帧不需要参考其他画面而生成;

5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);

6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;

7.I帧不需要考虑运动矢量;

8.I帧所占数据的信息量比较大。

P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

P帧特点:

1.P帧是I帧后面相隔1~2帧的编码帧;

2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);

3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;

4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;

5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;

6.由于P帧是参考帧,它可能造成解码错误的扩散;

7.由于是差值传送,P帧的压缩比较高。

B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。

B帧的预测与重构

B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

B帧特点

1.B帧是由前面的I或P帧和后面的P帧来进行预测的;

2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;

3.B帧是双向预测编码帧;

4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;

5.B帧不是参考帧,不会造成解码错误的扩散。

注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧。一般来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50。可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

h264的压缩方法:

1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。

2.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;

3.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;

4.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。

帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporal compression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。

顺便说下有损(Lossy )压缩和无损(Lossy less)压缩。无损压缩也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用RLE行程编码算法。有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式,这样还会引起额外的数据丢失。

H264 NAL头解析

如果NALU对应的Slice为一帧的开始,则用4字节表示,即0x00000001;否则用3字节表示,0x000001。

NAL Header:forbidden_bit,nal_reference_bit(优先级)2bit,nal_unit_type(类型)5bit。 标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。

0:未规定

1:非IDR图像中不采用数据划分的片段

2:非IDR图像中A类数据划分片段

3:非IDR图像中B类数据划分片段

4:非IDR图像中C类数据划分片段

5:IDR图像的片段

6:补充增强信息(SEI)

7:序列参数集(SPS)

8:图像参数集(PPS)

9:分割符

10:序列结束符

11:流结束符

12:填充数据

13:序列参数集扩展

14:带前缀的NAL单元

15:子序列参数集

16 – 18:保留

19:不采用数据划分的辅助编码图像片段

20:编码片段扩展

21 – 23:保留

24 – 31:未规定

H.264的SPS和PPS串,包含了初始化H.264解码器所需要的信息参数,包括编码所用的profile,level,图像的宽和高,deblock滤波器等。

码率:256~512 kb/s

帧率:15~20fps

分辨率:1280x720(HD) 640x368(VGA) 1920x1080(UHD)

AAC(Advanced Audio Coding)

中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。

优点:相对于mp3,AAC格式的音质更佳,文件更小。

不足:AAC属于有损压缩的格式,与时下流行的APE、FLAC等无损格式相比音质存在“本质上”的差距。加之,传输速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC头上“小巧”的光环不复存在了。

音频采样率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级,22.05KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。

比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。 视频中的比特率(码率)原理与声音中的相同,都是指由模拟信号转换为数字信号后,单位时间内的二进制数据量。

信道编码中,K符号大小的信源数据块通过编码映射为N符号大小的码字,则K/N成为码率,其中假设编码前后的符号表没有变化。

FFMPEG中结构体很多。最关键的结构体可以分成以下几类:

解协议(http,rtsp,rtmp,mms)

AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)

解封装(flv,avi,rmvb,mp4)

AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。

解码(h264,mpeg2,aac,mp3)

每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。

存数据

视频的话,每个结构一般是存一帧;音频可能有好几帧

解码前数据:AVPacket

解码后数据:AVFrame

AVCodec

AVCodec是存储编解码器信息的结构体

const char *name:编解码器的名字,比较短

const char *long_name:编解码器的名字,全称,比较长

enum AVMediaType type:指明了类型,是视频,音频,还是字幕

enum AVCodecID id:ID,不重复

const AVRational *supported_framerates:支持的帧率(仅视频)

const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)

const int *supported_samplerates:支持的采样率(仅音频)

const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)

const uint64_t channel_layouts:支持的声道数(仅音频)

int priv_data_size:私有数据的大小

1.注册所有编解码器:av_register_all();

2.声明一个AVCodec类型的指针,比如说AVCodec

first_c;

3.调用av_codec_next()函数,即可获得指向链表下一个解码器的指针,循环往复可以获得所有解码器的信息。注意,如果想要获得指向第一个解码器的指针,则需要将该函数的参数设置为NULL。

AVCodecContext

这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息

如果是单纯使用libavcodec,这部分信息需要调用者进行初始化;如果是使用整个FFMPEG库,这部分信息在调用 av_open_input_file和av_find_stream_info的过程中根据文件的头信息及媒体流内的头部信息完成初始化。其中几个主要 域的释义如下:

extradata/extradata_size: 这个buffer中存放了解码器可能会用到的额外信息,在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头 信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继 续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。

time_base:

width/height:视频的宽和高。

sample_rate/channels:音频的采样率和信道数目。

sample_fmt: 音频的原始采样格式。

codec_name/codec_type/codec_id/codec_tag:编解码器的信息。

AVStream

该结构体描述一个媒体流

主要域的释义如下,其中大部分域的值可以由av_open_input_file根据文件头的信息确定,缺少的信息需要通过调用av_find_stream_info读帧及软解码进一步获取:

index/id:index对应流的索引,这个数字是自动生成的,根据index可以从AVFormatContext::streams表中索引到该流;而id则是流的标识,依赖于具体的容器格式。比如对于MPEG TS格式,id就是pid。

time_base:流的时间基准,是一个实数,该流中媒体数据的pts和dts都将以这个时间基准为粒度。通常,使用av_rescale/av_rescale_q可以实现不同时间基准的转换。

start_time:流的起始时间,以流的时间基准为单位,通常是该流中第一个帧的pts。

ration:流的总时间,以流的时间基准为单位。

need_parsing:对该流parsing过程的控制域。

nb_frames:流内的帧数目。

r_frame_rate/framerate/avg_frame_rate:帧率相关。

codec:指向该流对应的AVCodecContext结构,调用av_open_input_file时生成。

parser:指向该流对应的AVCodecParserContext结构,调用av_find_stream_info时生成。

AVFormatContext

这个结构体描述了一个媒体文件或媒体流的构成和基本信息

这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象。其中:nb_streams和streams所表示的AVStream结构指针数组包含了所有内嵌媒体流的描述;iformat和oformat指向对应的demuxer和muxer指针;pb则指向一个控制底层数据读写的ByteIOContext结构。

start_time和ration是从streams数组的各个AVStream中推断出的多媒体文件的起始时间和长度,以微妙为单位。

通常,这个结构由av_open_input_file在内部创建并以缺省值初始化部分成员。但是,如果调用者希望自己创建该结构,则需要显式为该结构的一些成员置缺省值——如果没有缺省值的话,会导致之后的动作产生异常。以下成员需要被关注:

probesize

mux_rate

packet_size

flags

max_analyze_ration

key

max_index_size

max_picture_buffer

max_delay

AVPacket

AVPacket定义在avcodec.h中

FFMPEG使用AVPacket来暂存解复用之后、解码之前的媒体数据(一个音/视频帧、一个字幕包等)及附加信息(解码时间戳、显示时间戳、时长等)。其中:

dts 表示解码时间戳,pts表示显示时间戳,它们的单位是所属媒体流的时间基准。

stream_index 给出所属媒体流的索引;

data 为数据缓冲区指针,size为长度;

ration 为数据的时长,也是以所属媒体流的时间基准为单位;

pos 表示该数据在媒体流中的字节偏移量;

destruct 为用于释放数据缓冲区的函数指针;

flags 为标志域,其中,最低为置1表示该数据是一个关键帧。

AVPacket 结构本身只是个容器,它使用data成员指向实际的数据缓冲区,这个缓冲区可以通过av_new_packet创建,可以通过    av_p_packet 拷贝,也可以由FFMPEG的API产生(如av_read_frame),使用之后需要通过调用av_free_packet释放。

av_free_packet调用的是结构体本身的destruct函数,它的值有两种情况:(1)av_destruct_packet_nofree或 0;(2)av_destruct_packet,其中,前者仅仅是将data和size的值清0而已,后者才会真正地释放缓冲区。FFMPEG内部使用 AVPacket结构建立缓冲区装载数据,同时提供destruct函数,如果FFMPEG打算自己维护缓冲区,则将destruct设为 av_destruct_packet_nofree,用户调用av_free_packet清理缓冲区时并不能够将其释放;如果FFMPEG不会再使用 该缓冲区,则将destruct设为av_destruct_packet,表示它能够被释放。对于缓冲区不能够被释放的AVPackt,用户在使用之前 最好调用av_p_packet进行缓冲区的克隆,将其转化为缓冲区能够被释放的AVPacket,以免对缓冲区的不当占用造成异常错误。而 av_p_packet会为destruct指针为av_destruct_packet_nofree的AVPacket新建一个缓冲区,然后将原 缓冲区的数据拷贝至新缓冲区,置data的值为新缓冲区的地址,同时设destruct指针为av_destruct_packet。

AVFrame

构体保存的是解码后和原始的音视频信息。AVFrame通过函数av_frame_alloc()初始化,该函数仅仅分配AVFrame实例本身,而没有分配其内部的缓存。AVFrame实例由av_frame_free()释放;AVFrame实例通常分配一次,重复使用,如分配一个AVFrame实例来保留解码器中输出的视频帧(此时应在恰当的时候使用av_frame_unref()清理参考帧并将AVFrame归零)。该类所描述的数据通常由AVBuffer的API来保存一个引用计数,并保存于AVFrame.buf

/AVFrame.extended_buf,在至少存在一个参考的时候(如AVFrame.buf[0] != NULL),则该对象被标记为“被引用”。在此情况下,AVFrame所包含的每一组数据必须包含于AVFrame的缓存中。

AAC格式ADTS

ADTS流 跟Raw流,

1.ADTS是个啥

ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式。

AAC解码器都需要把AAC的ES流打包成ADTS的格式,一般是在AAC ES流前添加7个字节的ADTS header。也就是说你可以吧ADTS这个头看作是AAC的frameheader。

ffmpeg写 mp4+aac时呢,音频有两个值得注意的地方。

1 写aac音频时,要添加两个字节的信息到AVCodecContext.

2 ffmpeg 写AAC音频数据不能含有ADTS头

在AAC ES流前添加7个字节的ADTS header。也就是说你可以吧ADTS这个头看作是AAC的frameheader。

tvOS必须要支持 bitcode. (iOS bitcode项可选的) 所以在编译的时候Makefile要加上 CFLAGS= -fembed-bitcode 。 如果用xcode编译lib,要在Build Settings—>custom compiler flags —>cflags 加上OTHER_CFLAGS="-fembed-bitcode" 。

FFmpeg优化

1 内存优化。内存往上涨。没能及时回收。最好能够使用手动管理内存。

解码优化,看ffmpeg文档,最新的解码库,解码效率,稳定性,综合性考虑。

YUV->RGB  OpenGLES shader来显示。

FFmpeg转码

1.分离视频音频流

ffmpeg -i input_file -vcodec -an output_file_video//分离视频流

ffmpeg -i input_file -acodec -vn output_file_audio//分离音频流

2.视频解复用

ffmpeg –i test.mp4 –vcodec –an –f m4v test.264

ffmpeg –i test.avi –vcodec –an –f m4v test.264

3.视频转码

ffmpeg –i test.mp4 –vcodec h264 –s 352 278 –an –f m4v test.264              //转码为码流原始文件

ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352

278 –an –f m4v test.264  //转码为码流原始文件

ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi            //转码为封装文件

//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制

4.视频封装

ffmpeg –i video_file –i audio_file –vcodec –acodec output_file

5.视频剪切

ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg        //提取图片

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec -acodec output.avi    //剪切视频

//-r 提取图像的频率,-ss 开始时间,-t 持续时间

6.视频录制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec out.avi

7.YUV序列播放

ffplay -f rawvideo -video_size 1920x1080 input.yuv

8.YUV序列转AVI

ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi

system调用

#include<stdio.h>#include<string.h>intmain(){charcommand[50];strcpy(command,"ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi");system(command);return(0);}

FFMpeg 中比较重要的函数以及数据结构如下:

数据结构:

(1) AVFormatContext

(2) AVOutputFormat

(3) AVInputFormat

(4) AVCodecContext

(5) AVCodec

(6) AVFrame

(7) AVPacket

(8) AVPicture

(9) AVStream

初始化函数:

(1) av_register_all()

(2) avcodec_open()

(3) avcodec_close()

(4) av_open_input_file()

(5) av_find_input_format()

(6) av_find_stream_info()

(7) av_close_input_file()

音视频编解码函数:

(1) avcodec_find_decoder()

(2) avcodec_alloc_frame()

(3) avpicture_get_size()

(4) avpicture_fill()

(5) img_convert()

(6) avcodec_alloc_context()

(7) avcodec_decode_video()

(8) av_free_packet()

(9) av_free()

文件操作:

(1) avnew_steam()

(2) av_read_frame()

(3) av_write_frame()

(4) mp_format()

其他函数:

(1) avpicture_deinterlace()

(2) ImgReSampleContext()

C. 监控视频压缩编解码的介绍

(一)、M-JPEG
M-JPEG(Motion- Join Photographic Experts Group)技术即运动静止图像(或逐帧)压缩技术,广泛应用于非线性编辑领域可精确到帧编辑和多层图像处理,把运动的视频序列作为连续的静止图像来处理,这种压缩方式单独完整地压缩每一帧,在编辑过程中可随机存储每一帧,可进行精确到帧的编辑,此外M-JPEG的压缩和解压缩是对称的,可由相同的硬件和软件实现。但M-JPEG只对帧内的空间冗余进行压缩。不对帧间的时间冗余进行压缩,故压缩效率不高。采用M-JPEG数字压缩格式,当压缩比7:1时,可提供相当于Betecam SP质量图像的节目。
JPEG标准所根据的算法是基于DCT(离散余弦变换)和可变长编码。JPEG的关键技术有变换编码、量化、差分编码、运动补偿、霍夫曼编码和游程编码等
M-JPEG的优点是:可以很容易做到精确到帧的编辑、设备比较成熟。缺点是压缩效率不高。
此外,M-JPEG这种压缩方式并不是一个完全统一的压缩标准,不同厂家的编解码器和存储方式并没有统一的规定格式。这也就是说,每个型号的视频服务器或编码板有自己的M-JPEG版本,所以在服务器之间的数据传输、非线性制作网络向服务器的数据传输都根本是不可能的。
(二)、MPEG系列标准
MPEG是活动图像专家组(Moving Picture Exports Group)的缩写,于1988年成立,是为数字视/音频制定压缩标准的专家组,目前已拥有300多名成员,包括IBM、SUN、BBC、NEC、INTEL、AT&T等世界知名公司。MPEG组织最初得到的授权是制定用于“活动图像”编码的各种标准,随后扩充为“及其伴随的音频”及其组合编码。后来针对不同的应用需求,解除了“用于数字存储媒体”的限制,成为现在制定“活动图像和音频编码”标准的组织。MPEG组织制定的各个标准都有不同的目标和应用,目前已提出MPEG-1、MPEG-2、MPEG-4、MPEG-7和MPEG-21标准。
1.MPEG-1标准
MPEG-1标准于1993年8月公布,用于传输1.5Mbps数据传输率的数字存储媒体运动图像及其伴音的编码。该标准包括五个部分:
第一部分说明了如何根据第二部分(视频)以及第三部分(音频)的规定,对音频和视频进行复合编码。第四部分说明了检验解码器或编码器的输出比特流符合前三部分规定的过程。第五部分是一个用完整的C语言实现的编码和解码器。
该标准从颁布的那一刻起,MPEG-1取得一连串的成功,如VCD和MP3的大量使用,Windows95以后的版本都带有一个MPEG-1软件解码器,可携式MPEG-1摄像机等等。
2.MPEG-2标准
MPEG组织于1994年推出MPEG-2压缩标准,以实现视/音频服务与应用互操作的可能性。MPEG-2标准是针对标准数字电视和高清晰度电视在各种应用下的压缩方案和系统层的详细规定,编码码率从每秒3兆比特~100兆比特,标准的正式规范在ISO/IEC13818中。MPEG-2不是MPEG-1的简单升级,MPEG-2在系统和传送方面作了更加详细的规定和进一步的完善。MPEG-2特别适用于广播级的数字电视的编码和传送,被认定为SDTV和HDTV的编码标准。
MPEG-2图像压缩的原理是利用了图像中的两种特性:空间相关性和时间相关性。这两种相关性使得图像中存在大量的冗余信息。如果我们能将这些冗余信息去除,只保留少量非相关信息进行传输,就可以大大节省传输频带。而接收机利用这些非相关信息,按照一定的解码算法,可以在保证一定的图像质量的前提下恢复原始图像。一个好的压缩编码方案就是能够最大限度地去除图像中的冗余信息。
MPEG-2的编码图像被分为三类,分别称为I帧,P帧和B帧。
I帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。P帧和B帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P帧图像中可以包含帧内编码的部分,即P帧中的每一个宏块可以是前向预测,也可以是帧内编码。B帧图像采用双向时间预测,可以大大提高压缩倍数。
MPEG-2的编码码流分为六个层次。为更好地表示编码数据,MPEG-2用句法规定了一个层次性结构。它分为六层,自上到下分别是:图像序列层、图像组(GOP)、图像、宏块条、宏块、块。
MPEG-2标准在广播电视领域中的主要应用如下:
(1)视音频资料的保存
一直以来,电视节目、音像资料等都是用磁带保存的。这种方式有很多弊端:易损,占地大,成本高,难于重新使用。更重要的是难以长期保存,难以查找、难以共享。随着计算机技术和视频压缩技术的发展,高速宽带计算机网络以及大容量数据存储系统给电视台节目的网络化存储、查询、共享、交流提供了可能。
采用MPEG-2压缩编码的DVD视盘,给资料保存带来了新的希望。电视节目、音像资料等可通过MPEG-2编码系统编码,保存到低成本的CD-R光盘或高容量的可擦写DVD-RAM上,也可利用DVD编着软件(如Daikin Scenarist NT、Spruce DVDMaestro等)制作成标准的DVD视盘,既可节约开支,也可节省存放空间。
(2)电视节目的非线性编辑系统及其网络
在非线性编辑系统中,节目素材是以数字压缩方式存储、制作和播出的, 视频压缩技术是非线性编辑系统的技术基础。目前主要有M-JPEG和MPEG-2两种数字压缩格式。
M-JPEG技术即运动静止图像(或逐帧)压缩技术,可进行精确到帧的编辑,但压缩效率不高。
MPEG-2采用帧间压缩的方式,只需进行I帧的帧内压缩处理,B帧和P帧通过侦测获得,因此 ,传输和运算的数据大多由帧之间的时间相关性得到,相对来说,数据量小,可以实现较高的压缩比。随着逐帧编辑问题的解决,MPEG-2将广泛应用于非线性编辑系统,并大大地降低编辑成本,同时MPEG-2的解压缩是标准的,不同厂家设计的压缩器件压缩的数据可由其他厂家设计解压缩器来解压缩,这一点保证了各厂家的设备之间能完全兼容。
由于采用MPEG-2 IBP视频压缩技术,数据量成倍减少,降低了存储成本,提高了数据传输速度,减少了对计算机总线和网络带宽的压力,可采用纯以太网组建非线性编辑网络系统已成为可能,而在目前以太网是最为成熟的网络,系统管理比较完善,价格也比较低廉。
基于MPEG-2的非线性编辑系统及非线性编辑网络将成为未来的发展方向。
(3)卫星传输
MPEG-2已经通过ISO认可,并在广播领域获得广泛的应用,如数字卫星视频广播(DVB-S)、DVD视盘和视频会议等。目前,全球有数以千万计的DVB-S用户,DVB-S信号采用MPEG-2压缩格式编码,通过卫星或微波进行传输,在用户端经MPEG-2卫星接收解码器解码,以供用户观看。此外,采用MPEG-2压缩编码技术,还可以进行远程电视新闻或节目的传输和交流。
(4)电视节目的播出
在整个电视技术中播出是一个承上启下的环节,对播出系统进行数字化改造是非常必要的,其中最关键一步就是构建硬盘播出系统。MPEG-2硬盘自动播出系统因编播简便、储存容量大、视频指标高等优点,而为人们所青睐。但以往MPEG-2播出设备因非常昂贵,而只有少量使用。随着MPEG-2技术的发展和相关产品成本的下降,MPEG-2硬盘自动系统播出可望得到普及。
3.MPEG-4标准
运动图像专家组MPEG 于1999年2月正式公布了MPEG-4(ISO/IEC14496)标准第一版本。同年年底MPEG-4第二版亦告底定,且于2000年年初正式成为国际标准。
MPEG-4与MPEG-1和MPEG-2有很大的不同。MPEG-4不只是具体压缩算法,它是针对数字电视、交互式绘图应用(影音合成内容)、交互式多媒体(WWW、资料撷取与分散)等整合及压缩技术的需求而制定的国际标准。MPEG-4标准将众多的多媒体应用集成于一个完整的框架内,旨在为多媒体通信及应用环境提供标准的算法及工具,从而建立起一种能被多媒体传输、存储、检索等应用领域普遍采用的统一数据格式。
MPEG-4的编码理念是:MPEG-4标准同以前标准的最显着的差别在于它是采用基于对象的编码理念,即在编码时将一幅景物分成若干在时间和空间上相互联系的视频音频对象,分别编码后,再经过复用传输到接收端,然后再对不同的对象分别解码,从而组合成所需要的视频和音频。这样既方便我们对不同的对象采用不同的编码方法和表示方法,又有利于不同数据类型间的融合,并且这样也可以方便的实现对于各种对象的操作及编辑。例如,我们可以将一个卡通人物放在真实的场景中,或者将真人置于一个虚拟的演播室里,还可以在互联网上方便的实现交互,根据自己的需要有选择的组合各种视频音频以及图形文本对象。
MPEG-4系统的一般框架是:对自然或合成的视听内容的表示;对视听内容数据流的管理,如多点、同步、缓冲管理等;对灵活性的支持和对系统不同部分的配置。
与MPEG-1、MPEG-2相比,MPEG-4具有如下独特的优点:
(1) 基于内容的交互性
MPEG-4提供了基于内容的多媒体数据访问工具,如索引、超级链接、上下载、删除等。利用这些工具,用户可以方便地从多媒体数据库中有选择地获取自己所需的与对象有关的内容,并提供了内容的操作和位流编辑功能,可应用于交互式家庭购物,淡入淡出的数字化效果等。MPEG-4提供了高效的自然或合成的多媒体数据编码方法。它可以把自然场景或对象组合起来成为合成的多媒体数据。
(2)高效的压缩性
MPEG-4基于更高的编码效率。同已有的或即将形成的其它标准相比,在相同的比特率下,它基于更高的视觉听觉质量,这就使得在低带宽的信道上传送视频、音频成为可能。同时MPEG-4还能对同时发生的数据流进行编码。一个场景的多视角或多声道数据流可以高效、同步地合成为最终数据流。这可用于虚拟三维游戏、三维电影、飞行仿真练习等
(3)通用的访问性
MPEG-4提供了易出错环境的鲁棒性,来保证其在许多无线和有线网络以及存储介质中的应用,此外,MPEG-4还支持基于内容的的可分级性,即把内容、质量、复杂性分成许多小块来满足不同用户的不同需求,支持具有不同带宽,不同存储容量的传输信道和接收端。
这些特点无疑会加速多媒体应用的发展,从中受益的应用领域有:因特网多媒体应用;广播电视;交互式视频游戏;实时可视通信;交互式存储媒体应用;演播室技术及电视后期制作;采用面部动画技术的虚拟会议;多媒体邮件;移动通信条件下的多媒体应用;远程视频监控;通过ATM网络等进行的远程数据库业务等。MPEG-4主要应用如下:
(1)应用于因特网视音频广播
由于上网人数与日俱增,传统电视广播的观众逐渐减少,随之而来的便是广告收入的减少,所以现在的固定式电视广播最终将转向基于TCP/IP的因特网广播,观众的收看方式也由简单的遥控器选择频道转为网上视频点播。视频点播的概念不是先把节目下载到硬盘,然后再播放,而是流媒体视频(streaming video),点击即观看,边传输边播放。
现在因特网中播放视音频的有:Real Networks公司的 Real Media,微软公司的 Windows Media,苹果公司的 QuickTime,它们定义的视音频格式互不兼容,有可能导致媒体流中难以控制的混乱,而MPEG-4为因特网视频应用提供了一系列的标准工具,使视音频码流具有规范一致性。因此在因特网播放视音频采用MPEG-4,应该说是一个安全的选择。
(2)应用于无线通信
MPEG-4高效的码率压缩,交互和分级特性尤其适合于在窄带移动网上实现多媒体通信,未来的手机将变成多媒体移动接收机,不仅可以打移动电视电话、移动上网,还可以移动接收多媒体广播和收看电视。
(3)应用于静止图像压缩
静止图像(图片)在因特网中大量使用,现在网上的图片压缩多采用JPEG技术。MPEG-4中的静止图像(纹理)压缩是基于小波变换的,在同样质量条件下,压缩后的文件大小约是JPEG压缩文件的十分之一。把因特网上使用的JPEG图片转换成MPEG-4格式,可以大幅度提高图片在网络中的传输速度。
(4)应用于电视电话
传统用于窄带电视电话业务的压缩编码标准,如H261,采用帧内压缩、帧间压缩、减少象素和抽帧等办法来降低码率,但编码效率和图像质量都难以令人满意。MPEG-4的压缩编码可以做到以极低码率传送质量可以接受的声像信号,使电视电话业务可以在窄带的公用电话网上实现。
(5)应用于计算机图形、动画与仿真
MPEG-4特殊的编码方式和强大的交互能力,使得基于MPEG-4的计算机图形和动画可以从各种来源的多媒体数据库中获取素材,并实时组合出所需要的结果。因而未来的计算机图形可以在MPEG-4语法所允许的范围内向所希望的方向无限发展,产生出今天无法想象的动画及仿真效果。
(6)应用于电子游戏
MPEG-4可以进行自然图像与声音同人工合成的图像与声音的混合编码,在编码方式上具有前所未有的灵活性,并且能及时从各种来源的多媒体数据库中调用素材。这可以在将来产生象电影一样的电子游戏,实现极高自由度的交互式操作。
(三)H.264
H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个新的数字视频编码标准,它既是ITU-T的H.264,又是ISO/IEC的MPEG-4的第10 部分。1998年1月份开始草案征集,1999年9月,完成第一个草案,2001年5月制定了其测试模式TML-8,2002年6月的 JVT第5次会议通过了H.264的FCD板。2003年3月正式发布。
H.264和以前的标准一样,也是DPCM加变换编码的混合编码模式。但它采用回归基本的简洁设计,不用众多的选项,获得比H.263++好得多的压缩性能;加强了对各种信道的适应能力,采用网络友好的结构和语法,有利于对误码和丢包的处理;应用目标范围较宽,以满足不同速率、不同分辨率以及不同传输(存储)场合的需求;它的基本系统是开放的,使用无需版权。
在技术上,H.264标准中有多个闪光之处,如统一的VLC符号编码,高精度、多模式的位移估计,基于4×4块的整数变换、分层的编码语法等。这些措施使得H.264算法具有很的高编码效率,在相同的重建图像质量下,能够比H.263节约50%左右的码率。H.264的码流结构网络适应性强,增加了差错恢复能力,能够很好地适应IP和无线网络的应用。 H.264的算法在概念上可以分为两层:视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示,网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送。在VCL和NAL之间定义了一个基于分组方式的接口,打包和相应的信令属于NAL的一部分。这样,高编码效率和网络友好性的任务分别由VCL和NAL来完成。
VCL层包括基于块的运动补偿混合编码和一些新特性。与前面的视频编码标准一样,H.264没有把前处理和后处理等功能包括在草案中,这样可以增加标准的灵活性。
NAL负责使用下层网络的分段格式来封装数据,包括组帧、逻辑信道的信令、定时信息的利用或序列结束信号等。例如,NAL支持视频在电路交换信道上的传输格式,支持视频在Internet上利用RTP/UDP/IP传输的格式。NAL包括自己的头部信息、段结构信息和实际载荷信息,即上层的VCL数据。(如果采用数据分割技术,数据可能由几个部分组成)。 H.264支持1/4或1/8像素精度的运动矢量。在1/4像素精度时可使用6抽头滤波器来减少高频噪声,对于1/8像素精度的运动矢量,可使用更为复杂的8抽头的滤波器。在进行运动估计时,编码器还可选择增强内插滤波器来提高预测的效果。
在H.264的运动预测中,一个宏块(MB)可以按图2被分为不同的子块,形成7种不同模式的块尺寸。这种多模式的灵活和细致的划分,更切合图像中实际运动物体的形状,大大提高了运动估计的精确程度。在这种方式下,在每个宏块中可以包含有1、2、4、8或16个运动矢量。
在H.264中,允许编码器使用多于一帧的先前帧用于运动估计,这就是所谓的多帧参考技术。例如2帧或3帧刚刚编码好的参考帧,编码器将选择对每个目标宏块能给出更好的预测帧,并为每一宏块指示是哪一帧被用于预测。 H.264与先前的标准相似,对残差采用基于块的变换编码,但变换是整数操作而不是实数运算,其过程和DCT基本相似。这种方法的优点在于:在编码器中和解码器中允许精度相同的变换和反变换,便于使用简单的定点运算方式。也就是说,这里没有反变换误差。 变换的单位是4×4块,而不是以往常用的8×8块。由于用于变换块的尺寸缩小,运动物体的划分更精确,这样,不但变换计算量比较小,而且在运动物体边缘处的衔接误差也大为减小。为了使小尺寸块的变换方式对图像中较大面积的平滑区域不产生块之间的灰度差异,可对帧内宏块亮度数据的16个4×4块的DC系数(每个小块一个,共16个)进行第二次4×4块的变换,对色度数据的4个4×4块的DC系数(每个小块一个,共4个)进行2×2块的变换。
H.264为了提高码率控制的能力,量化步长的变化的幅度控制在12.5%左右,而不是以不变的增幅变化。变换系数幅度的归一化被放在反量化过程中处理以减少计算的复杂性。为了强调彩色的逼真性,对色度系数采用了较小量化步长。 在先前的H.26x系列和MPEG-x系列标准中,都是采用的帧间预测的方式。在H.264中,当编码Intra图像时可用帧内预测。对于每个4×4块(除了边缘块特别处置以外),每个像素都可用17个最接近的先前已编码的像素的不同加权和(有的权值可为0)来预测,即此像素所在块的左上角的17个像素。显然,这种帧内预测不是在时间上,而是在空间域上进行的预测编码算法,可以除去相邻块之间的空间冗余度,取得更为有效的压缩。
如图4所示,4×4方块中a、b、...、p为16 个待预测的像素点,而A、B、...、P是已编码的像素。如m点的值可以由(J+2K+L+2)/ 4 式来预测,也可以由(A+B+C+D+I+J+K+L)/ 8 式来预测,等等。按照所选取的预测参考的点不同,亮度共有9类不同的模式,但色度的帧内预测只有4类模式。 H.264 草案中包含了用于差错消除的工具,便于压缩视频在误码、丢包多发环境中传输,如移动信道或IP信道中传输的健壮性。
为了抵御传输差错,H.264视频流中的时间同步可以通过采用帧内图像刷新来完成,空间同步由条结构编码(slice structured coding)来支持。同时为了便于误码以后的再同步,在一幅图像的视频数据中还提供了一定的重同步点。另外,帧内宏块刷新和多参考宏块允许编码器在决定宏块模式的时候不仅可以考虑编码效率,还可以考虑传输信道的特性。
除了利用量化步长的改变来适应信道码率外,在H.264中,还常利用数据分割的方法来应对信道码率的变化。从总体上说,数据分割的概念就是在编码器中生成具有不同优先级的视频数据以支持网络中的服务质量QoS。例如采用基于语法的数据分割(syntax-based data partitioning)方法,将每帧数据的按其重要性分为几部分,这样允许在缓冲区溢出时丢弃不太重要的信息。还可以采用类似的时间数据分割(temporal data partitioning)方法,通过在P帧和B帧中使用多个参考帧来完成。
在无线通信的应用中,我们可以通过改变每一帧的量化精度或空间/时间分辨率来支持无线信道的大比特率变化。可是,在多播的情况下,要求编码器对变化的各种比特率进行响应是不可能的。因此,不同于MPEG-4中采用的精细分级编码FGS(Fine Granular Scalability)的方法(效率比较低),H.264采用流切换的SP帧来代替分级编码。
四、H.264的性能比较
TML-8为H.264的测试模式,用它来对H.264的视频编码效率进行比较和测试。测试结果所提供的PSNR已清楚地表明,相对于MPEG-4(ASP:Advanced Simple Profile)和H.263++(HLP:High Latency Profile)的性能,H.264的结果具有明显的优越性。
H.264的PSNR比MPEG-4(ASP)和H.263++(HLP)明显要好,在6种速率的对比测试中,H.264的PSNR比MPEG-4(ASP)平均要高2dB,比H.263(HLP)平均要高3dB。6个测试速率及其相关的条件分别为:32 kbit/s速率、10f/s帧率和QCIF格式;64 kbit/s速率、15f/s帧率和QCIF格式;128kbit/s速率、15f/s帧率和CIF格式;256kbit/s速率、15f/s帧率和QCIF格式;512 kbit/s速率、30f/s帧率和CIF格式;1024 kbit/s速率、30f/s帧率和CIF格式。

热点内容
lol手游如何配置技能 发布:2024-10-04 20:17:11 浏览:860
服务器两根心跳线ip一样吗 发布:2024-10-04 20:17:03 浏览:553
java无状态 发布:2024-10-04 20:15:40 浏览:727
电信为什么限制上传速度 发布:2024-10-04 20:11:28 浏览:815
编程哪个培训机构好 发布:2024-10-04 19:55:14 浏览:59
安卓上的传奇是什么意思 发布:2024-10-04 19:37:25 浏览:277
在资源管理器中文件与文件夹 发布:2024-10-04 19:32:17 浏览:970
微笑的编程 发布:2024-10-04 19:04:38 浏览:234
28岁学编程 发布:2024-10-04 18:56:24 浏览:187
c语言定义函数结构体 发布:2024-10-04 18:46:19 浏览:404