自己在学习h264的路上,欢迎讨论交流。

  前段时间研究JM出品的h264编码器,代码实在看不下去,因此换了个角度来研究诸多算法——逆向方式(解码),本系列文章记录一些遇到的东西和思考。

1. JM介绍

  JM编解码器,是一个纯软件编解码器,由位于德国的海因里希赫兹研究所(Heinrich Hertz Institute)推出,是h264官方推荐的用于研究avc算法的软件。

2. JM & x264

  JM但其未做太多优化,速度较慢,用于科研需求。x264则是JM的升级版,编码速度较快,广泛应用于企业,例如网上下载的视频,(目前的时间节点)毫不夸张地说,50%以上都是由x264压制而来。

  抄一段网上的对比:

1,X264简化了JM的代价(或者叫成本)计算方法,去掉了一些代码,进行了估算。
2,JM中是要把编码后的比特数进行加权运算后作为代价的一部分进行比较的,X264把这个部分的代码删除了,即没有把编码后的比特数作为代价的一部分。
3,X264进行了SSE2,MMX的优化。
4,X264对JM的数据结构部分进行了优化,以加快内存的数据读取速度。
5,由于JM不断地升级。JM代码里面有了很多的快速算法,包括快速搜索算法。X264则没有这些快速算法。

3. 使用哪个版本?

  jm8.6版本是最经典的版本,网上资料较齐全,建议下载该版本。

  读者可自行去官网下载代码,来编译和运行。该软件同时支持Win和Linux平台下构建,下载的代码中已经建了vc工程,也包括Makefile。

4. 构建、运行流程

  本人在Win10+mingw环境做开发验证,此外还需将一些编译工具链(gcc/ld等gcc家族产品)准备好,才能使用Makefile。

  JM目录结构如下:

  1 $ tree
