本文目录导读:

使用 FFmpeg + Python 方案
安装依赖
pip install numpy scipy pillow matplotlib # 安装FFmpeg (Mac) brew install ffmpeg # 或 Ubuntu sudo apt install ffmpeg
批量生成脚本示例
import os
import subprocess
from pathlib import Path
import json
def batch_music_visualization(input_dir, output_dir, config_file):
"""
批量生成音乐可视化
"""
# 加载配置
with open(config_file, 'r') as f:
config = json.load(f)
# 获取所有音频文件
audio_files = list(Path(input_dir).glob('*.mp3')) + \
list(Path(input_dir).glob('*.wav')) + \
list(Path(input_dir).glob('*.flac'))
for audio_file in audio_files:
output_file = Path(output_dir) / f"{audio_file.stem}_visualization.mp4"
# 使用FFmpeg生成波形可视化
cmd = [
'ffmpeg',
'-i', str(audio_file),
'-filter_complex',
f"[0:a]showwaves=s={config['width']}x{config['height']}:mode={config['wave_mode']}:rate={config['fps']}:colors={config['color']}|{config['bg_color']}[v]",
'-map', '[v]',
'-map', '0:a',
'-c:v', 'libx264',
'-preset', 'medium',
'-crf', '23',
'-c:a', 'copy',
'-shortest',
str(output_file)
]
print(f"生成可视化: {audio_file.name}")
subprocess.run(cmd)
# 配置文件示例
config = {
"width": 1280,
"height": 720,
"fps": 30,
"wave_mode": "cline", # cline, p2p, lin 等
"color": "white",
"bg_color": "black"
}
if __name__ == "__main__":
batch_music_visualization(
"/path/to/audio/files",
"/path/to/output",
"config.json"
)
使用 Librosa 和 Matplotlib 方案
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from moviepy.editor import VideoClip, AudioFileClip
from moviepy.video.io.bindings import mplfig_to_npimage
def create_spectrogram_video(audio_path, output_path, duration=30):
"""
创建频谱可视化视频
"""
# 加载音频
y, sr = librosa.load(audio_path, duration=duration)
# 音频属性
audio_duration = librosa.get_duration(y=y, sr=sr)
fps = 24
total_frames = int(audio_duration * fps)
def make_frame(t):
"""生成每一帧"""
fig, ax = plt.subplots(figsize=(16, 9))
# 当前时间对应的频谱
start_sample = int(t * sr)
end_sample = int((t + 2) * sr) # 2秒窗口
if end_sample > len(y):
end_sample = len(y)
# 计算频谱
D = librosa.amplitude_to_db(
np.abs(librosa.stft(y[start_sample:end_sample])),
ref=np.max
)
# 显示频谱
librosa.display.specshow(
D,
sr=sr,
x_axis='time',
y_axis='hz',
ax=ax,
cmap='magma'
)
plt.colorbar(format='%+2.0f dB')
ax.set_title(f'Spectrogram - {Path(audio_path).stem}', fontsize=16)
# 转换为numpy数组
frame = mplfig_to_npimage(fig)
plt.close()
return frame
# 创建视频
clip = VideoClip(make_frame, duration=audio_duration)
audio_clip = AudioFileClip(audio_path)
final_clip = clip.set_audio(audio_clip)
final_clip.write_videofile(
output_path,
fps=fps,
codec='libx264',
audio_codec='aac'
)
def batch_process(input_dir, output_dir):
"""批量处理"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
audio_files = list(Path(input_dir).glob('*.mp3'))
for audio_file in audio_files:
output_file = Path(output_dir) / f"{audio_file.stem}_spectrogram.mp4"
print(f"处理: {audio_file.name}")
create_spectrogram_video(str(audio_file), str(output_file))
if __name__ == "__main__":
batch_process("./audio", "./visualizations")
使用 VapourSynth 高级方案
import vapoursynth as vs
from pathlib import Path
import os
def create_circle_visualization(audio_path, output_path, width=1920, height=1080):
"""
创建圆形粒子可视化
"""
core = vs.core
# 加载音频
audio = core.bas.AudioSource(audio_path)
# 设置视频参数
fps = 30
num_frames = int(audio.duration * fps)
# 创建视频
video = core.std.BlankClip(
width=width,
height=height,
length=num_frames,
fpsnum=fps,
fpsden=1,
format=vs.RGB24
)
# 应用可视化效果
# 这里可以自定义各种效果
# 输出
video.set_output()
def batch_circle_visualization(input_dir, output_dir):
"""批量处理圆形可视化"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
audio_files = list(Path(input_dir).glob('*.mp3'))
for audio_file in audio_files:
output_file = Path(output_dir) / f"{audio_file.stem}_circle.mp4"
create_circle_visualization(
str(audio_file),
str(output_file)
)
使用专业的 Batch Script 方案
Windows Batch Script
@echo off
setlocal enabledelayedexpansion
set INPUT_DIR=C:\audio
set OUTPUT_DIR=C:\visualizations
set WIDTH=1920
set HEIGHT=1080
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
for %%f in ("%INPUT_DIR%\*.mp3") do (
set INPUT=%%f
set OUTPUT=%OUTPUT_DIR%\%%~nf.mp4
echo Processing: %%~nf
ffmpeg -i "!INPUT!" ^
-filter_complex "[0:a]showwaves=s=%WIDTH%x%HEIGHT%:mode=cline:rate=25:colors=white|black[v]" ^
-map "[v]" -map 0:a ^
-c:v libx264 -preset medium -crf 23 -c:a copy ^
-shortest "!OUTPUT!"
)
echo All files processed!
pause
Linux/Mac Bash Script
#!/bin/bash
INPUT_DIR="./audio"
OUTPUT_DIR="./visualizations"
WIDTH=1920
HEIGHT=1080
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.mp3; do
filename=$(basename "$file" .mp3)
output="$OUTPUT_DIR/${filename}_viz.mp4"
echo "处理: $filename"
ffmpeg -i "$file" \
-filter_complex "[0:a]showwaves=s=${WIDTH}x${HEIGHT}:mode=cline:rate=30:colors=cyan|black[v]" \
-map "[v]" -map 0:a \
-c:v libx264 -preset medium -crf 23 \
-c:a aac -b:a 192k \
-shortest "$output"
done
echo "全部完成!"
高级配置选项
配置文件 (config.json)
{
"input_directory": "./audio",
"output_directory": "./visualizations",
"global_settings": {
"width": 1920,
"height": 1080,
"fps": 30,
"codec": "libx264",
"preset": "medium",
"crf": 23
},
"visualization_styles": {
"waveform": {
"mode": "cline",
"colors": ["cyan", "white", "magenta"],
"background": "black"
},
"spectrogram": {
"colormap": "magma",
"window_size": 2048,
"hop_length": 512
},
"particle": {
"particle_count": 100,
"size_range": [2, 20],
"speed": 0.5
}
},
"batch_settings": {
"parallel_processing": false,
"max_concurrent": 4,
"output_format": "mp4",
"overwrite_existing": false
}
}
使用建议
-
选择合适的方案:
- 快速波形:使用 FFmpeg showwaves
- 频谱分析:使用 Librosa + Matplotlib
- 复杂效果:使用 VapourSynth
-
性能优化:
- 使用多进程/线程加速
- 调整分辨率和帧率
- 选择合适的编码参数
-
常见问题:
- 音频对齐问题:使用
-shortest参数 - 编码兼容性:使用 H.264 编码
- 内存不足:降低分辨率或帧率
- 音频对齐问题:使用
需要更具体的实现或遇到问题,欢迎继续询问!