1. 背景

因为工作原因,接触编解码也有一段时间了。AVC,HEVC,大大小小的功能都也接触了一些,关于编解码的原理的书和文章自己一直在看。从入门到略懂,感觉有些零零碎碎,或不完整,似乎串不成体系。有些小功能,知道是知道,并不知道它的意义和作用,时间一长也会慢慢忘记。
反思了一下,或许很多东西,还是需要自己动手做一遍,会理解的更深更透彻一些,就像费曼学习法,你能讲出来,才说明懂了,这个也一样,你能把功能实现出来,才说明你真的明白了里面的流程和逻辑。于是乎,在今年过年期间,突然萌生出了写一个解码器的想法,而且一萌生就一直压不住了,一直想赶快动键盘写起来。
其实目前市面上开源好用的解码器有不少,像ffmpeg,x264等等。自己这个工程,应该就是单纯的一个学习工程吧,估计最后再怎么优化也达不到这些大名鼎鼎的工程的效果和功能,但是那又怎么样呢,过程和经历也很棒,不是吗?
刚开始的时候是想写过一个编码器的,思考了一下之后很快就放弃了,我目前的想法只是想熟悉协议,并不是侧重于编码算法,相比之下,编写一个解码器所需要的的知识正是我所需要的。
这就成了这一系列文章的的起因了,算是自己一边写代码,一边写总结吧。
虽说是从“零”开始,但是编解码的基础知识还是要有一些储备的,我会在每一章里对解码所涉及到的知识点做一个介绍和讲解,但是太零碎的,就不会一一说明了。如果知识点太大,可能会单独写一篇来总结。

2. 计划

2.1 写作计划

按照一个解码器的步骤,准备暂时先分成这么几个部分来写

  • NALU:格式,起始码, EBSP RBSP SODB
  • 熵编码之哥伦布熵编码
  • SPS:解析协议里每个成员的意义
  • PPS: 解析协议里每个成员的意义
  • SEI:解析协议里每个成员的意义
  • SLICE Header:解析Header
  • SLICE data:解析slice数据
  • MarcoBlock:怎么还原出一个宏块完整的YUV数据
  • macroblock_layer
  • mb_pred
  • 帧内预测的part的预测模式获取
  • CAVLC
  • residual 残差数据获取
  • 帧内预测的part的预测数据 和 图像数据恢复
  • deblocking
  • ……待定

2.2 项目计划

  • 开发环境
    C语言

  • 包含功能:
    H264是分7个profile的,每个profile便是不同功能的集合。具体区别见wiki百科
    计划 :
    第一阶段做最基础的一个baseline的解码器(无B帧,只有CAVLC,只支持逐行 Progressive)
    第二阶段做main或 Extend的解码器(有B帧,有CABAC,支持Progressive和interlace)

    后续的就不做支持了。
    解码不做显示,从h264文件解到YUV文件即可。

  • 时间安排:
    预计6个月写完baseline (8月30),
    后续再安排第二阶段。

3. 参考

3.1 参考资料

  • H264 官方白皮书

3.2 参考工程

  • ffmepg Mirror
  • x264 - mirror
  • bitstream

3.3 参考博客

  1. 从零实现一个H.264码流解析器
    配套工程
  2. 自己动手写 H.264 解码器-ZigZagSin
    配套工程
  3. H264视频解码器C++工程说明
    配套工程

4. 工具准备

4.1 码流分析工具

  • vega: 我用过最专业,分析最好的软件。不过只能蹭单位的使用哈哈,目测应该很贵。

  • H264 Visa : 我用的1.15版本,不能用vega的时候使用的。参数解析的比较全面,用于前期判断自己的解析对不对很有帮助。

    后面据说有升级版 H.264 CodecVisa,暂时没用。

  • elecard
    试用了一下,感觉使用不是很顺手,论美观好用不如vega,轮参数完整不如H264 Visa。就没太多使用。
    这里记录一下,elecard的软件种类很多,elecard stream analyzer, elecard stream eye,Elecard StreamEye Studio等等。其实 Elecard StreamEye Studio 就包含了stream analyzer,不要被一堆名字搞混了。其中 streamEye算是功能比较全面的。


4.2 YUV查看工具

  • 7yuv

4.3 播放器

  • potplayer: 查看h264码流

4.4 一些YUV数据源

  • YUV Sequences (asu.edu)
  • Xiph.org :: Derf’s Test Media Collection

