抗误码技术

抗误码技术:

       视频传输过程中的错误是不可避免的,抗误码技术历来都足视频领域一个研究的热点。H264标准继承r以前视频编码标准中某些优秀的错误恢复工具,同时也改进和创新了多种错误恢复丁具。这些错误恢复的工具主要有:参数集、数据分割、FMO、冗余片、帧内编码等。

参数集

       参数集是H264标准的个新概念,是种通过改进视频码流的结构增强错误恢复能力的方法。其所包含的信息极为重要,它的受损将影响到大量的VCL和NAL单元,且被影响的单元即使能正确接收到也不能被正确解码,在H.264标准中共使用了两种类型的参数集。


(1)序列参数集(SPS),包括与图像序列(定义为两个IDR图像间的所有图像)有关的所有信息,应用于已编码视频序列。
(2)图像参数集(PPS),包括所有属于该图像的片的相关信息,用于解码已编码视频序列中的1个或多个独立的图像。

        图像参数集本身也要使用和参考序列参数集中的参数。多个不同的参数集存储在解码器中,解码器通过参考每个已解码片的片头来选择使用恰当的参数集。参数集的灵活使用大大增强了H.264抗误码的性能。在有误码倾向环境下,使用参数集的关键是,在相应的VCL与NAL单元到达解码器时,确保参数集已及时可靠地到达解码器。参数集具体实现的方法主要有:

1、通过带外传输,这种方式要求参数集通过可靠的协议,在首个片解码之前传输到解码器;2、通过带内传输,这需要为参数集提供更高级别的保护,例如发送复制多个分组来保证至少有一个到达目标。由于第一种方法需要额外的一个信道,以及可靠的传输机制,如果条件许可,应用这种传输方式能增强编解码器的抗误码能力,但限于网络资源的现状,采用第二种方式似乎更为合理一些。

数据分割

        由于码流中的各语法元素的重要性各不相同,因此可以依据各语法元素的重要性使用不对等保护(UEP)技术来提高解码端的解码效果。在H.264中,一个片最多可以被分为3部分,分别属于A、B和C三类,每部分被单独封装为一个NAL单元。

       其中,数据A主要包含头信息,比如宏块类型、量化参数以及运动矢量等,这些参数具有最高级别的重要性。数据B主要包含帧内编码块的编码模式以及帧内编码块的变换系数。这部分数据的丢失将会严重影响其后续帧的解码质量。数据C主要包括帧间编码块的编码模式以及帧间编码块的变换系数。与数据A和数据B相比,这部分数据的重要性最差,然而它却是码流数据的最大组成部分。
      

       可以看出,数据B和数据C都要依赖于数据A的正确接收才有效,而这两部分在语法上是独立的。由于数据A重要性最强,同时其数据量也最小,因此可以使用更可靠的信道来传输或是使用纠错能力更强的码字来保护。事实上,在码流无法完全到达接收端时,数据A的重要性也可以体现在解码端错误掩藏的运用上,这是由于运动矢量在进行时域错误掩藏上是非常重要的,且一般能取得非常好的效果,同时具有很低的运算量。

灵活的宏块排序(FMo)

        灵活的宏块排序FMO是H.264的一大特色,适用于H.264的基本档次和扩展档次的应用。H.264标准允许以各种方式将宏块组成片,这样做法的好处是:(1)减小帧内误差传播。由于标准禁止帧内预测在不同片之间进行,这样可以避免一个包错误引起的错误传播至下一个片。(2)有利于解码端错误掩藏的实施。当丢失块以棋盘格或行交织的形式出现(如图2.1l所示)时,解码端采用错误掩藏技术可以取得非常好的重建图像。这是因为在对丢失块进行错误掩藏时主要利用块之间的平滑性来恢复,因此当丢失块周围的块都完好时可以取得不错的效果。在本文后面的试验过程中,正是采用FMO中的棋盘格模式,使得丢失块周围有尽可能多的可参考宏块用于错误恢复。

        灵活的宏块排序(FMO)可以看成是做片交织技术的一般形式,它可以任意定义片的形状,其主要目的就是将错误均匀的分散到整帧而不是某个局部区域。图2.11显示的棋盘格和行交织式的FMO形式。当使用FMO时,参数集中将增加一个宏块分配表(MBA.Map),且帧中的每个块都将按照空间光栅扫描顺序依次映射在宏块分配表中,该块在表中的数字代表了块属的片,在图2.11中,“O"代表白色块,“1"代表灰色块。实际上,宏块分配表支持任意形状的宏块组织方式:矩形、棋盘格式、交织行等。FMO的使用,虽然提高了抗误码性能,却是以牺牲编码效率为代价的。因为它打破了原先非邻居MB之间的预测,这在高度优化的环境中,有比较高的延迟。