2 .
3 |-- CHANGES.TXT
4 |-- Changes_detail.txt
5 |-- Readme.txt
6 |-- bin
7 | |-- decoder.cfg
8 | |-- encoder_baseline.cfg
9 | |-- encoder_extended.cfg
10 | |-- encoder_main.cfg
11 | |-- foreman_part_qcif.yuv
12 | |-- leakybucketrate.cfg
13 | |-- sg0conf.cfg
14 | |-- sg2conf.cfg
15 | `-- sg6conf.cfg
16 |-- copyright.txt
17 |-- disclaimer.txt
18 |-- doc
19 | |-- coding_style.doc
20 | |-- doxygen.txt
21 | |-- foot.html
22 | |-- h26l.css
23 | |-- ldecod.dox
24 | `-- lencod.dox
25 |-- ldecod
26 | |-- Makefile
27 | |-- inc
28 | | |-- annexb.h
29 | | |-- biaridecod.h
30 | | |-- block.h
31 | | |-- cabac.h
32 | | |-- context_ini.h
33 | | |-- contributors.h
34 | | |-- ctx_tables.h
35 | | |-- defines.h
36 | | |-- elements.h
37 | | |-- erc_api.h
38 | | |-- erc_do.h
39 | | |-- erc_globals.h
40 | | |-- errorconcealment.h
41 | | |-- fmo.h
42 | | |-- global.h
43 | | |-- header.h
44 | | |-- image.h
45 | | |-- leaky_bucket.h
46 | | |-- loopfilter.h
47 | | |-- macroblock.h
48 | | |-- mb_access.h
49 | | |-- mbuffer.h
50 | | |-- memalloc.h
51 | | |-- nalu.h
52 | | |-- nalucommon.h
53 | | |-- output.h
54 | | |-- parset.h
55 | | |-- parsetcommon.h
56 | | |-- rtp.h
57 | | |-- sei.h
58 | | `-- vlc.h
59 | `-- src
60 | |-- annexb.c
61 | |-- biaridecod.c
62 | |-- block.c
63 | |-- cabac.c
64 | |-- context_ini.c
65 | |-- erc_api.c
66 | |-- erc_do_i.c
67 | |-- erc_do_p.c
68 | |-- errorconcealment.c
69 | |-- filehandle.c
70 | |-- fmo.c
71 | |-- header.c
72 | |-- image.c
73 | |-- ldecod.c
74 | |-- leaky_bucket.c
75 | |-- loopFilter.c
76 | |-- macroblock.c
77 | |-- mb_access.c
78 | |-- mbuffer.c
79 | |-- memalloc.c
80 | |-- nal.c
81 | |-- nal_part.c
82 | |-- nalu.c
83 | |-- nalucommon.c
84 | |-- output.c
85 | |-- parset.c
86 | |-- parsetcommon.c
87 | |-- rtp.c
88 | |-- sei.c
89 | `-- vlc.c
90 |-- ldecod.dsp
91 |-- ldecod.dsw
92 |-- ldecod.vcproj
93 |-- lencod
94 | |-- Makefile
95 | |-- inc
96 | | |-- annexb.h
97 | | |-- biariencode.h
98 | | |-- block.h
99 | | |-- cabac.h
100 | | |-- configfile.h
101 | | |-- context_ini.h
102 | | |-- contributors.h
103 | | |-- ctx_tables.h
104 | | |-- defines.h
105 | | |-- elements.h
106 | | |-- fast_me.h
107 | | |-- fmo.h
108 | | |-- global.h
109 | | |-- header.h
110 | | |-- image.h
111 | | |-- intrarefresh.h
112 | | |-- leaky_bucket.h
113 | | |-- macroblock.h
114 | | |-- mb_access.h
115 | | |-- mbuffer.h
116 | | |-- memalloc.h
117 | | |-- minmax.h
118 | | |-- mv-search.h
119 | | |-- nalu.h
120 | | |-- nalucommon.h
121 | | |-- output.h
122 | | |-- parset.h
123 | | |-- parsetcommon.h
124 | | |-- ratectl.h
125 | | |-- rdopt_coding_state.h
126 | | |-- refbuf.h
127 | | |-- rtp.h
128 | | |-- sei.h
129 | | `-- vlc.h
130 | `-- src
131 | |-- annexb.c
132 | |-- biariencode.c
133 | |-- block.c
134 | |-- cabac.c
135 | |-- configfile.c
136 | |-- context_ini.c
137 | |-- decoder.c
138 | |-- fast_me.c
139 | |-- filehandle.c
140 | |-- fmo.c
141 | |-- header.c
142 | |-- image.c
143 | |-- intrarefresh.c
144 | |-- leaky_bucket.c
145 | |-- lencod.c
146 | |-- loopFilter.c
147 | |-- macroblock.c
148 | |-- mb_access.c
149 | |-- mbuffer.c
150 | |-- memalloc.c
151 | |-- mv-search.c
152 | |-- nal.c
153 | |-- nalu.c
154 | |-- nalucommon.c
155 | |-- output.c
156 | |-- parset.c
157 | |-- parsetcommon.c
158 | |-- ratectl.c
159 | |-- rdopt.c
160 | |-- rdopt_coding_state.c
161 | |-- refbuf.c
162 | |-- rtp.c
163 | |-- sei.c
164 | |-- slice.c
165 | |-- vlc.c
166 | `-- weighted_prediction.c
167 |-- lencod.dsp
168 |-- lencod.dsw
169 |-- lencod.vcproj
170 |-- rtpdump
171 | |-- ReadMe.txt
172 | |-- StdAfx.cpp
173 | |-- StdAfx.h
174 | |-- rtpdump.cpp
175 | `-- rtpdump.dsp
176 |-- tml.dsw
177 |-- tml.sln
178 `-- unixprep.sh

  1. 进入ldecod目录,执行make,即可编译出解码器,最终会将可执行文件ldecod.exe拷贝到根目录下的bin文件夹中。(可能会遇到几个预处理错误问题,是关于不同平台下最大值的定义)

  2.与上面类似,进入lencod目录,构建出编码器。

  3.进入bin目录,执行命令:

  ./ldecod.exe decoder.cfg

  其中,decoder.cfg指定了裸码流路径(不能是mp4等带文件容器格式的文件,必须是NALU形式的裸数据——可由ffmpeg提取出来)、解码后yuv文件输出路径等参数。

