『漫游』酷论坛>『影音数码技术学习交流』>H.264级别(Level)计算 ..
H.264级别(Level)计算器(JavaScript网页版)
zyl910@2011-12-12 22:53
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
- #!/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:数据字典。
优点:考虑了隔行、码率。
缺点:没有考虑帧率。
| TOP