如何用脚本批量生成音乐可视化?

wen 实用脚本 2

本文目录导读:

如何用脚本批量生成音乐可视化?

  1. 使用 FFmpeg + Python 方案
  2. 使用 Librosa 和 Matplotlib 方案
  3. 使用 VapourSynth 高级方案
  4. 使用专业的 Batch Script 方案
  5. 高级配置选项
  6. 使用建议

使用 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
  }
}

使用建议

  1. 选择合适的方案

    • 快速波形:使用 FFmpeg showwaves
    • 频谱分析:使用 Librosa + Matplotlib
    • 复杂效果:使用 VapourSynth
  2. 性能优化

    • 使用多进程/线程加速
    • 调整分辨率和帧率
    • 选择合适的编码参数
  3. 常见问题

    • 音频对齐问题:使用 -shortest 参数
    • 编码兼容性:使用 H.264 编码
    • 内存不足:降低分辨率或帧率

需要更具体的实现或遇到问题,欢迎继续询问!

抱歉,评论功能暂时关闭!