怎样进行站点优化,wordpress不用小尺寸图片,宁波趋势信息科技有限公司,优化措施二十条#xfeff;#xfeff;原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494
名词解释 场和帧 #xff1a; 视频的一场或一帧可用来产生一个编码图像。在电视中#xff0c;为减少大面积闪烁现象#xff0c;把一帧分成两个隔行的场。 片#xff1a…原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494
名词解释 场和帧 视频的一场或一帧可用来产生一个编码图像。在电视中为减少大面积闪烁现象把一帧分成两个隔行的场。 片 每个图象中若干宏块被排列成片的形式。片分为I片、B片、P片和其他一些片。 I片只包含I宏块P片可包含P和I宏块而B片可包含B和I宏块。 I宏块利用从当前片中已解码的像素作为参考进行帧内预测。 P宏块利用前面已编码图象作为参考图象进行帧内预测。 B宏块则利用双向的参考图象前一帧和后一帧进行帧内预测。 片的目的是为了限制误码的扩散和传输使编码片相互间是独立的。 某片的预测不能以其它片中的宏块为参考图像这样某一片中的预测误差才不会传播到其它片中去。 宏块 一个编码图像通常划分成若干宏块组成一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。 数据之间的关系 H264结构中一个视频图像编码后的数据叫做一帧一帧由一个片slice或多个片组成一个片由一个或多个宏块MB组成一个宏块由16x16的yuv数据组成。宏块作为H264编码的基本单位。 H264编码过程中的三种不同的数据形式SODB 数据比特串 ----最原始的编码数据即VCL数据RBSP 原始字节序列载荷 ----在SODB的后面填加了结尾比特RBSP trailing bits 一个bit“1”若干比特“0”,以便字节对齐EBSP 扩展字节序列载荷 ---- 在RBSP基础上填加了仿校验字节0X03它的原因是 在NALU加到Annexb上时需要添加每组NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示ox00000001,否则用3位字节表示ox000001是一帧的一部分。另外为了使NALU主体中不包括与开始码相冲突的在编码时每遇到两个字节连续为0就插入一个字节的0x03。解码时将0x03去掉。也称为脱壳操作。H264/AVC 的分层结构 H.264的主要目标是1高的视频压缩比2良好的网络亲和性为了完成这些目标H264的解决方案是1.VCL video coding layer 视频编码层2.NAL network abstraction layer 网络提取层其中VCL层是对核心算法引擎块宏块及片的语法级别的定义他最终输出编码完的数据 SODBNAL层定义片级以上的语法级别如序列参数集和图像参数集针对网络传输 同时支持以下功能独立片解码起始码唯一保证SEI以及流格式编码数据传送NAL层将SODB打包成RBSP然后加上NAL头组成一个NALUNAL单元 H264网络传输的结构H264在网络传输的是NALUNALU的结构是NAL头RBSP实际传输中的数据流如图所示 NALU头用来标识后面的RBSP是什么类型的数据他是否会被其他帧参考以及网络传输是否有错误。 NALU头结构 长度1byte forbidden_bit(1bit) nal_reference_bit(2bit) nal_unit_type(5bit) 1.forbidden_bit 禁止位初始为0当网络发现NAL单元有比特错误时可设置该比特为1以便接收方纠错或丢掉该单元。 2.nal_reference_bit nal重要性指示标志该NAL单元的重要性值越大越重要解码器在解码处理不过来的时候可以丢掉重要性为0的NALU。 不同类型的NALU的重要性指示如下表所示。 nal_unit_type NAL类型 nal_reference_bit 0 未使用 0 1 非IDR的片 此片属于参考帧则不等于0 不属于参考帧则等与0 2 片数据A分区 同上 3 片数据B分区 同上 4 片数据C分区 同上 5 IDR图像的片 5 6 补充增强信息单元SEI 0 7 序列参数集 非0 8 图像参数集 非0 9 分界符 0 10 序列结束 0 11 码流结束 0 12 填充 0 13..23 保留 0 24..31 不保留 0 所谓参考帧就是在其他帧解码时需要参照的帧。比如一个I帧可能被一个或多个B帧参考一个B帧可能被某个P帧参考。 从这个表我们也可以看出来DIR的I帧是非常重要的他一丢那么这个序列的所有帧都没办法解码了 序列参数集和图像参数集也很重要没有序列参数集这个序列的帧就没法解 没有图像参数集那用到这个图像参数集的帧都没法解。 3.nal_unit_typeNALU类型取值如下表所示。 nal_unit_type NAL类型 C 0 未使用 1 非IDR图像中不采用数据划分的片段 2,3,4 2 非IDR图像中A类数据划分片段 2 3 非IDR图像中B类数据划分片段 3 4 非IDR图像中C类数据划分片段 4 5 IDR图像的片 2,3 6 补充增强信息单元SEI 5 7 序列参数集 0 8 图像参数集 1 9 分界符 6 10 序列结束 7 11 码流结束 8 12 填充 9 13..23 保留 24..31 不保留RTP打包时会用到 RTP 打包时的扩展类型 24STAP-ASingle-time aggregation packet25STAP-BSingle-time aggregation packet26MTAP16Multi-time aggregation packet27MTAP24Multi-time aggregation packet28FU-A Fragmentation unit29FU-BFragmentation unit30-31undefined RBSP RBSP数据是下表中的一种 RBSP类型所写描述参数集PS序列的全局信息如图像尺寸视频格式等增强信息SEI视频序列解码的增强信息图像界定符PD视频图像的边界编码片SLICE编码片的头信息和数据数据分割 DP片层的数据用于错误恢复解码序列结束符 表明一个序列的结束下一个图像为IDR图像流结束符 表明该流中已没有图像填充数据 亚元数据用于填充字节 从前面的分析我们知道VCL层出来的是编码完的视频帧数据 这些帧可能是I、B、P帧而且这些帧可能属于不同的序列再者同一个序列还有相对应的一套序列参数集和图片参数集等等 所以要完成视频的解码不仅需要传输VCL层编码出来的视频帧数据还需要传输序列参数集、图像参数集等数据。 参数集:包括序列参数集 SPS 和图像参数集 PPSSPS 包含的是针对一连续编码视频序列的参数如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。PPS对应的是一个序列中某一幅图像或者某几幅图像 其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。 数据分割组成片的编码数据存放在 3 个独立的 DP数据分割A、B、C中各自包含一个编码片的子集。 分割包含片头和片中每个宏块头数据。 分割包含帧内和 SI 片宏块的编码残差数据。 分割 C包含帧间宏块的编码残差数据。 每个分割可放在独立的 NAL 单元并独立传输。 NAL的开始和结束编码器将每个NAL各自独立、完整地放入一个分组因为分组都有头部解码器可以方便地检测出NAL的分界并依次取出NAL进行解码。 每个NAL前有一个起始码 0x00 00 01或者0x00 00 00 01解码器检测每个起始码作为一个NAL的起始标识当检测到下一个起始码时当前NAL结束。 同时H.264规定当检测到0x000000时也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办H.264引入了防止竞争机制如果编码器检测到NAL数据存在0x000001或0x000000时编码器会在最后个字节前插入一个新的字节0x03这样
0x0000000x000003000x0000010x000003010x0000020x000003020x0000030x00000303解码器检测到0x000003时把03抛弃恢复原始数据脱壳操作。解码器在解码时首先逐个字节读取NAL的数据统计NAL的长度然后再开始解码。NALU的顺序要求H.264/AVC标准对送到解码器的NAL单元顺序是有严格要求的如果NAL单元的顺序是混乱的必须将其重新依照规范组织后送入解码器否则解码器不能够正确解码。1.序列参数集NAL单元 必须在传送所有以此参数集为参考的其他NAL单元之前传送不过允许这些NAL单元中间出现重复的序列参数集NAL单元。
所谓重复的详细解释为序列参数集NAL单元都有其专门的标识如果两个序列参数集NAL单元的标识相同就可以认为后一个只不过是前一个的拷贝而非新的序列参数集。2.图像参数集NAL单元 必须在所有以此参数集为参考的其他NAL单元之前传送不过允许这些NAL单元中间出现重复的图像参数集NAL单元这一点与上述的序列参数集NAL单元是相同的。 3.不同基本编码图像中的片段slice单元和数据划分片段data partition单元在顺序上不可以相互交叉即不允许属于某一基本编码图像的一系列片段slice单元和数据划分片段data partition单元中忽然出现另一个基本编码图像的片段slice单元片段和数据划分片段data partition单元。 4.参考图像的影响如果一幅图像以另一幅图像为参考则属于前者的所有片段slice单元和数据划分片段data partition单元必须在属于后者的片段和数据划分片段之后无论是基本编码图像还是冗余编码图像都必须遵守这个规则。 5.基本编码图像的所有片段slice单元和数据划分片段data partition单元必须在属于相应冗余编码图像的片段slice单元和数据划分片段data partition单元之前。 6.如果数据流中出现了连续的无参考基本编码图像则图像序号小的在前面。 7.如果arbitrary_slice_order_allowed_flag置为1一个基本编码图像中的片段slice单元和数据划分片段data partition单元的顺序是任意的如果arbitrary_slice_order_allowed_flag置为零则要按照片段中第一个宏块的位置来确定片段的顺序若使用数据划分则A类数据划分片段在B类数据划分片段之前B类数据划分片段在C类数据划分片段之前而且对应不同片段的数据划分片段不能相互交叉也不能与没有数据划分的片段相互交叉。 8.如果存在SEI补充增强信息单元的话它必须在它所对应的基本编码图像的片段slice单元和数据划分片段data partition单元之前并同时必须紧接在上一个基本编码图像的所有片段slice单元和数据划分片段data partition单元后边。假如SEI属于多个基本编码图像其顺序仅以第一个基本编码图像为参照。 9.如果存在图像分割符的话它必须在所有SEI 单元、基本编码图像的所有片段slice单元和数据划分片段data partition单元之前并且紧接着上一个基本编码图像那些NAL单元。 10.如果存在序列结束符且序列结束符后还有图像则该图像必须是IDR即时解码器刷新图像。序列结束符的位置应当在属于这个IDR图像的分割符、SEI 单元等数据之前且紧接着前面那些图像的NAL单元。如果序列结束符后没有图像了那么它的就在比特流中所有图像数据之后。 11.流结束符在比特流中的最后。 h264有两种封装 一种是annexb模式传统模式有startcodeSPS和PPS是在ES中 一种是mp4模式一般mp4 mkv会有没有startcodeSPS和PPS以及其它信息被封装在container中每一个frame前面是这个frame的长度 很多解码器只支持annexb这种模式因此需要将mp4做转换 在ffmpeg中用h264_mp4toannexb_filter可以做转换 实现 注册filter avcbsfc av_bitstream_filter_init(h264_mp4toannexb); 转换bitstream av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int keyframe)