jm8.6编解码器概述的更多相关文章

  1. Netty4.x中文教程系列(一) 目录及概述

    Netty4.x中文教程系列(一)目录及概述 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. Netty是一个NIO客户端 服务端框架 ...

  2. WPF概述

    一.概述 WPF(Windows Presentation Foundation,视窗展示[呈现.展现.显示.表示]基础)是Windows的新一代图形子系统,他为开发人员提供了统一的编程模型,可用于构 ...

  3. 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器

    第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...

  4. 伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265

    伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265 截至今天,伟大的UHD编解码器的争论涉及两个主要参与者:谷歌VP9和HEVC / H.265. 哪一个获得成功并where-invol ...

  5. 多媒体的框架 - OpenCore框架概述

    OpenCore是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:PVPlayer:提供媒体播放器的功能,完成各种音频 (Audio).视频(Video)流的回放(Playback)功能. ...

  6. Netty In Action中文版 - 第七章:编解码器Codec

    http://blog.csdn.net/abc_key/article/details/38041143 本章介绍 Codec,编解码器 Decoder,解码器 Encoder,编码器 Netty提 ...

  7. netty框架概述

    概述 最近在学习netty的相关知识,也在看netty的源码,光看不练假把式,所以也正好利用自己学习的机会写几篇netty的分析文章,主要还是一些源码解析的文章,一方面有输出会促使自己在看源码,学习原 ...

  8. 转载:AAC编解码概述

    转自:http://www.cnblogs.com/gaozehua/archive/2012/05/03/2479960.html 编码概述 其整体AAC 编解码系统,如图所示,其编码流程概述如下: ...

  9. 第1章 Spark SQL概述

    第1章 Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作 ...

随机推荐

  1. 多测师讲解接口测试 _面试题003_高级讲师肖sir

    接口测试 一.你对HTTP有没有了解过?具体讲一下对http的了解.(答题思路: 定义.常见请求类型.状态码.请求头请求体.响应头和响应体.三次握手和四次挥手.)答:了解,我们做接口的时候基本上都是基 ...

  2. [论文阅读笔记] GEMSEC,Graph Embedding with Self Clustering

    [论文阅读笔记] GEMSEC: Graph Embedding with Self Clustering 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 已经有一些工作在使用学习 ...

  3. .NET Core+MongoDB集群搭建与实战

    目录 安装 MongoDB apt 直接安装(方法1) apt 仓库安装(方法2) 方法1.2启动 MongoDB 通过二进制包安装(方法3) 安装依赖 deb 安装 MongoDB tgz 安装 M ...

  4. Gitlab 11.9.1 高可用教程

    Gitlab 11.9.1 高可用教程 一. PostgreSQL数据迁移 由于默认Gitlab的安装会内置Postgres数据库,并且没有对外,所以我们需要通过设置对应的Gitlab的配置将其中的数 ...

  5. Python函数名的应用和新特性格式化输出

    1.函数名指向的是函数的内存地址. ​ def func(): print(123) print(func,type(func)) # <function func at 0x000000000 ...

  6. Helium文档8-WebUI自动化-wait_until等待元素出现

    前言 wait_until等待某个条件为真才继续往下执行.默认的超时时间为10s,每0.5查询一次,这俩参数选填.可以设置超时时间和轮询间隔. 可以作为添加后校验元素是否存在的场景 入参介绍 def ...

  7. matplotlib中文标签乱码

    在python的安装目录下 找到~\Lib\site-packages\matplotlib\mpl-data 将字体文件(例如黑体SimHei.ttf,一般C:\Windows\Fonts路径下就有 ...

  8. Ubuntu 18.04 LTS IP 地址设置

    和之前的版本不太一样, Ubuntu 18.04 的 ip地址设置是用netplan管理的     配置文件在: /etc/netplan/50-cloud-init.yaml 示例文件如下: # T ...

  9. SpringBoot整合原生OpenFegin的坑(非SpringCloud)

    写在前面 最近,在使用SpringBoot+K8S开发微服务系统,既然使用了K8S,我就不想使用SpringCloud了.为啥,因为K8S本身的就提供了非常6的服务注册与发现.限流.熔断.负载均衡等等 ...

  10. LruCache缓存bitmap(三)

    应用在网络连接上,onrestart后不会重新联网获取图片,省去了流量, public class MainActivity extends AppCompatActivity { ImageView ...