经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具。时间包括平时的周末、晚上,以及调休的集中时间。当然,中秋回家过节不写代码。截至今天,经过多种H.265序列测试,也有各种工具对比,基本上无大问题,v2.0版本终于释放出来。v1.x版本是去年年初做的,弹指间一年多的今天又继续做。但后面也不知道有没有时间和心情完善,随缘吧。

一、背景

按惯例,每年年中的时候,公司都要讲新平台预研,但不等预研结束,公司高层就开会举手敲定一个新平台,而使得“预研”结束。今年主题之一是上H.265。第一个H.265标准在2013年1月出来,至今不够3年时间,有很多公司盯上了这领域,势头很好,但毕竟只是开始的几年,还是有待发展。

这种宣传性的东西,估计产品经理、行业总监们要关注,咱们这些写代码的其实不用关心太多。但对于技术的研究、探索,还是很有必要的。网上已经有很多商用的工具开发出来了,在文章《初识HEVC/H.265》中提到一些。鉴于以前也写了H264码流分析工具,从这方面入手会好一些,一来练练手,保持代码熟悉度,二来在写的过程对照标准手册学习,效果比单看手册好很多。于是就在原来工具基础上,继续做H265的分析。

二、思路

在文章《完成一个分析H264码流的工具》中大概写了一些思路,但不是很系统。这里再写一下。核心代码为h264bitstream开源库,它提供了一个很好的H.264码流读、写的方案,而且开源。它提供了基本的读写码流的接口。比如查找NAL,指数哥伦布编码等。因此,使用该开源库,只需根据标准手册里的语法规定去一一解析即可。关于这个库,不在此处详细展开描述。

0、根据标准手册语法,建立全局结构体,每个字段都单独存储。所有结构体归属于h264_stream_t和h265_stream_t结构体。对于数量不确定的字段,统一使用vector存储。

1、用户打开文件时,先判断文件类型,目前只支持H.264和H.265两种格式,如有后缀名,优先使用后缀名判定,否则读取文件开始处的NAL头,查看手册,两种码流的NAL头有差异,故可以使用该种方法。

2、按字节读取文件,根据start code解析NAL,得到NAL偏移量、长度、类型(如果是slice,还会解析出slice的类型,如I帧、P帧、B帧),存储于vector中,同时,为了得到如视频分辨率,帧率、YUV空间等信息,在解析NAL时,一并进行。做这些工作,是为了在界面的列表中列出各个NAL信息以及视频的概要信息。详见下文的界面截图。

3、鼠标双击某一个NAL时,根据前面得到NAL索引、偏移,读取文件并解析,从而得到该NAL详细信息,这里使用的方法,就是根据手册,逐一读取码流。

三、实现

此处讲述一下在编码、学习过程的经验。

未动手写代码时,去下载商业工具玩玩,但只有几天的试用期,就把几个关键的NAL截图保存起来,方便日后对比。后面过期了,就拿HM的工程做对比,该工程打开几个宏就可以把运行过程的信息打印出来,包括解析码流的各个字段。

然后按手册的语法,参考h264bitstream代码,建立H.265的对应结构体,基本上语法大的方面保持一致,但H.265多了一个VPS结构体,还有ptl(profile tier level)。添加这些语法,耗时很多,一来语法字段本来就多,二来要对着手册看——即使这样,后面还是发现有个别错误、疏漏的。H.264/H.265有很多字段是属于数组类型,根据某一数值来确定范围。起初参考h264bitstream,数组统一使用255,但后来想想还是用Vector好一些,就改了。

读取码流完成了,打印字段也完成了,再从宏观上看整个工程,发现写有乱。这次是在去年写的工具上进行的,其实改善空间很大,只是自己懒,不去做。于是趁机会把代码重构了,重构后条理性好了很多。

之后就进行调试。在这个过程,还是有不少问题。

有些是细节问题,比如有个地方判断B帧,结果把“==”写成“=”,查了半天才发现。还有一个地方是pred_weight_table的判断,判断P和B帧的条件不同,但代码复制时不注意,没搞对,又花了很久排查。还有一个是读取slice头部的num_ref_idx_l1_active_minus1字段,同样是代码复制,没有注意是ue(),在和HM代码运行结果对比时,花了很多时间才确定问题。

打印NAL字段函数里,有些不按语法上写,导致个别字段和其它工具的不一致,于是又对着手册改——开始时就应该如此,又是懒没用心写。

下面说说其它的问题。

解析NAL,是要将码流转换成RBSP,代码工程统一使用h264bitstream提供的nal_to_rbsp函数,但该函数只针对只有一个字节的H.264码流的,而H.265的NAL头有2个字节。在转换时是不包括NAL头的,于是就手动修改该函数的参数。

关于SEI,h264bitstream库并没有做过多解析。或许是SEI信息重要程度不高吧。还有一个问题。在PPS中,more_rbsp_data的判断不正确。导致后面的字段不再解析。几经搜索,最终使用FFMPEG代码的判断方法,似乎是正常的了,就不再深究。

