本文目录导读:

- 使用
pycaw库(Windows系统) - 使用
pygame库(跨平台) - 使用
pulsectl库(Linux PulseAudio系统) - 图形界面音量控制(Tkinter)
- 命令行音量控制工具
- 安装依赖
- 使用说明
我来为您提供几个Python实现音量控制的案例,涵盖不同平台和场景。
使用 pycaw 库(Windows系统)
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
from comtypes import CLSCTX_ALL
import ctypes
class VolumeController:
def __init__(self):
# 获取默认音频设备
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
self.volume = interface.QueryInterface(IAudioEndpointVolume)
def get_volume(self):
"""获取当前音量(0-100)"""
current_volume = self.volume.GetMasterVolumeLevelScalar()
return round(current_volume * 100, 1)
def set_volume(self, volume_percent):
"""设置音量(0-100)"""
if 0 <= volume_percent <= 100:
self.volume.SetMasterVolumeLevelScalar(
volume_percent / 100.0, None)
return True
return False
def mute(self, mute=True):
"""静音或取消静音"""
self.volume.SetMute(mute, None)
def is_muted(self):
"""检查是否静音"""
return self.volume.GetMute()
# 使用示例
if __name__ == "__main__":
controller = VolumeController()
# 获取当前音量
print(f"当前音量: {controller.get_volume()}%")
# 设置音量为50%
controller.set_volume(50)
print("音量已设置为50%")
# 静音
controller.mute(True)
print(f"是否静音: {controller.is_muted()}")
使用 pygame 库(跨平台)
import pygame
import time
class PygameVolumeControl:
def __init__(self):
pygame.mixer.init()
def play_sound(self, file_path, volume=1.0):
"""播放音频文件并控制音量"""
sound = pygame.mixer.Sound(file_path)
sound.set_volume(volume) # 0.0到1.0
sound.play()
return sound
def fade_in(self, file_path, duration=3):
"""淡入效果"""
sound = pygame.mixer.Sound(file_path)
sound.play()
sound.fadeout(int(duration * 1000))
return sound
def fade_out(self, file_path, duration=3):
"""淡出效果"""
sound = pygame.mixer.Sound(file_path)
sound.play()
sound.fadeout(int(duration * 1000))
return sound
# 使用示例
if __name__ == "__main__":
controller = PygameVolumeControl()
sound = controller.play_sound("test.wav", 0.5)
time.sleep(2)
sound.stop()
使用 pulsectl 库(Linux PulseAudio系统)
import pulsectl
import time
class PulseVolumeController:
def __init__(self):
self.pulse = pulsectl.Pulse('volume-controller')
def list_sinks(self):
"""列出所有音频输出设备"""
sinks = self.pulse.sink_list()
for sink in sinks:
print(f"设备: {sink.name}, 音量: {sink.volume}")
return sinks
def get_volume(self, sink_name=None):
"""获取指定设备音量"""
sinks = self.pulse.sink_list()
for sink in sinks:
if sink_name is None or sink.name == sink_name:
vol = sink.volume
return round(vol.value_flat * 100, 1)
return None
def set_volume(self, percentage, sink_name=None):
"""设置音量百分比"""
sinks = self.pulse.sink_list()
for sink in sinks:
if sink_name is None or sink.name == sink_name:
vol = sink.volume
vol.value_flat = percentage / 100.0
self.pulse.volume_set(sink, vol)
return True
return False
def mute(self, mute=True, sink_name=None):
"""静音/取消静音"""
sinks = self.pulse.sink_list()
for sink in sinks:
if sink_name is None or sink.name == sink_name:
self.pulse.mute(sink, mute)
return True
return False
def close(self):
"""清理资源"""
self.pulse.close()
# 使用示例
if __name__ == "__main__":
controller = PulseVolumeController()
# 列出所有设备
controller.list_sinks()
# 设置音量为75%
controller.set_volume(75)
# 静音
controller.mute(True)
time.sleep(2)
controller.close()
图形界面音量控制(Tkinter)
import tkinter as tk
from tkinter import ttk
import platform
class VolumeSliderGUI:
def __init__(self):
self.root = tk.Tk()
self.root.title("音量控制器")
self.root.geometry("300x200")
# 根据平台选择音量控制方法
self.controller = self.get_volume_controller()
self.create_widgets()
def get_volume_controller(self):
"""根据系统选择音量控制器"""
system = platform.system()
try:
if system == "Windows":
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
from comtypes import CLSCTX_ALL
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
return interface.QueryInterface(IAudioEndpointVolume)
else:
# Linux使用pulsectl,macOS使用其他方法
# 这里返回None表示不支持
return None
except ImportError:
print("需要安装pycaw库: pip install pycaw")
return None
def create_widgets(self):
"""创建界面组件"""
# 标题
label = ttk.Label(self.root, text="系统音量控制", font=('Arial', 16))
label.pack(pady=10)
# 音量滑块
self.volume_var = tk.DoubleVar(value=50)
slider = ttk.Scale(
self.root,
from_=0,
to=100,
orient='horizontal',
variable=self.volume_var,
command=self.on_volume_change
)
slider.pack(pady=20, padx=20, fill='x')
# 显示当前音量
self.volume_label = ttk.Label(self.root, text="当前音量: 50%")
self.volume_label.pack()
# 静音按钮
self.mute_var = tk.BooleanVar(value=False)
mute_button = ttk.Checkbutton(
self.root,
text="静音",
variable=self.mute_var,
command=self.toggle_mute
)
mute_button.pack(pady=10)
# 退出按钮
quit_button = ttk.Button(
self.root,
text="退出",
command=self.root.quit
)
quit_button.pack(pady=10)
def on_volume_change(self, value):
"""音量滑块回调"""
volume = int(float(value))
self.volume_label.config(text=f"当前音量: {volume}%")
if self.controller:
self.controller.SetMasterVolumeLevelScalar(
volume / 100.0, None)
def toggle_mute(self):
"""静音切换"""
if self.controller:
self.controller.SetMute(self.mute_var.get(), None)
def run(self):
"""运行GUI"""
self.root.mainloop()
# 使用示例
if __name__ == "__main__":
app = VolumeSliderGUI()
app.run()
命令行音量控制工具
import argparse
import sys
import platform
class CMDVolumeController:
@staticmethod
def get_controller():
"""获取对应系统的控制器"""
system = platform.system()
if system == "Windows":
try:
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
from comtypes import CLSCTX_ALL
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
return interface.QueryInterface(IAudioEndpointVolume)
except ImportError:
print("需要安装pycaw: pip install pycaw")
return None
elif system == "Linux":
try:
import pulsectl
return pulsectl.Pulse('volume-controller')
except ImportError:
print("需要安装pulsectl: pip install pulsectl")
return None
else:
print(f"不支持的操作系统: {system}")
return None
@staticmethod
def handle_command(args):
"""处理命令行参数"""
controller = CMDVolumeController.get_controller()
if not controller:
return
if args.get:
if platform.system() == "Windows":
vol = controller.GetMasterVolumeLevelScalar()
print(f"当前音量: {round(vol * 100, 1)}%")
elif platform.system() == "Linux":
sinks = controller.sink_list()
for sink in sinks:
vol = sink.volume.value_flat
print(f"设备 {sink.name}: {round(vol * 100, 1)}%")
if args.set is not None:
if 0 <= args.set <= 100:
if platform.system() == "Windows":
controller.SetMasterVolumeLevelScalar(args.set / 100.0, None)
elif platform.system() == "Linux":
sinks = controller.sink_list()
for sink in sinks:
vol = sink.volume
vol.value_flat = args.set / 100.0
controller.volume_set(sink, vol)
print(f"音量已设置为 {args.set}%")
else:
print("音量值必须在0-100之间")
if args.mute is not None:
if platform.system() == "Windows":
controller.SetMute(args.mute, None)
elif platform.system() == "Linux":
sinks = controller.sink_list()
for sink in sinks:
controller.mute(sink, args.mute)
status = "已静音" if args.mute else "已取消静音"
print(f"音量 {status}")
if platform.system() == "Linux" and hasattr(controller, 'close'):
controller.close()
def main():
parser = argparse.ArgumentParser(description="命令行音量控制器")
parser.add_argument('-g', '--get', action='store_true',
help='获取当前音量')
parser.add_argument('-s', '--set', type=int,
help='设置音量 (0-100)')
parser.add_argument('-m', '--mute', type=int, choices=[0, 1],
help='静音 (1) 或取消静音 (0)')
args = parser.parse_args()
if len(sys.argv) == 1:
parser.print_help()
else:
cmd_controller = CMDVolumeController()
cmd_controller.handle_command(args)
if __name__ == "__main__":
main()
安装依赖
根据您的系统选择安装:
# Windows pip install pycaw comtypes # Linux pip install pulsectl # 跨平台基本音频控制 pip install pygame # 图形界面 pip install tkinter # Python通常自带
使用说明
- Windows用户:推荐使用pycaw方案
- Linux用户:推荐使用pulsectl方案
- 跨平台需求:使用pygame处理音频播放
- 图形界面:使用Tkinter方案
- 命令行操作:使用CMD版本
这些案例可以根据您的具体需求进行调整和扩展。