jm8.6编解码器概述
自己在学习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编解码器概述的更多相关文章
- Netty4.x中文教程系列(一) 目录及概述
Netty4.x中文教程系列(一)目录及概述 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. Netty是一个NIO客户端 服务端框架 ...
- WPF概述
一.概述 WPF(Windows Presentation Foundation,视窗展示[呈现.展现.显示.表示]基础)是Windows的新一代图形子系统,他为开发人员提供了统一的编程模型,可用于构 ...
- 大数据技术之_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 ...
- 伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265
伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265 截至今天,伟大的UHD编解码器的争论涉及两个主要参与者:谷歌VP9和HEVC / H.265. 哪一个获得成功并where-invol ...
- 多媒体的框架 - OpenCore框架概述
OpenCore是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:PVPlayer:提供媒体播放器的功能,完成各种音频 (Audio).视频(Video)流的回放(Playback)功能. ...
- Netty In Action中文版 - 第七章:编解码器Codec
http://blog.csdn.net/abc_key/article/details/38041143 本章介绍 Codec,编解码器 Decoder,解码器 Encoder,编码器 Netty提 ...
- netty框架概述
概述 最近在学习netty的相关知识,也在看netty的源码,光看不练假把式,所以也正好利用自己学习的机会写几篇netty的分析文章,主要还是一些源码解析的文章,一方面有输出会促使自己在看源码,学习原 ...
- 转载:AAC编解码概述
转自:http://www.cnblogs.com/gaozehua/archive/2012/05/03/2479960.html 编码概述 其整体AAC 编解码系统,如图所示,其编码流程概述如下: ...
- 第1章 Spark SQL概述
第1章 Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作 ...
随机推荐
- MeteoInfo家族的新产品:MeteoInfoLab
为了更方便地处理各种数据并绘图,尝试开发了一个新的软件产品MeteoInfoLab,软件设计上参考了MatLab和Spider.软件以脚本程序和命令行交互为主,基于MeteoInfo库并利用Jytho ...
- 物联网wifi模块
物联网wifi模块 物联网wifi模块 是上海卓岚推出的MQTT+JSON转Modbus物联网WiFi核心模块.支持以MQTT的方式连接云端服务器,支持可以界面话配置,自主采集Modbus仪表/645 ...
- pytest文档47-allure报告添加用例失败截图
前言 使用 selenium 做 web 自动化的时候,很多小伙伴希望用例失败的时候能截图,把异常截图展示到allure报告里面. pytest 有个很好的钩子函数 pytest_runtest_ma ...
- python selenium 自动登陆
#-*- coding:utf8 -*- # 导入selenium2中的webdriver库 from time import sleep from selenium import webdriver ...
- ReSharper 注册码
用户名:ronle 注册码:ZoJzmeVBoAv9Sskw76emgksMMFiLn4NM 原文地址:http://hi.baidu.com/ronle/item/a509b5f7b851971be ...
- 第三十五章 Linux常规练习题(二)参考答案
一.练习题一 1.删除用户基本组shanghai03.发现无法正常删除,怎样才能将其删除掉,不能删除用户. groupdel shanghai03 移除其所属组的用户 2.打开多个xshell窗口连接 ...
- 【Azure云服务 Cloud Service】Cloud Service的实例(VM)中的服务描述Software Protection 与 Windows Defender, 如何设置Windows Defender Antivirus服务
1)Software Protection 与 Windows Defender是两个独立的服务.在Windows 服务中他们的描述分别为 Software Protection Enables th ...
- Baolu CSV Data Set Config
1.背景 大家在平常使用JMeter测试工具时,对CSV Data Set Config 配置元件肯定不会陌生.如果我们的压测场景涉及到数据库更新操作(如:转账接接口)则需要对参数化数据进行分块,可就 ...
- .gdbinit文件配置
.gdbinit文件配置 #打印数组的索引下标 set print array-indexes on #每行打印一个结构体成员 set print pretty on #除了断点有关的线程会被停下来, ...
- Disconnected from the target VM, address: '127.0.0.1:1135', transport: 'socket'-SpringBoot启动报错
一.问题由来 本地代码在一次打包后,再次启动项目时报了一个错误,详细的错误信息如下: 2020-10-23 15:10:26.724 [] [main] INFO o.s.c.a.Annotation ...