(JEEB) そういや、うちのAvs2.6ビルドってChikuzen氏がテストした奴と性能がどんな感じ?
(Chikuzen) 若干スピードが上がってるみたいよ
(Chikuzen) ちょっとベンチマーク回してみるか
official 2.6.0α2 JEEB's 2.6.0(20110125) 1st 00:01:11.003(14.08fps) 00:01:07.254(14.87fps) 2nd 00:01:11.010(14.08fps) 00:01:07.003(14.92fps) 3rd 00:01:10.753(14.13fps) 00:01:07.003(14.92fps) (スクリプト等は前回と同じ)(JEEB) interesting
たしかに興味深い。
どうやら最適化はα2配布後にさらに進んでいたようである。
さて、前回、自分はマルチスレッドによる高速化ではなく、マルチプロセスによる高速化を選んだことを書いた。
ここで問題となるのが、同時にエンコードするための複数のソースがない場合である。
そもそも自分は放送ソースの保存用エンコなんてまったくしない。そんなことには興味がない。
いろいろなフィルタやエンコーダーを試して遊ぶのが好きなのである。
当然、エンコードするべきソースは大抵1本しかなく、3本同時にエンコードなんていままでに数えるほどしかやったことがない。
では、どうすればいいのか?
エンコード対象がひとつしかないのであれば、ひとつを複数に分割してやればいいだけだ。
3本同時にエンコードできる余裕があるなら、1本を3分割してそれぞれ中間出力し、ふたたびくっつけてやればよい。
それが簡単にできるのがAviSynthである。
中間出力用のファイルサイズを気にするような時代でもないしね。
てことで、自動で分割->中間出力->結合->エンコードを行うAvsPマクロを書いた。
#multiprocess intermediate file generator.py
#dividing source script into X -> generate intermediate files at same time -> final encode
#requiaments : VirtualDub.exe, vcf file, ffmpeg or x264 (optional)
import sys
import os.path
import subprocess
vdub = r'C:\VirtualDub-1.9.11\VirtualDub.exe'
vcf = r'C:\VirtualDub-1.9.11\fastrecomp_uly0_noaudio.vcf'
entries = avsp.GetTextEntry(['Number of dividing', 'SetMemoryMax(?)'], ['3', '1024'])
dnum, mmax = [int(i) for i in entries]
imf_outdir = avsp.GetDirectory('Select a directory to output intermediate files.')
encbin = avsp.GetFilename('Set Path to Encoder(ffmpeg or x264)')
#encbin = r'G:\Enctools\ffmpeg.exe'
#encbin = r'G:\Enctools\x264_x64.exe'
encout = avsp.GetSaveFilename('Set final output file name')
encopts = avsp.GetTextEntry('Input commandline options').split(' ')
source = avsp.SaveScript()
frames = avsp.GetVideoFramecount()
if dnum > 1 and mmax > 0 and imf_outdir and frames and os.path.isfile(vdub) and os.path.isfile(vcf):
start = 0
vdubprocess = []
catfilename = os.path.splitext(source)[0] + '_imf.avs'
catfile = open(catfilename, 'w')
for i in range(dnum):
end = frames / dnum * (i + 1)
if i < dnum - 1:
trimline = 'trim(%i, %i)' % (start, end)
else:
trimline = 'trim(%i, 0)' % start
lines = 'SetMemoryMax(%i)\nImport("%s")\n%s\n' % (mmax, source, trimline)
start = end + 1
imf_avsname = os.path.join(imf_outdir, os.path.basename(source)).rstrip('avs') + 'imf_%02i.avs' % i
file = open(imf_avsname, 'w')
file.write(lines)
file.close()
imf_aviname = os.path.splitext(imf_avsname)[0] + '.avi'
vdubargs = [vdub, '/s', vcf, '/p', imf_avsname, imf_aviname, '/r', '/c', '/x']
p = subprocess.Popen(vdubargs)
vdubprocess.append(p)
if i < dnum - 1:
catfile.write('AVISource("%s") + \\\n' % imf_aviname)
else:
catfile.write('AVISource("%s")\n' % imf_aviname)
catfile.close()
if encbin and encout:
for p in vdubprocess:
p.wait()
if os.path.basename(encbin).count('ffmpeg'):
encargs = [encbin, '-i', catfilename] + encopts + ['-y', encout]
elif os.path.basename(encbin).count('x264'):
encargs = [encbin, catfilename, '-o', encout] + encopts
else:
sys.exit()
subprocess.Popen(encargs)
0 件のコメント:
コメントを投稿