from http://blog.chinaunix.net/uid-20451980-id-3498335.html

缩写:

1.DTS, PTS
对于一个ES来说,他又许多I,P,B帧,而P, B帧都是以I,P帧作为参考。
由于B帧是前向后向参考,因此要对B帧作decode的话,
就必须先decode该B帧后面的P,或者I帧,
于是,decode的时间与帧的真正的present的时间就不一致了,
按照DTS一次对各个帧进行decode,

然后再按照PTS对各个帧进行展现

2.转自http://legendbaby.blogbus.com/logs/22585281.html

Z=ROUND(Y/Qstep)其中Z为量化值,Y为输入系数值,Qstep为量化步长,量化步长有52种,每个宏块的量化步长由量化参数QP决定,QP每增加1,量化步长增加12.5%。

H.264将一部分变换系数和量化和在一起实现,即在Zij=Yij/Qstep的基础上进行,变成Zij=(Yij*PF/Qstep),这里PF就是变换时提取出的系数a2,ab/2,b2/4......

实 际实现时,用移位的方法实现除法,即Zij=Yij.MF/2qbit;这样就有MF/2qbit=PF/Qstep,则MF=2qbitPF /Qstep,qbit=15+(QP/6),所以有QP相差6,MF增加一倍。QP=4时,Qstep=1,求出对应ij的MF,就是量化矩阵了。

3.
H.264 基本语法结构简介

H.264 相对以往的视频压缩编码标准来说,在语法结构上有很大的改变,其中最大的改 变体现在以下两个方面:

取消帧级语法单元

H.264 语法中没有 frame_header 之类的语法单元,帧信息全部放在 slice_header、 SPS 和 PPS 中,这样可增强 slice 单元解码的独立性,提高码流的抗丢包、抗误码 能力。但由于一帧图像可以对应多个 slice,因此解码器无法通过解析类似 frame_header 的语法来识别码流中的一帧数据。

引入 SPS、PPS 等参数集概念

  • ?  将一个视频序列(从 IDR 帧开始到下一个 IDR 帧之前的数据称为一个视频序

    列)全部图像的共同特征抽取出来,放在 SPS 语法单元中。

  • ?  将各个图像的典型特征抽取出来,放在 PPS 语法单元中。

  • ?  只有视频序列之间才能切换 SPS,即只有 IDR 帧的第一个 slice 可以切换 SPS。

  • ?  只有图像之间才能切换 PPS,即只有每帧图像的第一个 slice 才能切换 PPS。

    从宏观上来说,SPS、PPS、IDR 帧(包含一个或多个 I-Slice)、P 帧(包含一个或多个 P-Slice)、B 帧(包含一个或多个 B-Slice)共同构成典型的 H.264 码流结构。除上述典 型语法结构外,为了方便传输私有信息,H.264 还定义了 SEI 语法结构。除非编码器和 解码器进行特定的语法协商,解码器一般不对 SEI 包进行解析

4.

5.每个 SPS 或者 PPS 仅对应一个 nal

6.解码视频通道切换

一般来说,在视频点播或者视频通道切换时,仅搜索 IDR 帧送给解码器是不够的,还 必须将对应的 SPS 和 PPS 送给解码器。H.264 并没有要求 SPS、PPS 以及 IDR 帧捆绑 传输,只是规定一定要在 IDR 帧之前传输相应的 SPS 和 PPS。因此,最严谨的做法是 从视频码流的起始位置开始搜索,将获取的全部 SPS 和 PPS 依次送给解码器,直到搜 索到一个 IDR 帧。

为了降低应用的复杂性,在视频点播或者实时编解码应用场景中,编码器一般连续传 递 SPS、PPS 和 IDR 帧,即严格在 IDR 帧之前传递当前视频序列所需要的 SPS 参数和 若干个 PPS 参数。Hi3507 编码器遵循这一准则,因此可以在每个 IDR 帧的第一个 nalu 前面找到 4 个尺寸较小的 nalu,它们即为当前视频序列解码所需要的全部参数,其中 第一个 nalu 为 SPS。简单地说,对于 Hi3507 码流,只要找到 SPS,并从此位置开始送 给解码器解码,那么一定可以得到完整的视频图像。