【编解码】从零开始写H264解码器(1) 总纲相关推荐

  1. 【编解码】从零开始写H264解码器(4) 熵编码之指数哥伦布编码

    1. 引言 经过上一章的学习,我们学会看描述子.这时候我们就会发现,在语法中,除了简单的 u(n),i(n) 这种读取固定长度的二进制解析方法之外,用的更多的还有ue(v),se(v)这些. 只有学会 ...

  2. 【编解码】从零开始写H264解码器(7) SEI解析

    1. 引言 解析完了SPS和PPS,按照NAL type,下一个可以介绍SEI. 不过SEI在码流不是必须的,重要性并没有SPS,PPS,slice那么高. 解析方式也很简单,都没有用熵编码. 先开一 ...

  3. 视频的基本参数及H264编解码相关概念

    概述 上几篇文章介绍了音频的采集以及编码,现在我们开始学习视频相关的知识,同样先从概念开始.本篇文章的主要内容有: 视频相关参数 帧率(fps) 分辨率 DTS和PTS 码率 音视频同步 对视频编解码 ...

  4. VideoCodec 入门篇 - 00 (编解码简介)

    目录 1.基本术语 (Basic Terminology) 1.1.图像 (Image) 1.2.像素 (Pixel) 1.3.颜色深度 (Color Depth) 1.4.分辨率 (Resoluti ...

  5. H264视频传输、编解码----FFmpeg软解码

    记录一下之前项目的实际使用过程. 将按照Java层------>JNI接口------>JNI代码中使用FFmpeg解码. 首先Java层: public class CodecWrapp ...

  6. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  7. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式 详解

    http://blog.csdn.net/wishfly/article/details/50187417 编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运 ...

  8. 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...

  9. 【从零开始】理解视频编解码技术

    [从零开始]理解视频编解码技术 auxten ​ CovenantSQL 联合创始人 ​关注他 1,263 人赞同了该文章 转载自: https://github.com/leandromoreira ...

  10. iOS8系统H264视频硬件编解码说明

    iOS8系统H264视频硬件编解码说明 转载自:http://www.tallmantech.com/archives/206#more-206 公司项目原因,接触了一下视频流H264的编解码知识,之 ...

最新文章

  1. list存入mysql乱序_MySQL案例-并行复制乱序提交引起的同步异常
  2. Java基础之多线程详细分析
  3. python不好的地方_Python 语言中经常有疑惑的地方
  4. 二分图的判定(模板)
  5. ubuntu安装 zookeeper3.3.6 由于jdk问题启动失败
  6. 有哪些适合新手练手的C/C++项目?
  7. 【华为云技术分享】云图说 | 华为云智能边缘平台IEF:智能边缘 让AI触手可及
  8. excel两列相同匹配第三列_Vlookup函数解决Excel大量数据匹配问题
  9. android 自定义窗口,Android studio如何自定义设置窗口布局?
  10. 一个例子说明数据库union all的作用
  11. 全国各省电信及网通DNS大全
  12. Sophus库(Linux下)的安装(模板类.hpp,非模板类.h)
  13. 宝塔php memory_limit,优化宝塔面板提高网站运行速度教程
  14. 使用AI制作 3d 模型初学者指南,如何在 Blender 3d 中使用stable diffusion
  15. hadoop与spark的异同
  16. Shell- 获取ESXI主机虚拟交换机中MAC表
  17. Linux虚拟机配置NAT模式上网时,ping不通百度等网站但能ping通局域网ip解决办法
  18. 无人机航测案例-湘南某县增减挂钩拆旧地块航拍任务
  19. cookie session的设置
  20. org.apache.poi.ss.usermodel.Cell.getCellType()Lorg/apache/poi/ss/usermodel/CellType(百分比解决你问题)

热门文章

  1. 机器学习基础(二)——训练集和测试集的划分
  2. 【单片机基础篇】51单片机流水灯
  3. matlab矩阵处理实验报告,MATLAB矩阵实验报告.doc
  4. [运算放大器系列]二、电压转4 - 20MA电流电路分析
  5. ​手机APP应用软件开发
  6. Windows下XMake编译imgui成功之DX11
  7. 微型计算机电路基础第四版答案,(完整word版)微机习题答案-20210412072430.docx-原创力文档...
  8. 计算机电源管理设置,怎么修改电脑中设置的显卡电源管理模式
  9. 联想微型计算机m4350q升级,拆解:高度集成化的联想M4350q
  10. 北邮 网络安全 期末复习 知识点总结之防火墙