查看完整版本: [-- H.264级别(Level)计算器(JavaScript网页版) --]

『漫游』酷论坛 -> 『影音数码技术学习交流』 -> H.264级别(Level)计算器(JavaScript网页版) [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

zyl910 2011-12-12 22:53

H.264级别(Level)计算器(JavaScript网页版)

www.cnblogs.com/zyl910/archive/2011/12/12/h264_level_calculator.html

H.264级别(Level)计算器(JavaScript网页版)

  上回我们学会了怎么计算级别(H.264 级别(Level)、DPB 与 MaxDpbMbs 详解:http://www.cnblogs.com/zyl910/archive/2011/12/08/h264_level.html)。但是每次手工计算就太麻烦了,我们希望有一款工具能完成这些运算。最好该工具还能跨平台使用。
  在综合考虑上面的需求 和 开发难度性 后,我决定编写一个JavaScript网页程序。

  最终效果——


下载地址——
files.cnblogs.com/zyl910/h264_level_calculator.rar



作者:zyl910
出处:cnblogs.com/zyl910/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

06_taro 2011-12-13 07:46
  1. #!/bin/env python
    # coding: utf-8

    #****************************************************************************
    #  avc_refcalc.py 0.20
    #                                   written by Chikezun
    #  Reference literature:
    #    インプレス標準教科書シリーズ改訂版 H.264/AVC教科書
    #           著者:(監修)大久保 榮/(編者)角野 眞也、菊池 義浩、鈴木 輝彦
    #    http://en.wikipedia.org/wiki/H.264/MPEG-4_AVC
    #    猫科研究所(http://www.up-cat.net/FrontPage.html)
    #         x264(vbv-maxrate,vbv-bufsize,profile,level),H.264(Profile/Level)
    #
    #****************************************************************************

    import sys
    import math

    def usage():
        print "Usage: avc_refcalc.py [options]\n"
        print "  -r, --resolution <string> :set 'width x height' ('1280x720')"
        print "  -l, --level <string>      :set 'level' ('4.1')"
        print "  -p, --profile <string>    :set 'profile' ('high')"
        print "  -i, --interlaced          :specify interlaced mode (not specified)"
        print "  -h, --help                :display this help and exit\n"

    def check_prof(pr, ip):
        for i in ['baseline', 'main', 'high']:
            if i == pr:
                if i != 'baseline' or ip != 'interlaced':
                    return i
                else:
                    print "ERROR : baseline cannot accept interlaced."
        print "ERROR : invalid profile setting.\n"
        usage()
        sys.exit()

    def check_level(lv, ip, dic):
        lvl = lv.replace('0','').replace('.','')
        if dic.has_key(lvl):
            if ip[0] != 'i' or dic.get(lvl)[0] == 'i':
                return lvl
            else:
                print "ERROR : specified level cannot accept interlaced."
        print "ERROR : invalid level value.\n"
        usage()
        sys.exit()

    def calc_mbs(w, h, ip):
        mbh = int(math.ceil(float(w) / 16))
        mbv = int(math.ceil(float(h) / 16))
        if mbv % 2 == 1 and ip == 'interlaced':
            mbv += 1
        mbs = mbh * mbv
        if mbs > 0:
            return mbs
        else:
            print "ERROR : invalid resolution setting.\n"
            usage()
            sys.exit()

    def calc_vbv(lv, pr, dic):
        vbvmax = dic.get(lv)[1]
        vbvbuf = dic.get(lv)[2]
        if pr == 'high':
            return [int(vbvmax * 1.25), int(vbvbuf * 1.25)]
        else:
            return [vbvmax, vbvbuf]

    def calc_maxref(lv, mbs, dic):
        ref = int(dic.get(lv)[3] / mbs)
        if ref > 16:
            ref = 16
        if ref > 0:
            return ref
        else:
            print "ERROR : resolution is too large to level.\n"
            usage()
            sys.exit()

    options = sys.argv
    len_opt = len(options)

    #set default values
    width  = 1280
    height = 720
    level  = '4.1'
    prof   = 'high'
    mode   = 'progressive'
    help   = 0

    #H.264/AVC level dictionary {level: [interlaced flag, MaxBR, MaxCPB, MaxDbpMbs]}
    avcdic = {'1' :['p',     64,    175,    396], '1b':['p',    128,    350,    396],
              '11':['p',    192,    500,    900], '12':['p',    384,   1000,   2376],
              '13':['p',    768,   2000,   2376], '2' :['p',   2000,   2000,   2376],
              '21':['i',   4000,   4000,   4752], '22':['i',   4000,   4000,   8100],
              '3' :['i',  10000,  10000,   8100], '31':['i',  14000,  14000,  18000],
              '32':['i',  20000,  20000,  20480], '4' :['i',  20000,  25000,  32768],
              '41':['i',  50000,  62500,  32768], '42':['p',  50000,  62500,  34816],
              '5' :['p', 135000, 135000, 110400], '51':['p', 240000, 240000, 184320]}

    if len_opt > 1:
        for i in range(len_opt):
            try:
                if options[i] == '-r' or options[i] == '--resolution':
                    res    = options[i + 1].split('x')
                    width  = int(res[0])
                    height = int(res[1])
                if options[i] == '-l' or options[i] == '--level':
                    level = options[i + 1]
                if options[i] == '-p' or options[i] == '--profile':
                    prof = options[i + 1]
                if options[i] == '-i' or options[i] == '--interlaced':
                    mode = 'interlaced'
                if options[i] == '-h' or options[i] == '--help':
                    help = 1

            except:
                print "ERROR : invalid arguments\n"
                help = 1

            else:
                pass

        if help == 1:
            usage()
            sys.exit()

    else:
        usage()

    profile = check_prof(prof, mode)
    lv_tmp  = check_level(level, mode, avcdic)
    mbs     = calc_mbs(width, height, mode)
    vbv     = calc_vbv(lv_tmp, profile, avcdic)
    maxref  = calc_maxref(lv_tmp, mbs, avcdic)

    print " resolution       : %i x %i" % (width, height)
    print " level            : %s" % level
    print " profile          : %s" % profile
    print " mode             : %s" % mode
    print " vbv-maxrate(vlc) : %i" % vbv[0]
    print " vbv-bufsize(vlc) : %i" % vbv[1]
    print " max ref number   : %i" % maxref


記不得是幾年前的東西了……

zyl910 2011-12-13 11:20
感谢楼上分享。分析了一下——
check_prof:判断是不是有效的档次。pr:档次;ip:隔行。
check_level:判断是不是有效的级别。lv:级别;ip:隔行;dic:数据字典。
calc_mbs:计算每帧宏块数。w:宽度;h:高度;ip:隔行。
calc_vbv:计算档次的码率。lv:级别;pr:档次;dic:数据字典。
calc_maxref:计算参考帧数。lv:级别;mbs:每帧宏块数;dic:数据字典。

优点:考虑了隔行、码率。
缺点:没有考虑帧率。


查看完整版本: [-- H.264级别(Level)计算器(JavaScript网页版) --] [-- top --]


Powered by phpwind v8.5 Code ©2003-2011 phpwind
Time 0.032800 second(s),query:3 Gzip disabled