用 Python 和 Pygame 实现音频可视化

本教程将带你学习如何使用 Python 的 Pygame 库将音频文件可视化,创建动态的频谱图。我们将使用 Pygame 绘制音频数据,并将音频波形转换为可视化表示。

代码实现

import pygame
import numpy as np
import sys
import wave
import struct

初始化音频文件

filename = 'audio.wav' wf = wave.open(filename, 'rb') sampwidth = wf.getsampwidth() nchannels = wf.getnchannels() framerate = wf.getframerate() nframes = wf.getnframes()

初始化pygame

pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("Audio Visualization") clock = pygame.time.Clock()

读取音频数据

frames = wf.readframes(nframes) samples = np.frombuffer(frames, dtype=np.int16)

设置参数

scale = 0.05 offset = 500

running = True frame_count = 0

while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False

# 清空屏幕
screen.fill((0, 0, 0))

# 绘制频谱
for i in range(0, len(samples), 100):
    y = int(samples[i] * scale) + offset
    pygame.draw.line(screen, (255, 255, 255), (i // 100, 600), (i // 100, 600 - y))

# 更新屏幕
pygame.display.flip()

# 控制帧率
clock.tick(60)

frame_count += 1

# 读取下一帧音频数据
if frame_count * 100 >= len(samples):
    frames = wf.readframes(nframes)
    samples = np.frombuffer(frames, dtype=np.int16)
    frame_count = 0

关闭音频文件

wf.close()

退出pygame

pygame.quit() sys.exit()

代码解释

  • 初始化音频文件: 我们首先打开一个音频文件,并获取其采样宽度、声道数、采样率和帧数等信息。
  • 初始化 Pygame: 初始化 Pygame 库,创建窗口并设置窗口标题。
  • 读取音频数据: 读取音频文件的帧数据,并将帧数据转换为 NumPy 数组。
  • 设置参数: 定义一些参数,例如比例和偏移量,用于控制可视化的大小和位置。
  • 绘制频谱: 在循环中,我们迭代音频样本数组,并为每个样本绘制一条线段,线段的高度表示样本的振幅。
  • 更新屏幕: 更新屏幕以显示绘制的内容。
  • 控制帧率: 使用 Pygame 的时钟对象来控制绘制的帧率。
  • 读取下一帧音频数据: 当所有样本都绘制完后,重新读取音频文件的帧数据,并开始新一轮绘制。

注意事项

请注意,此示例代码假设音频文件是单声道且采样宽度为 16 位。如果你的音频文件不符合这些要求,你可能需要对代码进行适当的修改。

总结

通过 Pygame,我们可以轻松地将音频文件可视化,创建动态的频谱图。本教程提供了一个简单的实现,你可以根据自己的需要进行扩展和修改。


原文地址: https://www.cveoy.top/t/topic/pHrO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录