H.264开源解码器评测

转自:http://wmnmtm.blog.163.com/blog/static/38245714201142883032575/

要播放HDTV,就首先要正确地解开封装,然后进行视频音频解码。所以我们需要分离器,视频解码器和音频解码器,俗称hdtv的“三件套”,又统称滤镜。

H264的分离器:

常见的有Gabest MP4分离器,就是MP4splitter,也是Gabest编写的,Halli的分离器和NDigital分离器等。

H264的视频解码器:

CoreAVC的H264视频解码器CoreAVC DirectShow Video Decoder。

月光的H264解码器,全称为Moonlight H264 Video Decoder,ffdshow的解码器,全称为ffdshow MPEG-4 Video Decoder,能打开N卡显卡硬件加速的CyberLink H.264/AVC Decoder(PDVD7)。

音频解码器:

ffdsshow,月光音频解码器、WinDVD的音频解码器、PowerDVD的音频解码器、AC3Filter音频解码器。

如果播放HDTV时碰到有声无画或者有画无声,就应该自己从解码器着手,替换一个试试。

缘起:HDTV的减肥药

其实HDTV个头大的根本原因,并非是分辨率太高,而是采用的MPEG2视频压缩算法力道不够,换成MPEG4就好得多,基本上可压缩到几G,但目前MPEG4编码群雄并起,编解码方案很不统一,有时拿着一部好片折腾半天却放不出来,再好的脾气也不免搓火。

现阶段比较好的选择是H.264/AVC。它是由ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(运动图像专家组)共同开发的视频处理标准,ITU-T称为H.264,而ISO/IEC称为AVC(高级视频编码),并将其作为MPEG-4 Part 10。可以说,H.264代表了当前业界最先进的视频压缩技术,具有压缩比高、码率低、图像质量好、容错能力强、网络适应性广等优点,在数字影像、网络电话、多媒体、IPTV、通讯等领域得到越来越广泛的应用。用H.264来处理HDTV,不仅能保留较高的视频质量,而且可以将HDTV瘦身到令人惊讶的程度,实在是对了HDTV肥胖症的减肥药。

实战:自己动手编码H.264影片

现在H.264的编码器已经很多,MainConcept H.264 Encoder和X264都很不错。下面以MainConcept H.264 Encoder为例,介绍如何将Mpeg-HDTV转换为H.264-HDTV。

启动MainConcept H.264 Encoder,在Video编辑框中输入待转换视频文件名,或点击旁边的Open按钮选择。MainConcept H.264 Encoder能识别绝大多数视频格式,包括HDTV常使用的TS和M2V、MPG、AVI、WMV格式。由于许多HDTV节目视频和音频是分离的,因此 MainConcept H.264 Encoder单独设置了Audio编辑框,可在其中输入HDTV音频文件,或用旁边的Open按钮选择。如果音视频是合成在一起的,那么选择视频文件后,Audio编辑框自动出现该视频文件,勿需再选择音频文件了。Output编辑框设置目标文件名,一般为MPG文件。

下面Output format栏设置目标文件的格式。设置好后,点击主界面下的Convert按钮,即可开始转换。由于H.264编码需要大量计算,颇为耗时,所以用户得有比较好的耐心。编码完成后,大家可以拿目标文件同源文件对比一下,不难发现用H.264编码的HDTV文件大小只有MPEG2编码的三分之一左右。

小贴士:输出文件格式的具体设置

MPEG项: 和H.264相关的有三项:H.264 Baseline、H.264 Main和H.264High,其编码的画面质量从低到高,通常选择H.264 Main就可以了。

Video项:设置制式NTSC或PAL,最好选择与源文件一致的制式,以保证转换效果并减少转换时间。

Stream项:设置流格式,主要有三种:Elementary、Program和Transport,HDTV通常使用最后一种格式,因此选择Transport(Video+Audio)项较为合适。

Audio项:设置音频格式,使用Layer2和AAC均可。点击Details按钮弹出辅助设置对话框,在此设置码率(Bitrate)以及音频格式等,还可以利用Muxer栏的选项分割HDTV文件。点击Video栏中的Advanced按钮,可更详细地设置视频参数。不建议普通用户修改。

回放:帮暴风影音搞定H.264

H.264的解码器现在太多了,不过Moonlight H.264 Video Decoder格外好一些。这款HDTV解码器的品质得到了广泛的认可,几乎成了HDTV的标准解码器。下面讲讲怎么把它和常用的暴风影音结合起来。

