有什么快速简便的方法可以找出 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
示例输出
- 第一列是静音结束和音乐开始的时间戳(以秒和毫秒为单位)
- 第二列是音乐结束和静音开始的时间戳(以秒和毫秒为单位)
- 第三列是文件路径