1.HM下载

  1. HM不能直接网页下载,因为它是采用svn来管理代码的,因此需要利用svn下载,这里采用TortoiseSVN(软件下载地址为https://tortoisesvn.net/)进行下载。

  2. 下载并安装TortoiseSVN,在桌面任意位置右键,打开repo-browser
  3. 在弹出来的URL框填入HM的下载地址:https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftware/tags/
    svn_HEVCSoftware分成三个大类:

    trunk:主干程序,是最新的HM主线版本。

    branches:分支程序,是扩展的HM版本。

    tags:各个版本的HM版本。

  4. 然后就能看到HM相关文件夹,所发布的HM版本在tags文件夹中
  5. 在需要的版本中右键选择“checkout”,即可进行下载。这里选择的是最新版HM-16.17
             关于版本,可以看到早期版本中有“RExt”字样,RExt表示Format Range Extension,用于支持4:0:0,4:2:2,4:4:4的颜色空间和额外比特深度。但到HM16.0后,RExt已经并入HM主线,因此不再单独列出RExt。而对于有”SCM”字样版本,即包含SHVC,MV-HEVC,3D-HEVC版本分支。

2.HM运行

  1. 在HM16.18->build文件夹中,点击对应的VS版本打开,这里以HM_vc2015.sln为例,可以看到右侧出现9个项目。
  2. 右击“解决方案‘HM_vc2013’(9个项目)”->”生成解决方案”。debug,win32可选,与系统是否是64位的无关,不影响工程运行

    生成成功后,在HM16.7下会生成一个“bin”文件夹,在bin\vc2013\Win32\Debug中会有2个可执行文件:TAppEncoder.exe和TAppDecoder.exe

  3. 我们主要对HEVC编码器进行研究,即将yuv格式码流编码成HEVC格式数据,所以主要关注TAppEncoder。
    右击解决方案中“TAppEncoder”->“设为启动项目”
    再右击“TAppEncoder”->”属性”->”配置属性”->”调试”
    在工作目录栏指定工作目录路径,这里在HM16.7下创建了一个workspace的文件夹作为工作目录。
    在命令参数栏中需要填写的是用到的配置文件名,包含2个:
    (1)编码器配置文件: encoder_intra_main.cfg,文件路径:D:\HEVC\HM16.7\cfg。并把该文件复制到workspace中。
    (2)视频源配置文件(该用于指定输入yuv测试文件,分辨率,待编码帧数等):为了日后使用方便,在workspace中新建一个bitstream.cfg的配置文件,配置的编写复制HM16.7\cfg\per-sequence中的相应配置即可。(如,我们需要压缩BasketballDrill视频文件,则打开BasketballDrill.cfg并把其中的配置复制到bitstram.cfg中。但注意要修改InputFile的地址,这个后面会提到)。
  4. 指定源数据文件
    下载地址1:http://ftp.kw.bbc.co.uk/hevc/hm-15.0-anchors/bitstreams/i_main/ ;

    该地址下载下来的是.bin格式的265压缩文件,需经265解码器解码成yuv格式文件才可为编码器使用。
    下载地址2(已经失效):https://pan.baidu.com/share/link?shareid=976413622&uk=204312922#list/path=%2F
    该地址下载下来的是.yuv的yuv文件,可用于265编码器编码。这里下载了一个BasketballDrill_832x480_50.yuv文件用于编码测试

  5. 修改配置文件
    在HM16.7\cfg\per-sequence中找到BasketballDrill.cfg,并把其中的配置复制到bitstream.cfg
    修改bitstream.cfg中的配置:
    InputFile修改为码流路径,注意路径不能有中文字符,斜线方向不影响。
    FramesToBeEncoded修改为5.即只编码5帧,这里只为缩短编码时间。

    修改encoder_intra_main.cfg中的配置:
    将QP值修改为51,以减小压缩后的码流量大小

    注意:以上配置不能乱改,一旦不满足规范,则程序无法正常运行。  (如IntraPeriod和GOPSize这两个参数的修改就有点复杂,一些都选1,即都是I帧,如果不是,还要设置一些参数,而不是简单改变数值。例子见encoder_lowdelay_main_rext.cfg)。

  6. 运行程序
    运行过程中出现如下界面,运行结束后在workspace中生成2个文件:str.bin和rec.yuv。前者是编码后的码流文件,后者是重建的yuv格式图像

3.码流分析

目前HEVC有几款不错的码流分析软件,CodecVisa,Elecard HEVC Analyzer等,但CodecVisa收费,Elecard HEVC Analyzer可以找到破解版,下面来简单介绍Elecard HEVC Analyzer的使用方法。

Elecard HEVC Analyzer破解版下载地址,内附激活教程(CSDN现在没法传免费资源,以后共享资源我尽量用百度云):链接:https://pan.baidu.com/s/1jJE2W8A 密码:gmof
打开Elecard HEVC Analyzer,然后打开编码得到的.bin文件。

左上角选择Chart Bar可以查看每帧视频码流分配情况:
 
Thumbnails查看视频的缩略图及对应的编码索引和时间索引。
 
 
上方三个按钮控制显示块划分、预测角度(帧内方向,帧间MV),分块类型。
 
 
左侧可以看到帧级别的统计信息,比如色度格式、分辨率、各类型帧所分配的比特比例等,下面可以更换查看VPS、SPS等其他级别的信息。
 
 
右侧可以查看CU级别的信息,块的位置、尺寸、预测方向等等。
 
 
详细教程见Elecard自带的User Guided。

4.错误分析

1. 没有进行任何改动,程序开始运行一闪就自动结束了。
尤其是新手!注意了!很多人一上手就跑程序,成功生成了,但是运行什么都没有,就这个问题!HM是需要设置输入参数和cfg的!
使用HM的肯定都会遇到,一般都是输入参数或cfg文件的问题,查看输出的out.txt可以看到相关提示。检查输入参数是否正确(阅读用户手册查错),cfg文件中的输入YUV地址是否填写正确,对应位置是否有对应的YUV文件。
 
2. 对代码进行改动后报错。
同上,查看输出的的out.txt看相关提示,找到对应位置进行修正。各类问题很多,就是很基本的C程序调试,不具体说了。
 
3. 运行程序,也不报错,也没有正常编码的提示。
首先还是建议等,因为很可能是因为你的机子太慢了,HM还好,如果使用JEM,编一帧都可以睡一觉了,耐心等一下。如果超过几个小时还不动,那就是程序的问题了,去找错吧。
 
4.正常编码输出的重构图像打开后如下图,有两种可能:
 

(1)编码输入的分辨率错误,只能改好重新编码一下。

(2)cfg中设置的InternalBitDepth为10,这不是错误,无法正常显示是因为重构图像是10bit图像,而一般YUV播放器只支持8bit图像,像素值越界。这里提供一个本人自己改的10bit YUV播放器:http://blog.csdn.net/lin453701006/article/details/79892864。
 
4.针对编码速度慢问题补充说明
新手肯定对于编码速度有很多疑问,也有很多人问我这个问题,因此在这里单独说明一下。
HM的编码速度相关的因素:
(1).很重要一定要记住,在真正测试时一定要用release版!release相比debug版本速度会快很多,x64也要比x86速度快一些。这个具体原因不深究了,有兴趣可以自己研究下。
(2).输入参数,编码帧数、QP等。建议在检验你的代码是否正确和初步检测性能优劣时,用较少帧。而QP是公共测试条件限定的,没法从QP方面入手提高速度。
(3).视频序列的分辨率,这一点很好理解,没什么可说的。
(4).所有人都能想到,电脑配置也会影响。不过我尝试过,配置只要够用,运行速度差异不大,主要还是C++的运行效率限制了运行速度。

5.参考链接

  1. https://blog.csdn.net/u011025888/article/details/78841829

  2. https://blog.csdn.net/lin453701006/article/details/52775820

HEVC之路0:HM16.18的运行+码流分析的更多相关文章

  1. 【转】Sqlite 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该...

    开发环境: vs2010+.net framework 4.0+ System.Data.SQLite.DLL (2.0)今天在做Sqlite数据库测试,一运行程序在一处方法调用时报出了一个异常 混合 ...

  2. 11.2.0.4 aix下运行第二个节点root.sh报错处理

    第二个节点运行root.sh报错如下 Entries will be added to the /etc/oratab file as needed by Database Configuration ...

  3. C#程序集问题:混合模式程序集是针对“v2.0.50727”版的运行时生成的.....

    今天在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0,同时准备进一步完善,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常: 混合模式程序集是针对“v2.0.50727”版 ...

  4. 混合模式程序集是针对“v2.0.50727”版的运行时生成的

    混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集. 由于“system.data.sqlite.dll”不完整造成的. 在 ...

  5. [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程

    标准常规安装方法安装的OpenCV版本比较低,想尝鲜使用4.0版本,只好源码安装. 安装环境 OS:Ubuntu 18.04 64 bit 显卡:NVidia GTX 1080 CUDA:10.0 c ...

  6. Qt 学习之路 2(18):事件

    Home / Qt 学习之路 2 / Qt 学习之路 2(18):事件 Qt 学习之路 2(18):事件  豆子  2012年9月27日  Qt 学习之路 2  60条评论 事件(event)是由系统 ...

  7. 《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门

    准备工作 1.安装查看 Java 的版本号,推荐使用 Java 8. 安装 Flink 2.在 Mac OS X 上安装 Flink 是非常方便的.推荐通过 homebrew 来安装. brew in ...

  8. 1.MongoDB报错 Failed to connect 127.0.0.1:27017 Mongo运行错误

    1.Mongo运行错误:Failed to connect 127.0.0.1:27017 Mongo运行错误:Failed to connect 127.0.0.1:27017,reason:err ...

  9. android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令

    android studio从1.5更新到2.0后terminal无法运行gradle命令,提示无法找到gradle命令. 'gradle' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 设 ...

随机推荐

  1. 1053 Path of Equal Weight

    Given a non-empty tree with root R, and with weight W​i​​ assigned to each tree node T​i​​. The weig ...

  2. 基于FOC伺服电机驱动的Parallel Scara Robot的设计及实现

    上个学期做了一个BLDC的FOC驱动后,我便开始了基于此类电机驱动的机器人项目尝试.之前想做的是串联机械臂,奈何找不到合适的电机并且串联机械臂十分需要减速机,使得项目对于我来说(经济方面)很艰难,恰巧 ...

  3. OPPO R11S识别不到ADB Device

    1.手机开启[开发者选项] 2.[开发者选项]打开[USB调试] 有个坑:10分钟不使用,将自动关闭 3.USB连接到电脑,选择模式为[仅充电] 4.电脑安装OPPO驱动 坑:安装进度卡在95%三分钟 ...

  4. CVE-2010-2553:Microsoft Cinepak Codec CVDecompress 函数堆溢出漏洞调试分析

    0x01 前言 微软提供一个叫 Cinepak 的视频解码器,通过调用 iccvid.dll 这个动态链接库文件可以使用这个解码器:微软自带的 Windows Media Player(视频音频软件) ...

  5. Android Dex分包之旅

    http://yydcdut.com/2016/03/20/split-dex/ http://blog.zongwu233.com/the-touble-of-multidex http://tec ...

  6. 【python】【补】Leetcode每日一题-合并两个有序数组

    [python]Leetcode每日一题-合并两个有序数组 [题目描述] 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 ...

  7. base标签的作用

    base标签可以自定义当前页面的相对路径,不受浏览器当前地址栏的影响,以base标签定义的地址为准 (只对相对路径起作用) <head> <meta charset="UT ...

  8. JavaScrip条件表达式优化

    目录 1,前言 2,多条件if语句优化 3,参数默认值 4,Switch语句优化 1,前言 今早看了一篇文章<JavaScrip实现:如何写出漂亮的条件表达式>,原创于:华为云开发者社区, ...

  9. 个人项目作业$\cdot$求交点个数

    个人项目作业\(\cdot\)求交点个数 一.作业要求简介 本次作业是北航计算机学院软件工程课程的个人项目作业,个人开发能力对于软件开发团队是至关重要的,本项目旨在通过一个求几何图形的交点的需求来使学 ...

  10. redis中keys命令带来的线上性能问题

    起因 下午接到运维反馈,生产redis有个执行keys的命令请求太慢了,要两三秒才能响应 涉及命令如下: KEYS ttl_600::findHeadFootData-15349232-*-head ...