快速找出 MP3 开头的静音时间?

快速找出 MP3 开头的静音时间?

有什么快速简便的方法可以找出 MP3 开头的静音时间?我知道这其中涉及很多内容...我不需要太精确。50 毫秒左右就很好了。

我有大约 1000 个 MP3 想要实现这一点,因此,最好有一个可以编写脚本的解决方案。谢谢!

请注意,我不想修剪静默,我需要知道静默的长度。

答案1

由于您没有指定您的操作系统,我假设是 Windows。

使用ffmpeg与 PowerShell ISE 结合使用

电源外壳

$folder = "C:\path\to\musicfolder"
$ffmpeg = "C:\path\to\ffmpeg.exe"

$content = "track start     track end   Filepath`n"
Get-ChildItem $folder -Recurse -Include *.mp3,*.ogg,*.flac  | foreach {        

    $log = & $ffmpeg -hide_banner -i `"$_`" -af "silencedetect=duration=2:noise=-50dB" -f null - 2>&1
    #echo [string]$log

    $totalLength = [string]$log | where {$_ -match '(?<= Duration:.*)[\d:\.]+' } | % {$matches[0]}        
    $totalLength = ([TimeSpan]::Parse($totalLength)).TotalSeconds

    [string[]]$silenceEnd = $log | where {$_ -match '(?<=silence_end: )[-\d\.]+' } | % {$matches[0]}            
    If ($silenceEnd.count -gt 0 -And [double]$silenceEnd[0] -lt $totalLength/2) {
        [string]$trackStart = $silenceEnd[0]
    } else {
        [string]$trackStart = 0
    }
                
    [string[]]$silenceStart = $log | where {$_ -match '(?<=silence_start: )[-\d\.]+' } | % {$matches[0]}                
    If ($silenceStart.count -gt 0 -And $silenceStart[$silenceStart.count-1] -gt $totalLength/2) {
        [string]$trackEnd = $silenceStart[$silenceStart.count-1]
    } else {        
        [string]$trackEnd = $totalLength
    }    
    $content += "$trackStart                $trackEnd       $_  `n"
}
Clear-Content "$folder\silenceLog.txt"
Add-Content "$folder\silenceLog.txt" $content

示例输出

在此处输入图片描述

  • 第一列是静音结束和音乐开始的时间戳(以秒和毫秒为单位)
  • 第二列是音乐结束和静音开始的时间戳(以秒和毫秒为单位)
  • 第三列是文件路径

相关内容