安装Moonlight H.264 Video Decoder,完成后启动暴风影音,选择“查看→选项”菜单,弹出选项对话框。点击“滤镜”项下的“管理”子项,再在右边的“管理”页中点击“添加滤镜”按钮。

弹出选择滤镜对话框,点击“浏览”按钮,到C:\Program Files\Common Files\Moonlight文件夹中找到h264dec.ax滤镜,将其加入,这样Moonlight H.264 Video Decoder解码器就添加到暴风影音中。最后别忘了在“管理”页中将Moonlight H.264 Video Decoder设为“首选”。

支招:回放吃力的问题

试着播放刚才压缩的HDTV,暴风影音已能正常解码,画面也很精致,与源文件相比,画质损失很小,可就是太卡了!H.264非常考验CPU的运算能力。本来MPEG2格式的解码,就让许多CPU败下阵来,若无支持HDTV硬解压的显卡帮忙,非得有顶级的配置才能使播放较为流畅。而H.264的算法比MPEG2更复杂,如果纯软件解码,即使是目前顶级的配置,解码高分辨率H.264-HDTV也比较吃力。

还好,ATI和Nvidia都有支持H.264硬解码的GPU推出。ATI的R520即使在较低配置下,也可以流畅地解码H.264-HDTV,只是价位不那么平易近人。而Nvidia方面,因为Geforce6/7系列GPU都内建PureVideo视频引擎,只需升级PureVideo,即可使Geforce6/7系列支持H.264解码,这一点比较实惠。至于解码效率,虽不及采用纯硬件解码模式,但比纯软件解码还是强些。Nvidia称,在Forceware85的支持下,6600GT之后NvidiaGPU产品都可以全速解码1080p高清晰H.264视频。CES2006上曾有人用Geforce7800演示H.264解码,效果还不错。

H.264标准的由来

1998年,视频编码专家组(ITU-TVCEG)启动了H.26L工程,旨在研制新的视频编码压缩标准,要做到尽可能地简单直观,同时网络适应性要足够好,以适合广播、存储、流煤体等交互或非交互式应用。

2001年12月,VCEG和运动图像专家组(ISO/IECMPEG)组成联合视频组(JVT),在H.26L基础上研制出H.264/AVC编码标准,于2003年3月正式获得ISO/IEC批准。

在网络时代,视频往往要借助网络进行传播,这就要求一个好的视频方案能适应各种网络应用及网络类型。H.264/AVC无疑做到了这点。它包含两个层次:视频编码层(VCL)和网络抽象层(NAL),前者主要致力于有效地表示视频内容,后者则规范视频数据的格式,主要是提供头部信息,以适合各种媒体的传输和存储。

H.264/AVC的高压缩率及其优良的网络特性,使它可能在网络电话、视频点播、IPTV、视频会议、视频聊天、远程教学、广播电视、HDTV、流媒体服务、3GPP多媒体信息服务、视频邮件等方面得到广泛的应用。

转自:http://blog.csdn.net/sunshine1314/article/details/712401

Peter Lee 2006.05.07 videosky.9126.com

2003年5月,当H.264编码标准草案发布时,很多人都觉得H.264太复杂,不宜实用。眨眼间3年过去了,以往的论断、疑惑被如今的现实冲洗的干干净净。随着硬件性能的提高和视频编码工作者对H.264的不断优化,如今的H.264已完全实用,最新的达芬奇芯片上能实现D1分辨率(720*480)视频的实时编码,而对于解码,普通的PC机就能实现x264编码的DVDrip电影的流畅播放。纵观过去的三年,有多少人对H.264倾注了热情和汗水才换来今天的成绩,而那些H.264的开源项目以及参与这些项目的开发者自然是功不可没。

本文评测的是作者接触过的H.264开源解码器,包括:JM decoder, T264 decoder, x264 decoder, ffmpeg libavcodec, Intel IPP simple player。评测的内容有:对H.264特性的支持、解码速度以及二次开发难易程度。

一、H.264开源解码器介绍

1、JM decoder

JM decoder是H.264的官方源码,通常也称为校验模型。其特点是支持特性好,实用性差。本文选用的程序是JM86,不支持high profile,因为本文不对high profile部分进行实验比较。

NOTE: JM一直没有做实用化方面的努力,所以其解码速度代表的是2003年的水平。

2、T264 decoder

