自己在学习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. 极简 Node.js 入门 - 5.2 url & querystring

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  2. java 画 哆啦A梦

    package Demo;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;impo ...

  3. centos8平台使用blkid查看分区信息

    一,blkid的用途 blkid 命令是一个命令行工具,它可以显示关于可用块设备的信息 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/archite ...

  4. jquery ui,拖拽,dragsort

    一.导入js.导入jquery.dragsort.js外还需要导入jQuery. 二.HTML部分 <!DOCTYPE html> <html> <head> &l ...

  5. JS DIV列表自动滚动带停顿,滚动到底部后自动滚动到顶部

    setInterval -- 间隔执行函数:element.scrollTop -- 元素滚动条距头部的距离: 因为执行代码需要时间,所以最终动态时间会比设置的要慢 var slide = new S ...

  6. 微信小程序的账号找回。

    之前注册过微信小程序,好久没用了,马上要开发微信小程序了,我今天登陆了一下突然发现 然后点击账号找回,按照流程同意点击下一步,到第二部时要输入搜索框里的提示. 这时的我早已忘了,百度搜了一下如何找回原 ...

  7. SpringCloud 与 SpringBoot版本问题

    如果SpringBoot版本与SpringCloud版本不一致,SpringBoot应用启动会报错: 解决方案: 版本对应关系可以在 https://start.spring.io/info 上查看: ...

  8. 第12天 | 12天搞定Python,让excel飞起来

    学了10多天Python基础知识了,是时候来点硬货了,看过<第1天 | 12天搞定Python,告诉你有什么用?>的老铁都知道,Python可用的领域挺多的.只是我长期待在企业,所以只能说 ...

  9. find for /f 分割字符串 bat

    @Echo off::总用例数For /f "tokens=2" %%i in ('Type bat.txt^|Find "Ran"') do (Echo %% ...

  10. axb_2019_heap-format_string + off-by-one

    axb_2019_heap 简单题,格式化字符串泄漏栈地址 算上rsp,格式化字符串参数是栈顺序+6-1 edit有off by one 构造unlink chunk0 chunk1 chunk2 构 ...