怎样实现声卡状态检测脚本

wen 实用脚本 23

本文目录导读:

怎样实现声卡状态检测脚本

  1. Linux 环境
  2. Windows 环境
  3. macOS 环境
  4. 使用说明

Linux 环境

Shell 脚本实现

#!/bin/bash
# 声卡状态检测脚本
echo "====== 声卡状态检测 ======"
# 1. 检查声卡硬件
echo "1. 声卡硬件信息:"
lspci | grep -i audio || echo "  未检测到PCI声卡"
lsusb | grep -i audio || echo "  未检测到USB声卡"
# 2. 检查声卡驱动
echo "2. 声卡驱动信息:"
lsmod | grep -E '^snd|^sound' || echo "  未加载声卡驱动"
# 3. 检查ALSA声卡列表
echo "3. ALSA声卡列表:"
aplay -l 2>/dev/null || echo "  未找到ALSA声卡"
# 4. 检查声卡状态(更详细)
echo "4. 声卡设备状态:"
cat /proc/asound/cards 2>/dev/null || echo "  无法读取声卡信息"
# 5. 检查音频设备节点
echo "5. 音频设备节点:"
ls -la /dev/snd/ 2>/dev/null || echo "  未找到音频设备节点"
# 6. 检查正在使用的音频进程
echo "6. 使用音频的进程:"
fuser -v /dev/snd/* 2>/dev/null || echo "  无音频进程"
# 7. 测试音频输出
echo "7. 音频输出测试:"
if command -v speaker-test &> /dev/null; then
    echo "  执行 speaker-test (按Ctrl+C取消)..."
    speaker-test -l 1 -t sine -f 440 2>/dev/null && echo "  音频测试成功" || echo "  音频测试失败"
else
    echo "  未安装speaker-test工具"
fi
# 8. PulseAudio检查(如果使用)
echo "8. PulseAudio状态:"
if command -v pactl &> /dev/null; then
    pactl info 2>/dev/null | head -3
    echo "  音频设备:"
    pactl list short sinks 2>/dev/null || echo "  无PulseAudio输出设备"
else
    echo "  未安装PulseAudio"
fi
echo "====== 检测完成 ======"

Python 脚本实现

#!/usr/bin/env python3
import subprocess
import os
import sys
def check_sound_card():
    print("====== 声卡状态检测 (Python) ======")
    # 1. 检查/proc/asound目录
    print("\n1. 声卡设备信息:")
    try:
        result = subprocess.run(['cat', '/proc/asound/cards'], 
                              capture_output=True, text=True)
        print(result.stdout if result.stdout else "   未找到声卡信息")
    except:
        print("   无法访问/proc/asound")
    # 2. 检查ALSA设备
    print("\n2. ALSA音频设备:")
    try:
        result = subprocess.run(['aplay', '-l'], 
                              capture_output=True, text=True)
        print(result.stdout if result.stdout else "   无ALSA设备")
    except:
        print("   未安装ALSA")
    # 3. 检查驱动加载
    print("\n3. 声卡驱动模块:")
    try:
        result = subprocess.run(['lsmod'], capture_output=True, text=True)
        sound_modules = [line for line in result.stdout.split('\n') 
                       if line.startswith('snd')]
        if sound_modules:
            for module in sound_modules:
                print(f"   {module}")
        else:
            print("   未加载声卡驱动")
    except:
        print("   无法检查驱动")
    # 4. 检查设备节点
    print("\n4. 音频设备节点:")
    if os.path.exists('/dev/snd'):
        for item in os.listdir('/dev/snd'):
            print(f"   /dev/snd/{item}")
    else:
        print("   未找到音频设备节点")
    # 5. PulseAudio检查
    print("\n5. PulseAudio状态:")
    try:
        result = subprocess.run(['pactl', 'info'], 
                              capture_output=True, text=True)
        if result.stdout:
            for line in result.stdout.split('\n')[:3]:
                print(f"   {line}")
        else:
            print("   PulseAudio 未运行")
    except:
        print("   未安装PulseAudio")
if __name__ == "__main__":
    check_sound_card()

Windows 环境

PowerShell 脚本

# 声卡状态检测脚本 (Windows)
Write-Host "====== 声卡状态检测 (Windows) ======" -ForegroundColor Cyan
# 1. 获取音频设备信息
Write-Host "`n1. 音频设备信息:"
$devices = Get-WmiObject Win32_SoundDevice
if ($devices) {
    foreach ($device in $devices) {
        Write-Host "   设备名: $($device.Name)"
        Write-Host "   状态: $($device.Status)"
        Write-Host "   PNP设备ID: $($device.PNPDeviceID)"
        Write-Host "   ----------"
    }
} else {
    Write-Host "   未找到音频设备" -ForegroundColor Red
}
# 2. 检查音频服务状态
Write-Host "`n2. 音频服务状态:"
$services = @("Audiosrv", "AudioEndpointBuilder")
foreach ($svc in $services) {
    $service = Get-Service -Name $svc -ErrorAction SilentlyContinue
    if ($service) {
        Write-Host "   $($service.DisplayName): $($service.Status)"
    } else {
        Write-Host "   $svc: 未安装"
    }
}
# 3. 检查音频设备状态
Write-Host "`n3. 音频设备状态 (MMDevice API):"
Add-Type -TypeDefinition @"
using System.Runtime.InteropServices;
public class AudioHelper {
    [DllImport("winmm.dll", SetLastError = true)]
    public static extern int waveOutGetNumDevs();
    [DllImport("winmm.dll", SetLastError = true)]
    public static extern int waveInGetNumDevs();
}
"@
try {
    $outputDevices = [AudioHelper]::waveOutGetNumDevs()
    $inputDevices = [AudioHelper]::waveInGetNumDevs()
    Write-Host "   输出设备数: $outputDevices"
    Write-Host "   输入设备数: $inputDevices"
} catch {
    Write-Host "   无法获取设备数量"
}
# 4. 使用 .NET 获取更详细信息
Write-Host "`n4. 音频渲染设备 (DirectSound):"
$ds = New-Object System.DirectoryServices.DirectorySearcher
try {
    $devices = [System.Media.SystemSounds].GetProperties()
    foreach ($device in $devices) {
        Write-Host "   $($device.Name)"
    }
} catch {
    Write-Host "   无法获取DirectSound设备"
}
# 5. 检查音频设备驱动程序
Write-Host "`n5. 音频驱动程序:"
$drivers = Get-WmiObject Win32_PnPSignedDriver | Where-Object {$_.DeviceName -match "audio|sound"}
if ($drivers) {
    foreach ($driver in $drivers) {
        Write-Host "   设备: $($driver.DeviceName)"
        Write-Host "   驱动版本: $($driver.DriverVersion)"
        Write-Host "   驱动日期: $($driver.DriverDate)"
        Write-Host "   ----------"
    }
} else {
    Write-Host "   未找到音频驱动信息"
}
Write-Host "`n====== 检测完成 ======" -ForegroundColor Cyan

VBScript 实现

' 声卡状态检测脚本 (VBScript)
Set WshShell = CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
WScript.Echo "====== 声卡状态检测 (VBScript) ======"
' 1. 获取声卡信息
WScript.Echo vbCrLf & "1. 声卡设备信息:"
Set soundDevices = objWMIService.ExecQuery("SELECT * FROM Win32_SoundDevice")
If soundDevices.Count > 0 Then
    For Each device In soundDevices
        WScript.Echo "   设备名: " & device.Name
        WScript.Echo "   状态: " & device.Status
        WScript.Echo "   MPN: " & device.Manufacturer
        WScript.Echo "   ----------"
    Next
Else
    WScript.Echo "   未找到音频设备"
End If
' 2. 检查音频服务
WScript.Echo vbCrLf & "2. 音频服务状态:"
services = Array("Audiosrv", "AudioEndpointBuilder")
For Each svc In services
    Set service = objWMIService.Get("Win32_Service.Name='" & svc & "'")
    If Not IsNull(service) Then
        WScript.Echo "   " & service.DisplayName & ": " & service.State
    Else
        WScript.Echo "   " & svc & ": 未安装"
    End If
Next
' 3. 检查音频设备状态
WScript.Echo vbCrLf & "3. 音频设备驱动程序:"
Set drivers = objWMIService.ExecQuery("SELECT * FROM Win32_PnPSignedDriver WHERE DeviceName LIKE '%audio%' OR DeviceName LIKE '%sound%'")
If drivers.Count > 0 Then
    For Each driver In drivers
        WScript.Echo "   设备: " & driver.DeviceName
        WScript.Echo "   驱动版本: " & driver.DriverVersion
        WScript.Echo "   ----------"
    Next
Else
    WScript.Echo "   未找到音频驱动信息"
End If
WScript.Echo vbCrLf & "====== 检测完成 ======"

macOS 环境

Shell 脚本

#!/bin/bash
echo "====== 声卡状态检测 (macOS) ======"
# 1. 检查音频硬件
echo "1. 音频硬件信息:"
system_profiler SPAudioDataType 2>/dev/null || echo "   无法获取音频信息"
# 2. 检查CoreAudio设备
echo "2. CoreAudio设备:"
if command -v system_profiler &> /dev/null; then
    system_profiler SPAudioDataType | grep -A 5 "Audio Device" || echo "   无音频设备"
fi
# 3. 检查音频进程
echo "3. 使用音频的进程:"
lsof -c coreaudiod 2>/dev/null | head -5 || echo "   coreaudiod 未运行"
# 4. 检查音频输入/输出设备
echo "4. 音频输入/输出设备:"
python3 -c "
import CoreAudio
import struct
# 获取默认输出设备
output_devices = CoreAudio.AudioObjectGetPropertyData(
    CoreAudio.kAudioObjectSystemObject,
    CoreAudio.kAudioHardwarePropertyDefaultOutputDevice,
    None,
    None
)
print(f'默认输出设备: {output_devices}')
" 2>/dev/null || echo "   无法获取默认音频设备"
echo "====== 检测完成 ======"

使用说明

Linux 使用:

# 保存脚本为 check_sound.sh
chmod +x check_sound.sh
./check_sound.sh

Windows 使用:

# PowerShell 脚本
.\check_sound.ps1
# VBScript 脚本(保存为 .vbs 文件)
check_sound.vbs

安装依赖(Linux):

# Ubuntu/Debian
sudo apt-get install alsa-utils pulseaudio-utils
# CentOS/RHEL
sudo yum install alsa-utils pulseaudio-utils
# Python依赖
pip install pyalsaaudio  # 可选,用于更详细的ALSA控制

这些脚本会检测声卡的硬件信息、驱动状态、设备节点、音频服务状态等,你可以根据实际需求选择适合的脚本来检查声卡状态。

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