当前位置:网站首页>【编解码】从零开始写H264解码器(1) 总纲
【编解码】从零开始写H264解码器(1) 总纲
2022-06-28 12:05:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
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 参考资料
3.2 参考工程
3.3 参考博客
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数据源
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/150705.html原文链接:https://javaforall.cn
边栏推荐
- Intranet penetration in the working group environment: some basic methods
- 【Unity编辑器扩展实践】、利用txt模板动态生成UI代码
- [C language] use of nested secondary pointer of structure
- ByteV搭建动态数字孪生网络安全平台----助力网络安全发展
- Int~long long indicates the maximum and minimum number
- Prefix and (2D)
- Asynctask experience summary
- Multi dimensional monitoring: the data base of intelligent monitoring
- Web3安全连载(3) | 深入揭秘NFT钓鱼流程及防范技巧
- cdc同步 如果数据库表的主键发生了变化,会同步成两个数据 还是会同步更新主键呢?
猜你喜欢

Still using simpledateformat for time formatting? Be careful that the project collapses!

多维度监控:智能监控的数据基础

Necessary for beginners PR 2021 quick start tutorial, PR green screen matting operation method

Prepare for Jin San Yin Si I. testers without experience in automated testing projects should look at it quickly
![[vi/vim] basic usage and command summary](/img/bc/0be3ae3f122c3c21b480e0678095a1.png)
[vi/vim] basic usage and command summary

深度学习又有新坑了!悉尼大学提出全新跨模态任务,用文本指导图像进行抠图...
![[C language] three sorting methods for random number files](/img/a5/363133a0c85aa43c6cd8287e479f71.jpg)
[C language] three sorting methods for random number files

纯纯大怨种!那些年被劝退的考研专业

Web3安全连载(3) | 深入揭秘NFT钓鱼流程及防范技巧

2018 joint examination of nine provinces & Merging of line segment trees
随机推荐
Django -- MySQL database reflects the mapping data model to models
[C language] use of file read / write function
开源项目维权成功案例: spug 开源运维平台成功维权
MapReduce project case 3 - temperature statistics
[C language] three sorting methods for random number files
【北京航空航天大学】考研初试复试资料分享
Self use demo of basic component integration of fluent
Daily practice of C language - day 3: calculate the number of occurrences of sub strings of strings
PrecomputedTextCompat用法及原理
自定义标题栏View
[vi/vim] basic usage and command summary
Remote login sshd service
ArrayList源码解析
Mutual conversion between mytipartfile and file
Bisection (integer bisection and floating point bisection)
Deployment and optimization of vsftpd service
Practice and Thinking on the architecture of a set of 100000 TPS im integrated message system
【C语言】随机数文件对其进行三种排序方法
【C语言】判断三角形
IO stream of file and Base64