TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua
标题:
[K] Joker_Game_ED
[打印本页]
作者:
面麻
时间:
2016-5-31 16:33:56
标题:
[K] Joker_Game_ED
本帖最后由 面麻 于 2016-5-31 16:34 编辑
完整工程和相关文件都在百度网盘。
链接:
http://pan.baidu.com/s/1hrOSQJq
密码: kuv7
一般 TV Raw 的音频用来做 tcAudio 效果都不好。
关于 tcaxLog() 函数的使用。
它可以把变量的值输出到 log 文件,方便 debug。
这里举例,用来统计音高的平均值。
设置全局变量,利用 IsLineChanged 函数初始化为0,对于一句歌词的每一帧,
将对应时间的音高求和,最后在 _j == _n - 1 时将和除以帧数。
这样可以得出每一句的平均音高,利用 tcaxLog 输出。
把它们存储在元组中,在 tcaxPy_Init 函数中将元组声明为全局变量。
另外,鼓声一般是在音频的低频段,BANDS 数设置最好不小于 6,频段选择 0 和 1都比较合适。
这个效果是把音高转化为旋转量,算是个新点子。
也可以转化为其它量,之前 Durarara_2_Ten_ED_JP 是转化为 bord 和 blur 量。
from tcaxPy import *
from util.tcAudio import *
def Spectrum(fft): # convert fft data to graph
SPECWIDTH = 368
SPECHEIGHT = 127
BANDS = 6
bars = []
b0 = 0
for x in range(BANDS):
peak = 0 # peak of a certain bar
b1 = pow(2, x * 10.0 / (BANDS - 1))
if b1 > 1023:
b1 = 1023
if b1 <= b0:
b1 = b0 + 1 # make sure it uses at least 1 FFT bin
while b0 < b1: # peak = max(fft[1:b1])
if peak < fft[1 + b0]:
peak = fft[1 + b0]
b0 += 1
y = int(sqrt(peak) * 5 * SPECHEIGHT)
bars.append(y)
return bars
def tcaxPy_Init(): # TCC 文件 < tcaxpy init = true >
global dFrameDur
global channel
global freq
dFrameDur = 1000 / GetVal(val_FXFPS) # 帧时间,毫秒
# tcAudio
tcAudioInit()
channel = tcAudioOpen("D:\RH\JokerGame\JokerGameED.wav") # tcAudio 模块,注意个性化音频路径
freq = tcAudioGetFreq(channel)
def tcaxPy_Fin(): # TCC 文件 < tcaxpy fin = true >
tcAudioFin()
def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
ASS_BUF = [] # used for saving ASS FX lines
if _i < 6:
if _j % 2 == 0:
nSign = -1
else:
nSign = 1
# 简单入场效果,上下淡入
EFT1 = move(_x, _y + nSign * randint(30, 60), _x, _y, 0, 200) + color1('08067C') + color3('FFFFFF') + alpha1(255) + alpha3(255) + t(0, 200, alpha1(0) + alpha3(0) + blur(2))
ass_main(ASS_BUF, SubL(_start - 20, _start + _elapk), EFT1, _txt)
# K 效果,变色
EFT2 = pos(_x, _y) + blur(2) + color1('08067C') + color3('FFFFFF') + t(color1('FFFFFF') + color3('08067C'))
ass_main(ASS_BUF, SubL(_start + _elapk, _start + _elapk + _k), EFT2, _txt)
# 出场效果,向左旋转飞出,此处 bord 和 blur 的变化注意自己调整到合适
ts3 = _start + _elapk + _k
te3 = ts3 + randint(10, 20)
EFT3 = move(_x, _y, _x - randint(20, 40), _y + randint(-20, 20)) + color1('FFFFFF') + color3('08067C') + t(frz(randint(-180, 180)) + bord(50) + blur(50) + alpha1(255) + alpha3(255))
ass_main(ASS_BUF, SubL(ts3, te3), EFT3, _txt)
else:
# 入场效果,左右整行进入,设置三组增加重影效果
for i in range(3):
nPosXDelta = randint(100, 150)
ass_main(ASS_BUF, SubL(_start - 20, _start, 0), move(_x - nPosXDelta, _y, _x, _y) + fad(100, 0) + blur(2), _txt)
ass_main(ASS_BUF, SubL(_start - 20, _start, 1), move(_x + nPosXDelta, _y, _x, _y) + fad(100, 0) + blur(2), _txt)
# 存在,无效果
ass_main(ASS_BUF, SubL(_start, _start + _elapk), pos(_x, _y) + blur(2), _txt)
# 统计 K 时间的帧数
nFrameCnt = int(10 * _k / dFrameDur + 0.5)
nAngle = 0 # 必须在循环外初始化,否则旋转不连续
for i in range(nFrameCnt):
tcAudioSetPos(channel, tcAudioSec2Bytes(channel, (10 * (_start + _elapk) + i * dFrameDur) / 1000))
fft = tcAudioGetFFT(channel, 2048)
bar = Spectrum(fft)
# 将 bar 高转化为旋转量
if bar[1] > 77: # 鼓声在音频的低频段,bar 高的阈值可以利用统计方法得出
nAngle += int(bar[1] / 10 + 0.5) * 2
EFT = an(5) + pos(_x, _y) + blur(2) + frz(nAngle)
ts = _start + _elapk + (i * dFrameDur / 10)
te = ts + dFrameDur / 10
ass_main(ASS_BUF, SubL(ts, te), EFT, _txt)
return (ASS_BUF, None)
复制代码
作者:
aijessica
时间:
2016-6-28 01:33:24
谢谢楼主大大免费分享!学习了
作者:
Seekladoom
时间:
2022-2-19 02:39:55
本帖最后由 Seekladoom 于 2022-2-19 02:40 编辑
这里可以用python自带的math.fmod去计算啊:
if _i < 6:
if _j % 2 == 0:
nSign = -1
else:
nSign = 1
复制代码
欢迎光临 TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua (http://tcax.org/)
Powered by Discuz! X2