如何用Python案例实现音量控制?

wen python案例 1

本文目录导读:

如何用Python案例实现音量控制?

  1. 使用 pycaw 库(Windows系统)
  2. 使用 pygame 库(跨平台)
  3. 使用 pulsectl 库(Linux PulseAudio系统)
  4. 图形界面音量控制(Tkinter)
  5. 命令行音量控制工具
  6. 安装依赖
  7. 使用说明

我来为您提供几个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通常自带

使用说明

  1. Windows用户:推荐使用pycaw方案
  2. Linux用户:推荐使用pulsectl方案
  3. 跨平台需求:使用pygame处理音频播放
  4. 图形界面:使用Tkinter方案
  5. 命令行操作:使用CMD版本

这些案例可以根据您的具体需求进行调整和扩展。

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