在视频输入通道不断切换的应用场景中(如单通道解码器用时间片的方式点播多个编 码通道码流的场景),需要不断地切换解码器的输入视频源通道。基于上述描述的解码 完整性原则,切换不是从任意位置开始的。也就是说,如果解码器需要切换到某个视 频通道,那么必须从获取这个视频通道的 SPS 的位置开始切换,否则在切换点,视频 图像会出现异常。

7.流媒体网络传输的方式

基于 MPEG-4 的方案在网络传输时通常采用以下两种方案:

  • 用尺寸小于网络层 MTU 的定长数据段来切分线性的原始码流。

  • 直接传输增加私有格式头的一整帧数据,网络层对整帧数据进行切分,而应用层

    则忽略由于网络拥塞而丢弃的包。
    H.264 提出比 MPEG-4 更优秀的网络传输抗误码解决方案。H.264 包含 VCL 和 NAL,

    VCL 和 NAL 的特点如下:

  • VCL 包括核心压缩引擎和块/宏块/slice 的语法级别定义,应该尽量将 VCL 独

    立于网络之外。

  • NAL 将 VCL 产生的比特字符串适配到各种各样的网络环境中。NAL 覆盖所有

    slice 级以上的语法级别,并包含以下机制:

? 提供每一个 slice 解码时所需要的参数数据。 ? 预防起始码冲突。

  • ?  支持 SEI。

  • ?  提供将编码 slice 的比特字符串在基于比特流的网络上进行传送。

    H.264 将 NAL 与 VCL 分离的主要原因如下:

  • 定义一个 VCL 信号处理与 NAL 传输的接口,这样允许 VCL 和 NAL 工作在完全

    不同的处理器平台上。

  • VCL 和 NAL 都被设计成适应于异质传输环境,当网络环境不同时,网关不需要

    对 VCL 比特流进行重构和重编码。

IP 网络的类型可分为以下三种:

  • 不可控 IP 网络(如 Internet)。

  • 可控 IP 网络(如广域网)。

  • 无线 IP 网络(如 3G 网络)。

    这三种 IP 网络有不同的 MTU、比特出错概率和 TCP 使用标记。两个 IP 节点之间的 MTU 是动态变化的,通常假定有线 IP 网络的 MTU 为 1.5KB,无线 IP 网络 MTU 的范 围从 100byte 到 500byte。

    在以 UDP 发包时建议以 nalu 为基本单元,这样便于在应用层进行封装。推荐使用 RTP 进行组包传输,一个 RTP 分组里放一个 nalu,将 nalu(包括同步头)放入 RTP 的载荷 中,并设置 RTP 的头信息。由于包传送的路径不同,接收端需要重新对 slice 分组进行 排序,RTP 包含的次序信息可以用来解决这一问题。

    不要随意丢弃尺寸大于 MTU 的 UDP 分组,可直接发送,由网络驱动层进行拆包和组 包,对应用层不会产生影响。即使网络出现 UDP 丢包,丢弃也是一个完整的 nalu。在 H.264 中,nalu 是基于 VCL slice 的网络层封装,每个 slice 对应于多个宏块(不同于 MPEG-4)。H.264 在编码时不同 slice 的宏块之间语法是非相关的,丢掉少量的 slice 不 会对其他 slice 的解码产生影响。

    H.264 的应用越来越广泛,在实际的应用方案中将存在 MPEG-4 与 H.264 并存的情 形。为了解码端的系统稳定,避免软件崩溃,建议以 nalu 为基本单元放入分组包里传 送,这样可以做到 H.264 与 MPEG-4 互不干扰,稳定并存于一套系统中

解码前的丢包策略

  1. 播放器在下列情况下需要进行丢包处理:

    • 计算机 CPU 负荷过重或者网络抖动等原因引起播放器前端码流缓冲区即将溢出。

    • 应用层检测到当前网络丢包现象严重。

    • 播放器调度需要进行丢包处理。

       目前通用的主动丢包处理方法如下: 
    • 尽可能将收到的所有码流信息送至解码器,不要轻易丢弃已经收到的码流信息。

    • 如果播放器在上述几种情况下需要主动丢包,则播放器应从当前帧开始丢弃,一 直丢弃到下一个 IDR 帧。

