使用下面脚本,遍历所有文件夹,并分析音频文件信息,输出结果:

$TargetFolder = "D:\Downloads"
# 生成时间戳
$timestamp = Get-Date -Format "yyMMdd_mmss"
# 将时间戳拼接到文件名中
$OutputCsv = ".\Audio_Report_$timestamp.csv"
$ffprobeExe = "D:\GreenSoft\ffmpeg\bin\ffprobe.exe"
$Extensions = @("*.wav", "*.flac", "*.mp3", "*.m4a", "*.aac", "*.dsf", "*.dff", "*.ape", "*.ogg")
$Results = @()
Write-Host "Scanning folder: $TargetFolder ..." -ForegroundColor Cyan
foreach ($ext in $Extensions) {
$Files = Get-ChildItem -Path $TargetFolder -Filter $ext -File -Recurse -ErrorAction SilentlyContinue
foreach ($file in $Files) {
$argList = @("-v", "error", "-select_streams", "a:0", "-show_entries", "format=duration,bit_rate:stream=codec_name,sample_rate,channels,bits_per_sample,bits_per_raw_sample", "-of", "json", $file.FullName)
try {
$jsonString = & $ffprobeExe $argList
if (-not $jsonString) { throw "Empty result" }
$jsonOutput = $jsonString | ConvertFrom-Json
$stream = $jsonOutput.streams[0]
$format = $jsonOutput.format
$bitDepth = if ($stream.bits_per_raw_sample) { $stream.bits_per_raw_sample }
elseif ($stream.bits_per_sample) { $stream.bits_per_sample }
else { "N/A" }
# 修复了这里的问题:强制转换为 [int]
$durationSec = if ($format.duration) { [math]::Round([double]$format.duration) } else { 0 }
$mins = [int]([math]::Floor($durationSec / 60))
$secs = [int]($durationSec % 60)
$durationStr = "{0:D2}:{1:D2}" -f $mins, $secs
$fileSizeMB = [math]::Round($file.Length / 1MB, 0)
$Results += [PSCustomObject]@{
"FileName" = $file.Name
"Format" = if ($stream.codec_name) { $stream.codec_name.ToUpper() } else { "N/A" }
"SampleRate" = if ($stream.sample_rate) { [math]::Round([double]$stream.sample_rate / 1000, 1) } else { "N/A" }
"BitDepth" = $bitDepth
"Channels" = $stream.channels
"Duration" = $durationStr
"BitRate_kbps" = if ($format.bit_rate) { [math]::Round([double]$format.bit_rate / 1000) } else { "N/A" }
"size" = $fileSizeMB
"Folder" = $file.DirectoryName
}
Write-Host "Analyzed: $($file.Name)" -ForegroundColor Green
} catch {
Write-Host "Failed: $($file.Name) | Reason: $_" -ForegroundColor Red
}
}
}
if ($Results.Count -gt 0) {
$Results | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8
Write-Host "Completed! Total files processed: $($Results.Count)" -ForegroundColor Green
} else {
Write-Host "No audio files found or scan failed." -ForegroundColor Red
}
显示单个文件信息:
D:\GreenSoft\ffmpeg\bin\ffprobe.exe -v error -select_streams a:0 -show_entries stream=codec_name,sample_rate,channels,bits_per_raw_sample -show_entries format=duration,bit_rate -of default=noprint_wrappers=1 "D:\downloads\Eagles_-01-_Hotel_California.flac"
输出:
codec_name=flac
sample_rate=192000
channels=2
bits_per_raw_sample=24
duration=390.923333 时长
bit_rate=5285616
📈 一、 采样率 (Sample Rate)
采样率是指每秒钟对声音波形进行采样的次数 ,单位是赫兹(Hz)或千赫兹(kHz)。根据"奈奎斯特采样定理",采样率决定了你能听到的最高频率(最高频率 = 采样率 ÷ 2)。
常见的规格及听感影响:
-
44.1 kHz(CD音质标准):最高能还原 22.05 kHz 的声音。人耳的听觉极限大约在 20 kHz,所以 44.1 kHz 已经能覆盖绝大多数人耳能听到的频率。
-
48 kHz(影视/视频标准):最高能还原 24 kHz。这通常是为了对齐视频帧率而设定的行业标准。
-
88.2 kHz / 96 kHz(Hi-Res 入门):最高能还原 44.1 kHz 或 48 kHz 的声音。这已经远远超出了人耳的听觉范围。但它能减少"抗混叠滤波器"带来的相位失真,让声音听起来更"顺滑"、没有那么生硬。
-
176.4 kHz / 192 kHz(Hi-Res 旗舰):最高能还原 88.2 kHz 或 96 kHz 的声音。
- 对音质的影响 :高采样率带来的最大好处不是你能听到更高的音(你听不到),而是高频的"空气感"更好、声场更开阔。在录音室里,高采样率能更好地捕捉乐器的泛音(如小提琴的松香味、吉他的擦弦声)。
-
DSD(特例:2.8MHz / 5.6MHz):这是索尼和飞利浦开发的技术,采用 1-bit 采样,频率极高。它的声音特性通常被形容为"极其平滑、有模拟味"。
🎚️ 二、 位深度 (Bit Depth)
位深度决定了声音的"动态范围" (最微弱的声音与最响亮的声音之间的差值),以及信噪比。
常见的规格及听感影响:
-
16 bit(CD音质标准) :理论动态范围为 96 dB。这意味着在最安静的时候,你能听到微弱的呼吸声,但背景可能会有极细微的底噪。
-
24 bit(Hi-Res 录音室标准) :理论动态范围高达 144 dB。
- 对音质的影响 :这是目前高品质数字音乐的黄金标准。它带来了极黑的背景(极低的底噪) 和极丰富的微动态(Micro-dynamics)。你能听清歌手吞咽口水的声音、乐器敲击后微弱的余音,而且在大动态交响乐爆棚时,声音依然稳如泰山,不会显得毛躁。
-
32、64 bit(浮点,主要用于后期制作):通常用于录音室混音,保证声音不管拉大拉小都不会"爆音",极少直接作为成品发给听众。
如果说"采样率"决定了一秒钟记录多少次声音,"位深度"决定了每次记录有多精细,那么比特率(BitRate)就是它们俩结合在一起后的"总数据流量"。
你可以把它比作水管的粗细 :一秒钟流过的数据量越大(比特率越高),声音的细节保留得就越完整。单位是 kbps(千比特每秒)。
🧮 怎么算出来的?
对于未压缩的音频(比如常见的 WAV 格式),有一个直接的计算公式:
比特率 = 采样率 × 位深度 × 声道数
举个例子:一首标准的 CD 音质歌曲(44.1kHz / 16bit / 2声道立体声)
44100 × 16 × 2 = 1,411,200 bps ≈ 1411 kbps
🎯 比特率(BitRate)的三大核心作用:
1. 判断有损压缩 vs 无损压缩(最直观)
-
无损(FLAC、WAV、APE、DSD) :数据量极大。通常 CD 级别在 1000~1500 kbps 左右;Hi-Res(24bit/96kHz)会飙升到 4000~5000 kbps 以上。
-
有损(MP3、AAC) :去除了人耳不易察觉的声音,数据量大幅缩减。最高也就是 320 kbps ,常见的还有 128 kbps。
👉 在报表里,如果一首歌的比特率只有 320 或 128,那它绝对是 MP3 级别的有损音质。
2. 鉴别"假无损" / "假高解析" (避坑神技)
现在网上下载的很多所谓 Hi-Res 歌曲,其实是把普通的 MP3 强行转换成 24bit/192kHz 的 WAV 或 FLAC 文件(俗称"升频")。
-
文件名写着:
24bit / 96kHz -
但在报表里看比特率 :如果一首 24bit/96kHz 的立体声无损歌曲,比特率只有可怜的 300~800 kbps ,那绝对是假的高解析 。因为真正的 24bit/96kHz 无损,比特率起步就是 4600 kbps。
3. 理解 FLAC 等无损压缩格式的"浮动码率"
你会发现,有些 FLAC 文件的比特率是变动的。比如安静的独奏曲,码率可能只有 600 kbps ;而高潮爆棚的交响乐,码率可能飙到 1100 kbps 。
这是因为 FLAC 是无损压缩 格式(类似 ZIP 压缩包)。当一段音乐数据很简单(比如长时间静音或单一频率)时,它压缩得很厉害,码率就低;遇到复杂的声音,压缩率降低,码率就高。只要它解码后是完美的,这种浮动完全正常。