使用ffmpeg遍历获取音频文件相关信息

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

复制代码
$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)。

常见的规格及听感影响:

  1. 44.1 kHz(CD音质标准):最高能还原 22.05 kHz 的声音。人耳的听觉极限大约在 20 kHz,所以 44.1 kHz 已经能覆盖绝大多数人耳能听到的频率。

  2. 48 kHz(影视/视频标准):最高能还原 24 kHz。这通常是为了对齐视频帧率而设定的行业标准。

  3. 88.2 kHz / 96 kHz(Hi-Res 入门):最高能还原 44.1 kHz 或 48 kHz 的声音。这已经远远超出了人耳的听觉范围。但它能减少"抗混叠滤波器"带来的相位失真,让声音听起来更"顺滑"、没有那么生硬。

  4. 176.4 kHz / 192 kHz(Hi-Res 旗舰):最高能还原 88.2 kHz 或 96 kHz 的声音。

    • 对音质的影响 :高采样率带来的最大好处不是你能听到更高的音(你听不到),而是高频的"空气感"更好、声场更开阔。在录音室里,高采样率能更好地捕捉乐器的泛音(如小提琴的松香味、吉他的擦弦声)。
  5. DSD(特例:2.8MHz / 5.6MHz):这是索尼和飞利浦开发的技术,采用 1-bit 采样,频率极高。它的声音特性通常被形容为"极其平滑、有模拟味"。


🎚️ 二、 位深度 (Bit Depth)

位深度决定了声音的"动态范围" (最微弱的声音与最响亮的声音之间的差值),以及信噪比。

常见的规格及听感影响:

  1. 16 bit(CD音质标准) :理论动态范围为 96 dB。这意味着在最安静的时候,你能听到微弱的呼吸声,但背景可能会有极细微的底噪。

  2. 24 bit(Hi-Res 录音室标准) :理论动态范围高达 144 dB。

    • 对音质的影响 :这是目前高品质数字音乐的黄金标准。它带来了极黑的背景(极低的底噪) 和极丰富的微动态(Micro-dynamics)。你能听清歌手吞咽口水的声音、乐器敲击后微弱的余音,而且在大动态交响乐爆棚时,声音依然稳如泰山,不会显得毛躁。
  3. 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 压缩包)。当一段音乐数据很简单(比如长时间静音或单一频率)时,它压缩得很厉害,码率就低;遇到复杂的声音,压缩率降低,码率就高。只要它解码后是完美的,这种浮动完全正常。

相关推荐
Android系统攻城狮4 小时前
Linux FFmpeg深度解析之avcodec_parameters_from_context调用流程与实战(十六)
linux·运维·ffmpeg·音视频进阶·ffmpeg音视频·车载音视频进阶
Android系统攻城狮5 小时前
Linux FFmpeg深度解析之avcodec_alloc_context3调用流程与实战(十四)
linux·运维·ffmpeg·车载音视频·音视频进阶·ffmpeg音视频进阶
菜鸟小芯6 小时前
【Quectel Pi M2 实战】Day3 USB 摄像头图像采集:拍照、录像与踩坑记录(V4L2 + FFmpeg)
ffmpeg·嵌入式
Android系统攻城狮1 天前
Linux FFmpeg深度解析之av_dump_format调用流程与实战(十一)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶
Android系统攻城狮1 天前
Linux FFmpeg深度解析之avcodec_find_decoder调用流程与实战(十二)
linux·运维·服务器·ffmpeg·1024程序员节·音视频进阶
Hommy881 天前
【直播切片工作台】第23章:媒体探测与转码:ffprobe 与 ffmpeg 封装
人工智能·ffmpeg·直播切片
码匠许师傅1 天前
【C++三方组件】FFmpeg:音视频处理的瑞士军刀
c++·ffmpeg·音视频
全栈探索者2 天前
从素材到成片:ffmpeg 拼接、转码与字幕,一条流水线交付
macos·ffmpeg·aigc·comfyui·视频剪辑
扶尔魔ocy2 天前
【QT+FFmpeg】知识点编目及传送门
qt·ffmpeg