冗余片(Redundant Slice)

        冗余片技术,简单地讲就是,在同一个比特流中,编码器除了片自身中已编码地宏块放置其中外,同一宏块地1个或多个冗余地表示也同时被放置其中,通过利用宏块的1个或多个冗余表示来克服误码造成的不可用片对重构图像的影响。需要注意的是,这些冗余片的编码参数与非冗余片的编码参数不同,例如主片可用低QP(高质量)来编码,而冗余片信息可以用高QP(低质量)的方式编码,这样质量粗糙一些但码率更低。解码器在重构时,首先使用主片,如果它可用就抛弃冗余片;而如主片丢失(比如因为分组丢失)冗余片也能被用于重构。

        从上面的说明可以看出,这种冗余片技术与基于冗余的传输,如包复制有着本质的区别。在包复制冗余传输中,被复制的包和复制包一摸一样,而冗余片技术由于其编码参数的选择,具有较低的码率。因此,这种技术是在花销较小比特数的情况下,最大限度地保证重构图像的质量,尤其是在有误码倾向的移动信道或IP信道环境下,采用冗余片技术可以显著提高重构图像的主客观质量。

帧内编码

        帧间编码由于充分利用了连续序列的帧间高度相关性,具有很高的编码效率,但是同时也对误码非常敏感,且错误会在帧间迅速传播,使图像质量急剧恶化。与之相比,帧内编码不以任何重建帧为参考,可以有效防止错误扩散问题。因此,H.264也采用帧内编码宏块作为一种抗误码的手段,并较之前标准做了改进。在H.264中,存在两种完全由Intra编码宏块组成的片:传统的帧内编码Slice和IDR帧的Slice。IDR帧的片在进行帧内编码时将完全清空短期参考帧缓存(Short-Term Reference FrameBuffer)内的数据,因此它可以完全去除解码前面帧所带来的积累误差。对于传统的帧内编码Slice,仅可以去除前面解码帧误差对于本帧的影响,这是因为它没有清空短期参考帧缓存,因此在此后帧解码时仍将参考此Intra帧前面的已解码帧,导致误差或错误将向后传播。从这个角度来说,这种Intra帧的同步性要弱于同为Intra编码的IDR帧。

        如果在视频序列的编码过程中,在一定时间间隔内插入IDR帧,不仅能改善解码端的视频重建质量,也能起到抑制误码扩散的作用。当然这是以牺牲编码效率为代价的,多帧参考相对于单帧参考能较好的提高编码效率。同时,帧内编码相对于帧间编码方式,其编码效率也大大降低。H.264通过引入帧内编码特别是IDR帧)的方式来提升码流的错误恢复能力是以编码效率为代价的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux统计文件行数、字数、字节数

2019独角兽企业重金招聘Python工程师标准>>> 语法:wc [选项] 文件 说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符…

tkinter中鼠标与键盘事件