T264是国内的开源项目,T264 decoder的程序做过汇编优化,速度还可以,但只能解T264本身的码流。作者对T264 decoder version 0.14(2005-3-29)作了修改,支持baseline的解码。

3、x264 decoder

x264本没有decoder,但其包含decoder的部分函数雏形,猜想作者在一开始时是准备实现decoder,后来可能是因为有了ffmpeg,就放弃了这个想法(纯粹属于猜测,呵呵)。

本文的x264 decoder是作者在x264 svn check out 2005.12.26的基础上实现的,支持baseline的解码。

4、ffmpeg libavcodec

ffmpeg是一个大项目,它包含各种音视频标准的codec,还支持各类file format(.avi, .mp4, .mkv and etc)的parsing。所以,很多开源项目都有直接或间接地采用了ffmpeg,如mplayer播放器就是直接采用了ffmpeg,而mpc播放器则是先采用了ffdshow filter,而ffdshow又采用了ffmpeg。ffmpeg是一个非常棒的音视频编解码库,支持的标准非常全,而且编解码速度也很快。

本文实验采用的是cvs check out 2006.02.20的版本,作者对其中的apiexample demo进行了简单的修改,用于解码h.264码流

5、Intel IPP simple player

Intel的IPP库,全称为Integrated Performance Primitives,在Intel的各种处理器平台(IA-32, Itanium, xscale and etc)上实现了信号处理常用算法、常用数学运算及音视频编解码算法等等。IPP给我的第一感觉是,在Intel的处理器平台上,它实现的各种算法应该是最快的,至于实际结果如何,待等到实验比较后见分晓。

本文采用的IPP库版本为IA32 5.1.017 评估版

Intel IPP simple player是用于播放各种音视频文件的简单播放器,用c++实用,具体算法调用IPP库来实现。本文采用的simple player版本是5.0.017

二、对于H.264特性的支持

1、JM86 decoder

support baseline, extended, main profile

2、T264 decoder

baseline

3、x264 decodeer

baseline

4、ffmpeg libavcodec

support baseline, main profile, high profile except the feature: paff, mbaff…

5、Intel IPP simple player

support baseline and main profile

【简单结论】

解码速度:ffmpeg > IPP simple player > x264 decoder > t264 decoder > jm86 decoder

以ffmpeg的编码速度为基准,假设为100fps,则:

IPP simple player:90fps

x264 decoder:50fps

t264 decoder:30fps

jm86 decoder:3fps

五、程序开发上的比较

我估计阅读本文的大部分读者都是搞开发的,因此,阅读过程中自然会思考如何在程序开发上借鉴或者采用以上开源的H.264解码器,下面就针对程序开发上的难易、适用场合等作个比较。

1、JM86 decoder

适合写paper群体

2、T264 decoder

3、x264 decodeer

两者代码非常相似,所以就合在一起讲了。这两个源码的程序结构都比较清晰,支持vc和gcc的编译环境,但对H.264的特性支持不好,解码速度和ffmpeg相比,还有差距。

4、ffmpeg libavcodec

程序结构比较差,H.264解码的代码基本上在h264.c一个文件中,这个文件有8000多行,不利于阅读。

编译环境为gcc或MinGW,移植到vc下比较难(我尝试过)。

解码速度快(BTW: 通过doom9论坛了解到,目前最快的h.264解码器是CoreAVC decoder,比ffmpeg快50%左右)。

对于H.264特性的支持好。

5、Intel IPP simple player

分两个方面讲:

(a)IPP库

我觉得是非常棒的,但实现的是H.264解码(IPP中也有H.264编码)的一些关键函数,如deblock,dct,插值补偿等,不能直接拿来用。

其它的缺点:IPP库是商业软件,要money的,而且只支持Intel平台

(b)simple player

开源,用c++写的,而且是directshow编程,也就是说只支持windows平台。

其解码速度比ffmpeg慢10%左右,我觉得原因不在于IPP库,而是simple player的代码不够完善。

时间: 2024-12-21 05:57:58

H.264开源解码器评测的相关文章

H.264官方软件JM源代码简单分析-解码器ldecod

前一阵子看了一下H.264官方参考软件JM的源代码,在这里总结一下它的结构.JM编解码H.264的速度相对于FFmpeg来说是非常慢的,但是它的代码写得清晰易懂,更适合做学术方面的研究.JM包含了视频解码器ldecod和视频编码器lencod.本文记录视频解码器ldecod的结构. 函数调用关系图 JM中的H.264视频解码器ldecod的函数调用关系图如下所示.   单击查看更清晰的大图 下面解释一下图中关键标记的含义. 函数背景色函数在图中以方框的形式表现出来.不同的背景色标志了该函数不同的

FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分

本文继续分析FFmpeg中libavcodec的H.264解码器(H.264 Decoder).上篇文章概述了FFmpeg中H.264解码器的结构:从这篇文章开始,具体研究H.264解码器的源代码.本文分析H.264解码器中解析器(Parser)部分的源代码.这部分的代码用于分割H.264的NALU,并且解析SPS.PPS.SEI等信息.解析H.264码流(对应AVCodecParser结构体中的函数)和解码H.264码流(对应AVCodec结构体中的函数)的时候都会调用该部分的代码完成相应的功

【H.264/AVC视频编解码技术具体解释】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据

<H.264/AVC视频编解码技术具体解释>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战project的形式对H.264的标准进行解析和实现,欢迎观看! "纸上得来终觉浅.绝知此事要躬行".仅仅有自己依照标准文档以代码的形式操作一遍,才干对视频压缩编码标准的思想和方法有足够深刻的理解和体会. 链接地址:H.264/AVC视频编解码技术具体解释 GitHub代码地址:点击这里 1. H.264的CAVLC

【H.264/AVC视频编解码技术详解】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据

<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看! "纸上得来终觉浅,绝知此事要躬行",只有自己按照标准文档以代码的形式操作一遍,才能对视频压缩编码标准的思想和方法有足够深刻的理解和体会! 链接地址:H.264/AVC视频编解码技术详解 GitHub代码地址:点击这里 1. H.264的CAVLC解析宏块残差数据的流

h.264并行解码算法分析

并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-level Decomposition 在h.264解码时进行功能划分,例如对于四核系统,各个核心分别执行下列任务 熵解码framen 逆量化.逆变换framen-1 预测处理framen-2 去块滤波framen-3 这种并行类型就是流水线类型,但这种类型在h.264解码中会出现以下问题 各个功能部分

FFmpeg的H.264解码器源代码简单分析:概述

本文简单记录FFmpeg中libavcodec的H.264解码器(H.264 Decoder)的源代码.这个H.264解码器十分重要,可以说FFmpeg项目今天可以几乎"垄断"视音频编解码技术,很大一部分贡献就来自于这个H.264解码器.这个H.264解码器一方面功能强大,性能稳定:另一方面源代码也比较复杂,难以深入研究.本文打算梳理一下这个H.264解码器的源代码结构,以方便以后深入学习H.264使用.PS:这部分代码挺复杂的,还有不少地方还比较模糊,还需要慢慢学习...... 函数

Windows系统下开源编解码库H.264与FFmpeg-2.8.2的编译与配置

一. 前言 FFmpeg是一个基于Linux开发的开源项目,其源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不支持MSVC++编译,需要在Windows下配置一个类似Linux的编译环境进行编译. 编译生成动态链接库dll,这些库将和其他的动态链接库一样在使用上没什么差别.可以使用MSVC++来链接这些库到其他的程序,也就是说,Windows + Visual Studio平台下的软件开发. 如果没有时间了解以下编译的过程,可直接下载以下链接的压缩

FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分

本文分析FFmpeg的H.264解码器的环路滤波(Loop Filter)部分.FFmpeg的H.264解码器调用decode_slice()函数完成了解码工作.这些解码工作可以大体上分为3个步骤:熵解码,宏块解码以及环路滤波.本文分析这3个步骤中的第3个步骤. 函数调用关系图 环路滤波(Loop Filter)部分的源代码在整个H.264解码器中的位置如下图所示. 单击查看更清晰的图片 环路滤波(Loop Filter)部分的源代码的调用关系如下图所示. 单击查看更清晰的图片 环路滤波主要用于

FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分

本文分析FFmpeg的H.264解码器的熵解码(Entropy Decoding)部分的源代码.FFmpeg的H.264解码器调用decode_slice()函数完成了解码工作.这些解码工作可以大体上分为3个步骤:熵解码,宏块解码以及环路滤波.本文分析这3个步骤中的第1个步骤. 函数调用关系图 熵解码(Entropy Decoding)部分的源代码在整个H.264解码器中的位置如下图所示. 单击查看更清晰的图片 熵解码(Entropy Decoding)部分的源代码的调用关系如下图所示. 单击查