H.264中的SP帧/SI帧

SP帧要解决的问题之一就是两个码流的切换。这两个码流可以是相同内容的不同质量的,也可以是不同内容的。这种切换有两个基本要求:

第一、码率要平稳;

第二、码率要小。

SP就是针对这个要求来实现的。IDR帧是天然的切换点。可是,IDR帧的引入不仅会造成码率的波动,一般也会同时加大码率。所以引入SP帧来完成类似的任务。假设当前传输的节目编号为1,现在要转为播放编号为2的节目。如果切换点是IDR帧,那这种切换的正确性没有问题,但是码率会波动。现在我们设计SP帧来完成相同的功能。在切换点,原始的节目1或2对应的SP帧一般称为主SP帧,记作SP1和SP2。现在我们只需传输一个辅助SP帧(记作SP1-2,意为从内容1转入内容2的SP帧),然后节目2就可以用SP1-2来作为参考帧,继续传输了。

SP帧作为切换点,必须保证其重建帧(SP1-2)与切换目标的对应帧(SP2)完全一样。SP帧的编、解码的设计也正是针对这一点进行的。换句话说,SP帧的设计目标就是针对不同SP帧的解码,必须保证其解码结果一致,即使第个SP帧的参考帧是不同的。

P帧的重建结果是由预测结果加残差的和决定的(暂不考虑环路滤波)。由于两个SP帧的参考帧不同,其预测结果也会大相径庭。而残差因为是经过反DCT变换和非线性的反量化而得的,其结果不易控制。所以SP帧的实现采用了不同的解码流程。其重点就是将预测结果变换、量化为频域值。这样与残差的相加是在频域完成的。这样,在保证了预测的有效性的前提下,较易获得频域的相同重建图像。而相同的频域图像变换扣的空域图像也就相同了。具体实现可参考论文【1】。

由此可见,SP帧的编码过程与解码过程与P帧完全不同。要实现SP帧,必须对编码器与解码器作相应的改变。


SP和SI是在h264中引入的新技术,其目的是为了适应视频流的带宽自适应性和抗误码性能的要求,以更好的提供流媒体服务!

而所谓的SP帧其实就是能够参照不同的参考帧重构出相同的图像帧!(SI与SP的不同在于SI是基于帧内预测,而SP是基于帧间预测)
这里必须要提下流媒体服务的一些特征,因为网络的状况是一直在变化着的,有些时候比较繁忙,有些时候则比较空闲,针对不同的
网络条件,服务器端可能会提供好几路不同质量的数据服务,当网络堵塞时,提供比较差但码率较低的服务,当网络空闲的时候,则
提供码率高但质量优良的服务,而由于视频压缩是基于参考帧预测的基础之上,在不同条件下切换时,很可能出现参考帧丢失的问题,
如:

序列1    A1  A2  A3  A4  A5  SA  A6  A7  A8
                  Sab
序列2  B1  B2  B3  B4  B5  SB  B6  B7  B8

在序列1传输完A5之后,接下来想切换到序列2上去,那么会有一个问题,序列2中的B6很可能是参考的B1-B5 SB中的一帧,而由于这些
帧之前并没有接收到,所以B6无法正确解码,而且会进一步影响到后面参考B6预测出来的其它帧!
而此时引入SP/SI技术,B6可以根据A5以及Sab来得到!根据相同原理,SP/SI技术还可以应用到拼接,随机接入以及错误恢复等各个
领域中去!

在基本档和主要档中,并没有引入SP/SI,只有在扩展档中才有应用!


参考文献:

【1】The SP- and SI-Frames Design for H.264/AVC,by Marta Karczewicz, Ragip Kurceren, IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY, VOL. 13, NO. 7, JULY 2003


参考:

http://blog.csdn.net/lessconcern/article/details/38611415

http://blog.csdn.net/htbsoft0556/article/details/19120761

http://www.cnblogs.com/xiezhaohai/p/6845159.html

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#0 Homer::RtpSessionState::deprovisionAtDestruction (this=0x7f1fe00e7650) at ../components/mos/state/session_state/src/rtp_session_state.cpp:886 886 ../components/mos/state/session_state/src/rtp_session_state.cpp: No such file or directory. [Current thread is 1 (Thread 0x7f1ffffff700 (LWP 372))] (gdb) bt #0 Homer::RtpSessionState::deprovisionAtDestruction (this=0x7f1fe00e7650) at ../components/mos/state/session_state/src/rtp_session_state.cpp:886 #1 0x00005653759a8e33 in Homer::DeviceState::~DeviceState (this=0x7f1fe00ecf50) at ../components/mos/state/device_state/src/device_state.cpp:87 #2 0x0000565375c4229e in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x7f1fe00ecf40) at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/shared_ptr_base.h:155 #3 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x7f1fe00bbb08) at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/shared_ptr_base.h:730 #4 std::__shared_ptr<Homer::DeviceStateBase, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x7f1fe00bbb00) at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/shared_ptr_base.h:1169 #5 Homer::Device::~Device (this=0x7f1fe00bb070) at ../components/mos/device/src/device.cpp:94 #6 0x0000565375c3c08a in Homer::WebsocketDevice::~WebsocketDevice (this=0x7f1fe00bb070) at ../components/mos/device/src/websocket_device.h:31 #7 Homer::WebsocketClientDevice::~WebsocketClientDevice (this=0x7f1fe00bb070) at ../components/mos/device/src/websocket_client_device.cpp:20
06-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值