用 Python 和 Pygame 实现音频可视化
用 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 著作权归作者所有。请勿转载和采集!