当前位置:网站首页>【编解码】从零开始写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
边栏推荐
- Multi dimensional monitoring: the data base of intelligent monitoring
- UGUI强制刷新Layout(布局)组件
- 案例驱动 :从入门到掌握Shell编程详细指南
- . Net hybrid development solution 24 webview2's superior advantages over cefsharp
- UGUI使用小技巧(六)Unity实现字符串竖行显示
- 【C语言】判断三角形
- EMC RS485接口EMC电路设计方案
- Int~long long indicates the maximum and minimum number
- RemoteViews的作用及原理
- 纯纯大怨种!那些年被劝退的考研专业
猜你喜欢

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

【Unity编辑器扩展实践】、利用txt模板动态生成UI代码

SEO优化的许多好处是与流量有直接关系

EMC RS485接口EMC电路设计方案

纯纯大怨种!那些年被劝退的考研专业
![Connectionreseterror: [winerror 10054] the remote host forced an existing connection to be closed](/img/9a/97813f5ac4d7c15711891cff25b9dd.jpg)
Connectionreseterror: [winerror 10054] the remote host forced an existing connection to be closed

Oracle date format exception: invalid number

JS foundation 8

Self use demo of basic component integration of fluent

KDD 2022 | graph neural network generalization framework under the paradigm of "pre training, prompting and fine tuning"
随机推荐
Contract quantitative trading system development | contract quantitative app development (ready-made cases)
Open3d manual clipping point cloud
Web3安全连载(3) | 深入揭秘NFT钓鱼流程及防范技巧
[C language] about scanf() and scanf_ Some problems of s()
AcWing 606. Average 1 (implemented in C language)
Convert black mask picture to color annotation file
RemoteViews的作用及原理
自定义标题栏View
[C language] three sorting methods for random number files
【C语言】判断三角形
智联招聘基于 Nebula Graph 的推荐实践分享
【C语言】二叉树的实现及三种遍历
【Unity编辑器扩展基础】、EditorGUILayout (一)
内部振荡器、无源晶振、有源晶振有什么区别?
女子高考落榜读专科逆袭买千万别墅,考得不好真的没关系
Deployment and optimization of vsftpd service
來吧元宇宙,果然這熱度一時半會兒過不去了
On the output representation of bidirectional LSTM in pytoch
[C language] use of nested secondary pointer of structure
Still using simpledateformat for time formatting? Be careful that the project collapses!