而至于其它的修改、完善,我在另一篇文章《关于h264bitstream的bug修正及完善》里写了,这里不再写出了。

四、界面

无论怎样,还是完成了。此事务算告一段落。界面如下:

源代码仓库地址为:https://github.com/latelee/H264BSAnalyzer。后续不确定是否要继续维护、更新,以仓库代码为准。

后记:调休期间,有传言说大大boss拍板停止调研某国产的支持H.265的芯片平台,但我没有在正式场合得到信息,不懂是否真实。在不确定是否上H.265时,我决定搞这个工具,在不确定是否停止H.265时,完成这个工具。有始有终。

2015.11.21的更新:

发布v2.1版本。使用树形控件显示码流语法元素。增加界面的缩放功能。离上个版本有差不多2个月了,理论上搞这么个小功能不用花那么久的,主要还是因为自己懒,一到周末就完全不想写代码了。新版本界面如下(一眼看上去,顿时觉得高端好多):

一个H.265/HEVC码流分析工具相关推荐

  1. 完成一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  2. 我的HEVC码流分析工具MFC小笔记:树形控件使用及窗口缩放

    大约1个半月前,发布了自己写的HEVC码流分析工具.当时的版本显示语法元素使用是的Edit控件.很多主流分析工具都使用树形控件,看上去觉得比较高端,于是在纠结一天后下定决心自己也实现树形的HEVC语法 ...

  3. android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...

    Elecard StreamAnalyzer是一个专业的视频码流分析工具,拥有码流错误报告.TS错误侦测和基于ETSI TR101-290的分析功能,能够对编码器媒体流进行深入的句法分析,支持H.26 ...

  4. 实现一个avs2码流分析工具

    最近在做avs2编码器项目,但是却没有成熟的码流分析工具,于是抽空学习了QT,业余时间写了一个avs2码流分析工具. 软件的界面如下: 图1.avs2码流分析仪界面 UI的左边框为NAL列表或者语法元 ...

  5. FFmpeg入门详解之12:Elecard Stream Analyzer码流分析工具

    简介 Elecard Stream Analyzer是一款简单小巧的码流分析工具,通过该软件,用户可以快速的分析查看视频序列码流:软件操作简单,使用方便,用户只需将视频文件导入软件内,系统就会自动帮您 ...

  6. Elecard Stream Analyzer码流分析工具

    1.简介   Elecard Stream Analyzer是一款简单小巧的码流分析工具,通过该软件,用户可以快速的分析查看视频序列码流:软件操作简单,使用方便,用户只需将视频文件导入软件内,系统就会 ...

  7. 视频格式基础知识 让你了解MKV MP4 H 265 码率\码流 多码流等等

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51784440   文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一 ...

  8. H264码流分析工具

    概述 本文作为一个笔记,记录笔者学习H264码流的过程.重点记录使用工具分析H264码流.使用该工具,可方便查看码流中NALU的结构,为我们学习和理解有很大帮助. H264码流介绍 笔者直接参考:ht ...

  9. H264/H265/YUV码流分析工具推荐(一)

    1.CodecVisa(跨平台:H264/H265...) http://www.codecian.com/downloads.html2.H264BSAnalyzer(H264/H265) http ...

最新文章

  1. 线程池的一些疑问和解答
  2. python基础教程:类型转换和舍入
  3. 制作程序化装饰花纹图案_装饰图案
  4. html 调用tcpdump,Linux tcpdump命令的用法详解(内容较多)
  5. 微信或正测试“发送语音过程”转文字功能 部分安卓用户可用
  6. memset初始化类对象出错解析
  7. linux 运行级别,linux执行流程 /etc/rc.d/init.d目录理解
  8. python图像灰度化、二值化
  9. 浏览器html中加入word,web网页中加载word
  10. 分形之谢尔宾斯基(Sierpinski)三角形
  11. koa 设置cache_nodejs cache 缓存机制的简单实现
  12. ROS中launch文件和参数设置
  13. swift野梦抄袭 taylor_如何看待蔡健雅新歌《半途》被指抄袭 Taylor Swift 的《Safe Sound》?...
  14. 刻意练习:Python基础 -- Task07. 文件与文件系统
  15. xml文件导入wps_#WPS表格怎么导入XML数据?#excel怎样导入wps表格数据
  16. 在DW中实现鼠标移入字体变色
  17. 动态规划特训:贝茜的晨练(多状态转移)
  18. 第七篇、网络资源获取。
  19. 数据埋点几种方式介绍
  20. 燕山大学教务系统官网计算机学院,2021年燕山大学教务系统入口:https://jwc.ysu.edu.cn...

热门文章

  1. 损耗的基础知识(中)
  2. 身体指数bmi流程图_【新城校区】新生体检丨你了解你的身体吗?
  3. 手机短信删除了怎么恢复?简单方法推荐
  4. C语言表达式是运算符和,C语言之运算符和表达式
  5. codewars题目记录
  6. J2SE - super
  7. 字符串插入字符串函数
  8. postman传布尔类型的值传不进去
  9. postman接口自动化图文案例介绍
  10. 什么是云原生数据库?