最近还有个项目是打算重构@晨旭 的音乐台,其中一项就是如何通过非录屏的方式实现类似(hocassian.cn/SC)的音频可视化效果:

首先考虑的肯定是ffmpeg这款工业级编码神器了,但我在国内的网络上找了一圈也没找到,都是这种模式的:

https://hhsprings.bitbucket.io/docs/programming/examples/ffmpeg/audio_visualization/index.html
正当我打算放弃的时候,机缘巧合之下最后在github上搜到了这个:
https://github.com/mfcc64/showcqt-bash
虽然只是一个只有2star的shell脚本,但实际效果真的不错:


#!/bin/bash
# Usage:
# showcqtlow-encode background.png input-audio.mp3 [output-video.mp4]
background="$1"
input="$2"
if test "_$3" = "_"; then
output="`basename "$input"`.showcqtbar.mp4"
else
output="$3"
fi
firequalizer="
firequalizer =
gain = '1.4884e8 * f*f*f / (f*f + 424.36) / (f*f + 1.4884e8) / sqrt(f*f + 25122.25)':
scale = linlin:
wfunc = hamming:
zero_phase = on:
fft2 = on
"
background_in="scale=1920:1080, format=gbrp"
audio_in="
asettb =1/sr,
asetpts = N,
aformat =
channel_layouts = stereo,
asplit [ao],
atrim =
start_pts = 0,
afifo
"
showcqt="
showcqt =
fps = 60:
size = 1920x564:
count = 1:
csp = bt709:
bar_g = 2:
sono_g = 4:
bar_v = 3:
sono_v = 19:
sono_h = 0:
axis_h = 36:
bar_t = 0.5:
axis = 0:
tc = 0.33:
attack = 0.033:
tlength = 'st(0,0.17); 384*tc / (384 / ld(0) + tc*f /(1-ld(0))) + 384*tc / (tc*f / ld(0) + 384 /(1-ld(0)))',
format = rgb24,
format = gbrp
"
stack="
split [vstack],
crop =
w = iw:
h = ih - 48:
x = 0:
y = 0,
vflip [vstack2];
[vstack][vstack2]
vstack
"
merge_alpha="
mergeplanes =
format = gbrap:
mapping = 0x00010200
"
filter_complex="
$background_in [overlay_image];
$audio_in,
$firequalizer,
$showcqt,
$stack,
split [overlay_base],
$merge_alpha [overlay_top];
[overlay_base][overlay_image]
overlay =
format = gbrp [overlay_middle];
[overlay_middle][overlay_top]
overlay =
format = gbrp:
alpha = premultiplied,
scale =
out_color_matrix = bt709,
format = yuv420p [vo]
"
ffmpeg -i "$background" -i "$input" -ss 00:00:15 -to 00:00:25 -filter_complex "$filter_complex" -codec:a aac -b:a 384k \
-codec:v libx264 -crf 22 -qcomp 0.7 -preset fast -movflags faststart \
-map '[vo]' -map '[ao]' -colorspace bt709 -color_range tv \
-color_primaries bt709 -color_trc bt709 "$output"
具体参数汉化:https://www.jianshu.com/p/0ad6e9526487
在参考了各种大佬的研究结果之后,发现这种效果已经是最好的了……所以考虑下是否要投入实战哈哈(总之骑驴找马,先用着,边用边看看有没有更好的选择),感觉是ffmpeg开发组怕大家滥用所以故意没整新花样……









