Я знаю четыре метода: mp3DirectCut, Mp3splt-GTK, Mp3splt или ffmpeg
mp3DirectCut (GUI-версия, лучший выбор для быстрых результатов)
Советы
- Выберите другую папку в качестве вывода, чтобы проверить некоторые файлы результатов. После проверки перезапустите его и выберите « Перезаписать оригиналы». Вы должны сделать это за пару секунд, так как программа не перекодирует ваши mp3 файлы
- Вы, вероятно, хотите включить Настройки »Сохранить дату при перезаписи исходных файлов
Mp3splt-gtk (версия с графическим интерфейсом, доступная для всех основных платформ ОС)
mp3splt (версия командной строки, доступная для всех основных платформ ОС)
Загрузите mp3splt, откройте свой PowerShell ISE, измените оба пути и запустите следующий код:
$files = Get-ChildItem "C:\my\musicfolder" -Recurse -Include *.mp3,*.ogg,*.flac
$exe = "C:\path\to\mp3splt.exe"
ForEach ($file in $files) {
If ($file.BaseName -notmatch "_trimmed$" ) {
$newFile = $file.DirectoryName + "\" + $file.BaseName + "_trimmed" + $file.Extension
If (Test-Path $newFile) {Remove-Item $newFile }
& $exe -r -p "th=-48,min=2" `"$file`" | Out-Null
Remove $file.Fullname
Rename $($file.DirectoryName + "\" + $file.BaseName + "_trimmed" + $file.Extension) $file.Fullname
}
}
Советы
-r -p th=-48, min=2
- это опция для удаления молчания в начале / конце вашего файла. th
определяет пороговый уровень в дБ. Все ниже считается тишиной. min=2
устанавливает минимальное молчание в секундах. Только тишина дольше 2 секунд будет обрезана
- Вы можете сделать вид, что запустили тест, добавив заглавную
-P
в конце команды mp3splt. Он выводит ошибки или говорит, что все прошло хорошо. Если используется, закомментируйте Remove
и Rename
поскольку для их обработки не создаются новые файлы.
Для тестирования вы также можете использовать -d FOLDERPATH
чтобы выбрать одну выходную папку, и -o@f
чтобы использовать исходное имя файла в качестве выходного (в противном случае будет добавлен _trimmed
)
Документация, объясняющая все доступные варианты
FFmpeg (версия командной строки, доступная для всех основных платформ ОС)
Аудиофильтр FFmpeg -af silenceremove
не должен использоваться, поскольку он всегда перекодирует ваши файлы, и вы не можете, ради бога, сохранить то же качество звука, что и ваш входной файл. -acodec copy
не может быть использована здесь. Вы можете выбрать только один фиксированный битрейт, даже если вы обрабатываете несколько файлов с разными качествами.
Однако есть и другая опция ffmpeg: -af silencedetect
. Теория уже объяснена в StackOverflow. Я принял это к Windows и PowerShell.
Загрузите ffmpeg, откройте ISE PowerShell, измените оба пути и выполните следующий код:
$files = Get-ChildItem "C:\path\to\musicfolder" -Recurse -Include *.mp3,*.ogg,*.flac
$ffmpeg = "C:\path\to\ffmpeg.exe"
ForEach ($file in $files) {
If ($file.BaseName -notmatch "_trimmed$" ) {
# Detect silence with ffmpeg and "silencedetect". Save the complete output to variable $log
$log = & $ffmpeg -hide_banner -i `"$file`" -af "silencedetect=duration=1:noise=-50dB" -f null - 2>&1
$totalLength = [string]$log | where {$_ -match '(?<= Duration:.*)[\d:\.]+' } | % {$matches[0]}
$totalLength = ([TimeSpan]::Parse($totalLength)).TotalSeconds
# Use regex to search all numbers after string "silence_end". Save them as string array in the format XXX.XXX
# Check if any 'silence_end' was found. If yes, save the first silence ending time as mp3 start time
[string[]]$silenceEnd = $log | where {$_ -match '(?<=silence_end: )[-\d\.]+' } | % {$matches[0]}
If ($silenceEnd.count -gt 0 -And [double]$silenceEnd[0] -lt $totalLength/2) {
[double]$trackStart = $silenceEnd[0]
} else {
[double]$trackStart = 0
}
# Do the same again but for silence starting times. Save the last one as mp3 end time
[string[]]$silenceStart = $log | where {$_ -match '(?<=silence_start: )[-\d\.]+' } | % {$matches[0]}
If ($silenceStart.count -gt 0 -And $silenceStart[$silenceStart.count-1] -gt $totalLength/2) {
[double]$trackEnd = $silenceStart[$silenceStart.count-1]
} else {
[double]$trackEnd = $totalLength
}
# calculate duration since ffmpeg's -t option wants a duration and not a timestamp
$duration = $trackEnd - $trackStart
# Put together the new file name. If file already exists from previous run, delete it
$newFile = $file.DirectoryName + "\" + $file.BaseName + "_trimmed" + $file.Extension
If (Test-Path $newFile) {Remove-Item $newFile }
# Run ffmpeg with our calculated start and duration times to remove silence at start and end
write-host "$ffmpeg -i `"$file`" -ss $trackStart -t $duration -acodec copy `"$newFile`" 2>&1"
& $ffmpeg -i `"$file`" -ss $trackStart -t $duration -acodec copy `"$newFile`" 2>&1
# Delete the original mp3 file and rename the new mp3 file to the original name
Remove-Item $file.Fullname
Rename-Item $newFile $file.Fullname
}
}