X264编码的一些收藏相关推荐

  1. ffmpeg使用x264编码的配置+ ffmpeg与 x264编码器参数完整对照表

    ffmpeg使用x264编码的配置+ ffmpeg与 x264编码器参数完整对照表 分类: 多媒体 2010-07-13 11:31 1072人阅读 评论(0) 收藏 举报 转载自:扶凯[http:/ ...

  2. 分享GitHub上一位老外的嵌入式C编码规范(收藏细读)

    简 介: 本文分析在头条上分享GitHub上一位老外的嵌入式C编码规范(收藏细读):嵌入式大杂烩. 关键词: 嵌入式,C语句,编程规范 分享GitHub上一位老外的嵌入式C编码规范(收藏细读) §01 ...

  3. 【Android RTMP】RTMPDump 封装 RTMPPacket 数据包 ( 关键帧数据格式 | 非关键帧数据格式 | x264 编码后的数据处理 | 封装 H.264 视频数据帧 )

    文章目录 安卓直播推流专栏博客总结 一. x264 编码后的 H.264 数据帧 二. RTMP 协议中 关键帧 / 非关键帧 数据格式 说明 三. 判定 H.264 帧数据分隔符 四. 初始化 RT ...

  4. 【Android RTMP】x264 编码器初始化及设置 ( 获取 x264 编码参数 | 编码规格 | 码率 | 帧率 | B帧个数 | 关键帧间隔 | 关键帧解码数据 SPS PPS )

    文章目录 安卓直播推流专栏博客总结 一. x264 编码器参数设置引入 二. 获取 x264 编码器参数 三. 设置 x264 编码器编码规格 四. 设置 x264 编码器编码图像数据格式 五. 设置 ...

  5. x264编码参数大测试:10 trellis(1000Kbps)

    一.测试内容 测试方法-- x264编码参数大测试:索引贴 http://www.cnblogs.com/zyl910/archive/2011/12/14/x264_encode_param.htm ...

  6. X264编码流程详解(转)

    http://blog.csdn.net/xingyu19871124/article/details/7671634 对H.264编码标准一直停留在理解原理的基础上,对于一个实际投入使用的编码器是如 ...

  7. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

  8. ffmpeg + x264 编码H264(x86+arm)

    一.x86-linux 1.  编译x264 我用的是目前最新版:x264-snapshot-20101130-2245.tar.bz2 ./configure --disable-asm mak ...

  9. 学习笔记(一)(x264编码流程)

    学习笔记(一)(x264编码流程) 作者 张士辉 11月 2, 2007 <script type=text/javascript></script> <script s ...

最新文章

  1. 微信生态增长:裂变与分销讲解
  2. 谁动了我的奶酪?--java实例初始化的顺序问题
  3. Android Json解析与总结
  4. C++中各种智能指针的实现及弊端(一)
  5. 资深开发者们是如何读书的?---线下读书会记录
  6. c语言链表交换2个元素的位置,C语言 单链表 查找一个元素出现的所有位置
  7. 《oracle每日一练》oralce数据库的导入导出
  8. C# NPOI(xlsx相关操作)
  9. POJ 1751 Highways (kruskal)
  10. 虚拟机中 yum 安装时报错
  11. 您在申诉时填写的收件人信息与运单号关联的收件人信息不一致,请确认
  12. 这么炫酷的轮播图·你想学吗?
  13. 抖音很火的动态表白源码
  14. 魅力电子学习考试小笔记
  15. 新版Edge检查项F12控制台改为英文
  16. MLAT-Autoencoders---下篇-关键代码及结果展示(2)
  17. 如何求矩阵的若儿当标准型
  18. PHP对HTML编码字符串的处理
  19. GOIP语音网关对接VOS3000技巧 落地和呼叫
  20. 直流电源滤波电容选择

热门文章

  1. 公司项目里如何进行前后端接口联调
  2. 在大数据时代下,数据资产成为了财富的新定义
  3. 明明导包成功,却仍报程序包不存在的问题
  4. word:表格中的文字居中
  5. 多功能起名查重工具微信小程序源码下载支持多种流量主模式
  6. Task03: 变量、常量、枚举(1天) 组队学习 Go编程语言
  7. Linux修改用户名后无法登入系统(乌班图)
  8. 微信扫码关注后实现自动分组
  9. 阿里巴巴的EasyExcel(导入和导出)
  10. 两个主机之间如何通信