zoukankan      html  css  js  c++  java
  • H.264开源解码器评测

    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

    三、评测条件

    1、所用测试序列

    表1 所用测试序列

    分辨率

    序列名称

    特点

    编码帧数

    QCIF

    foreman

    纹理复杂度一般

    运动剧烈:画面人物和镜头均运动,还有场景的切换

    300

    CIF

    foreman

    同上

    300

    mthr_dotr

    背景简单

    画面人物运动幅度不大

    100

    mobile

    纹理复杂度极高

    运动形式丰富——画面有多个运动物体,但各运动物体运动方向规则且平缓,镜头也在移动

    200

    D1(720*480)

    soccer2

    镜头有移动,画面的足球运动员的运动也很剧烈

    300

    puppy

    镜头无运动,画面中的玩具小狗也只有简单的运动

    100

    2、编码参数

    编码程序:x264 svn check out 2006.05.06

    参数设置示例:x264enc --frames 300 --no-cabac --qp 26 -o test.264 foreman.cif 352x288(相当于baseline)

    量化步长:26和36

    2、环境

    CPU: Pentium4 2.4GHz, RAM: DDR 512M

    OS: windows2000 professional+sp4

    3、解码器程序编译环境

    JM86 decoder: vc71 release

    T264 decoder: vc71 release

    x264 decodeer: vc71 release

    ffmpeg libavcodec: MinGW

    Intel IPP simple player: vc71 release + directX 9.0c sdk

    4、解码参数设置

    不保存重建序列(note: 是否保存重建序列对于解码速度的影响很大)

    四、解码速度比较结果

    待补充完整。。。

    表2 解码速度比较(单位:fps)

    分辨率

    序列名称

    量化步长

    JM86 decoder

    x264 decodeer

    ffmpeg libavcodec

    QCIF

    foreman

    26

    50fps左右

    684.93

    1196

    36

    874.64

    1916.67

    CIF

    foreman

    26

    15fps左右

    168.44

    303.86

    36

    190.11

    503.37

    mthr_dotr

    26

    182.82

    421.28

    36

    200

    634.62

    mobile

    26

    129.28

    190.07

    36

    173.01

    353.46

    D1(720*480)

    soccer2

    26

    5fps左右

    53.04

    105.17

    36

    60.19

    158.12

    puppy

    26

    61.54

    192.23

    36

    64.64

    253.85

    【note】

    t264的解码程序能解jm baseline的码流,但无法解上面x264生成的码流,故无法给出实验结果。但通过对自身t264 fast mode码流的解码速度进行统计,t264 decoder和x264 decoder,解码速度降低40%左右。

    Intel IPP simple player在我的电脑上编译未成功,在其它成功编译的电脑(xp系统,directx, vs.net, IPP均安装于C盘)上进行简单测试,其解码速度和ffmpeg的解码速度相比,降低10%左右。

    【简单结论】

    解码速度: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的代码不够完善。

    trackback:http://www.rosoo.net/a/201006/9757.html

  • 相关阅读:
    开发流程
    团队模式
    android studio 中点击button加1或者减1
    登录注册界面的测试点
    用在线工具processOn画UML的用例图和时序图
    android studio中R文件丢失了
    第一次迭代任务
    WBS(work Breakdown Structure)
    #“速达” app NABCD分析
    “速达”app电梯演说
  • 原文地址:https://www.cnblogs.com/JohnShao/p/2184482.html
Copyright © 2011-2022 走看看