tkinter中鼠标与键盘事件(十五) 本文转自Tynam Yang的博客园 import tkinterwuya tkinter.Tk() wuya.title("wuya") wuya.geometry("300x2001020")bt tkinter.Button(wuya,text鼠标进入打印) bt.pack()def func(event):print(鼠…

html解析のBeautifulSoup

引子: 使用python爬虫对爬取网页进行解析的时候,如果使用正则表达式,有很多局限,比如标签中出现换行,或者标签的格式不规范,都有可能出现取不到数据,BeautifulSoup作为一个专门处理html格式的py…

【Tensorflow】人脸128个关键点识别基于卷积神经网络实现

引言: 卷积神经网络 卷积神经网络最早是为了解决图像识别的问题,现在也用在时间序列数据和文本数据处理当中,卷积神经网络对于数据特征的提取不用额外进行,在对网络的训练的过程当中,网络会自动提取主要的特征.卷积神经网络直接用原始图像的全部像素作为输入,但是内…

python 爬虫 包_python爬虫学习之路-抓包分析

利用浏览器抓包,是爬虫中的很实用的技能。在爬虫编程之前,我们要对抓取的目标页面有所了解,比如浏览器的这个请求这个页面中间都经历了什么,数据是怎么发送和返回的。 抓包的作用 我把抓包分析的作用简单列一下: 分析请…

帧间EC原理和过程

出错的宏块(图中灰色表示)根据上、下、左、右四个方向相邻宏块的不同分割情况及预测类型进行插值。将最后的结果中进行比较,选取边界像素差值之和最小者为最优的EC方案。其步骤为: 1、判断相邻宏块左上角8*8块的预测模式是否大于R…

Maven依赖的是本地工程还是仓库jar包?

相信大家都碰见过maven配置的依赖或者是jar包或者是工程,在开发的过程当中,我们当然需要引入的是工程,这样查看maven依赖的文件的时候,就能直接查看到源码。 一、本地工程依赖 举个例子,其架构如下所示(以下…

关于django新版本无法使用MySQL数据库的问题

关于django新版本无法使用MySQL数据库的问题 参考这里 稍微记录下Django2.2使用MariaDB和MySQL遇到的坑 现在演示一下整个流程吧 1.创建项目和应用 PS:你也可以使用PyCharm直接创建项目 2.注册应用 先把刚刚创建的应用添加进去 3.配置MySQL或者MariaDB 4.PyMySQL替…

[转]Spring事务tx:annotation-driven/

在使用SpringMVC的时候&#xff0c;配置文件中我们经常看到 annotation-driven 这样的注解&#xff0c;其含义就是支持注解&#xff0c;一般根据前缀 tx、mvc 等也能很直白的理解出来分别的作用。<tx:annotation-driven/> 就是支持事务注解的&#xff08;Transactional&a…

【自动化测试】整理各种测试开发工具!持续更新

收集和整理各种测试工具&#xff0c;自动化测试工具&#xff0c;自动化测试框架&#xff0c;觉得有帮助记得三连一下。欢迎提交各类测试工具到本博客。 通用测试框架 JUnit: 最著名的xUnit类的单元测试框架&#xff0c;但是不仅仅可以做单元测试。TestNG: 更强大的Java测试框架…

python连接sql数据库_python连接sql server数据库实现增删改查

简述 python连接微软的sql server数据库用的第三方模块叫做pymssql&#xff08;document&#xff1a;http://www.pymssql.org/en/stable/index.html&#xff09;。在官方文档可以看到&#xff0c;pymssql是基于_mssql模块做的封装&#xff0c;是为了遵守python的DBAPI规范接口.…

es5.0 安装head插件

es5.0的安装和之前的版本有些区别,我的电脑用plugin install 没成功, 查了一下资料,说是可以用grunt进行安装,启动; 1,先安装grunt: grunt是一个很方便的构建工具&#xff0c;可以进行打包压缩、测试、执行等等的工作&#xff0c;5.0里的head插件就是通过grunt启动的。 npm ins…

Django后台项目之用户管理功能开发流程

项目功能开发流程 1 先写列表页&#xff08;加载出来数据就行&#xff09; ob User_vip.objects.filter(is_del004001).order_by(-cts)2 写添加功能 2.1 创建addOrDoadd视图方法 2.2 添加访问addOrDoadd的路由 2.3 在index.html页面吧添加的按钮的链接不全 <a style&…

套接字 资料查阅

(3)套接字(socket) 一个完整的网络应用程序包括客户端和服务器两个部分。网间通信进程需要由两个进程组成&#xff0c;并且只能用同一种协议。也就是说&#xff0c;不能在通信的一端使用TCP协议&#xff0c;而另一端则用UDP协议。一个完整的网络通信需要一个五元组来标识…

linux mysql安装_Linux下安装mysql服务(超详细)

Mysql数据库的安装对于开发者来说&#xff0c;是我们必然会面对的问题&#xff0c;它的安装过程其实并不复杂&#xff0c;并且网络上的安装教程也非常多&#xff0c;但是对于新手来说&#xff0c;各种不同形式的安装教程&#xff0c;又给新手们带来了要选择哪种方式进行安装的难…

dash 和 bash 切换

#先看看是用的哪个 shellls -al /bin/sh #如果是dash&#xff0c;切换到bashsudo ln -fs /bin/bash /bin/sh转载于:https://www.cnblogs.com/abolide/p/6874265.html

Django中使用ajax技术概述

ajax 1.什么是ajax ajax就是在不刷新整个页面的情况下&#xff0c;去更新局部页面的内容&#xff08;无刷新技术&#xff09; 2.ajax有什么优点 最大的一点是页面无刷新&#xff0c;在页面内与服务器通信&#xff0c;给用户的体验非常好。 使用异步方式与服务器通信&#x…

IE、FF脚本兼容性问题

1.window.event IE有这个对象&#xff1b;FF没有&#xff0c;FF通过参数传递 2.获取事件源 IE&#xff1a;srcElement FF&#xff1a;target 3.添加与去除事件 IE&#xff1a;element.attachEvent("onclick", function(){}) element.detachEvent("onclick"…

ARM MOV和 LDR指令关系

ARM是RISC结构&#xff0c;数据从内存到CPU之间的移动只能通过L/S指令来完成&#xff0c;也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中&#xff0c;只能使用ldr比如&#xff1a;ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活…

day2 操作系统

一.为何要有操作系统 程序员无法把所有的硬件操作细节都了解到&#xff0c;管理这些硬件并且加以优化使用是非常繁琐的工作&#xff0c;这个繁琐的工作就是操作系统来干的&#xff0c;有了他&#xff0c;程序员就从这些繁琐的工作中解脱了出来&#xff0c;只需要考虑自己的应用…