- UID
- 2443
- 积分
- 1311
- 帖子
- 78
- 主题
- 21
- 论坛币
- 909
- 威望
- 8
- EP值
- 449
- MP值
- 0
- 阅读权限
- 100
- 注册时间
- 2015-3-7
- 在线时间
- 121 小时
- 最后登录
- 2018-7-21
|
本帖最后由 面麻 于 2016-5-19 19:50 编辑
重写特效之一。
完整工程以及相关文件均在百度网盘。
链接: http://pan.baidu.com/s/1nvNCyGp 密码: vky3
字体是黑体,就不上传了。
效果预览可以看 preview.mp4。- from tcaxPy import *
- from util.tcAudio import *
- def tcaxPy_Init(): # TCC 文件 < tcaxpy init = true >
- global framedur # 每一帧的时间长度,毫秒
- global fontsize
- framedur = 1000 / GetVal(val_FXFPS)
- fontsize = GetVal(val_FontSize)
- # tcAudio
- global channel
- global freq
- tcAudioInit() # 初始化 tcAudio
- channel = tcAudioOpen("04 EXIT (TV size ver.).wav")
- freq = tcAudioGetFreq(channel)
- def Spectrum(fft): # convert fft data to graph
- SPECWIDTH = 368
- SPECHEIGHT = 127
- BANDS = 20 # 将频谱平均分为20段
- 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:
- if peak < fft[1 + b0]:
- peak = fft[1 + b0]
- b0 += 1
- y = sqrt(peak) * 5 * SPECHEIGHT
- bars.append(y)
- return bars
- def tcaxPy_Fin(): # TCC 文件 < tcaxpy fin = true >
- tcAudioFin() # 结束 tcAudio
- def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
- ASS_BUF = [] # used for saving ASS FX lines
- linedur = _end - _start # 一句的时间长度,单位 10 毫秒
- t0 = _start - 50 + _j * 7 # 逐字
- if _i == 0:
- t0 = _start + _j * 10 # 第一句的时间需要另外处理,否则 t0 会是负数
- t1 = t0 + 50
- t2 = _start + _elapk
- t3 = _start + _elapk + _k
- t4 = _end - 60 + _j * 7
- t5 = t4 + 50
- if _i < 2:
- EFT1 = pos(_x, _y) + fad(0, 900) + alpha3(HexToDec('77')) + blur(5) + bord(5) + color1('FFFFFF') + t(bord(0))
- ass_main(ASS_BUF, SubL(t2, t2 + 100, 1), EFT1, _txt) # K 效果:bord 渐变
- EFT2 = pos(_x, _y) + fad(500, 500) + bord(0) + color1('FFFFFF') + blur(1)
- ass_main(ASS_BUF, SubL(t0, t5, 0), EFT2, _txt) # 文字主体
- else:
- num = int(10 * linedur / framedur + 0.5) # 一句的帧数
- for i in range(num):
- tcAudioSetPos(channel, tcAudioSec2Bytes(channel, (10 * _start + i * framedur) / 1000)) # 逐帧定位音频
- fft = tcAudioGetFFT(channel, 2048)
- bar = Spectrum(fft)[1] # BEAT Detective,检测打击声;鼓声在音频的低频段;这需要尝试,直到达到最佳效果;这里选择 list 的第二个元素
- EFT = pos(_x, _y) + blur(sqrt(bar / 100) * 2.5) + bord(sqrt(bar / 100) * 2.5) # 将音频图形化的一种方式,bord 和 blur 强度随着鼓声幅值而改变
- if _txt == '(' or _txt == ')':
- EFT += fn("@SimHei") + frz(-90) # 歌词中的日文括号,为了美观,需要旋转一下
- ts = _start + i * framedur / 10
- te = _start + (i + 1) * framedur / 10
- ass_main(ASS_BUF, SubL(ts, te, 1), EFT, _txt)
- radiusx = int(_a / 2)
- radiusy = int(fontsize / 2)
- radius1 = min(radiusx, radiusy) + randint(10, 20)
- radius2 = max(radiusx, radiusy) + randint(20, 35)
- for j in range(0, 7, 2): # K 效果,每个字绘制 4 次粒子
- for i in range(40): # 每次绘制 40 个粒子
- desx, desy = RandCir2(_x, _y, radius1, radius2) # 随机圆环分布,返回的是元组,直接赋值即可,radius1 必须不大于 radius2;源代码见 tcaxPy.py
- ts = t2 + _k * j / 10
- te = ts + _k * 4 / 10
- EFT = move(_x, _y, desx, desy) + color1('FFFFFF') + alpha1(0) + alpha3(0) + t(alpha1(255) + alpha3(255)) + bord(1) + blur(2)
- ass_main(ASS_BUF, SubL(ts, te, 0, Pix_Style), EFT, DrawPoint()) # 注意粒子在下层,文字在上层
- return (ASS_BUF, None)
复制代码 |
|