Eu conheço quatro métodos: mp3DirectCut , Mp3splt-GTK , Mp3splt ou ffmpeg
mp3DirectCut (versão GUI, melhor escolha para resultados rápidos)
- Depois de iniciar, vá para Arquivo »Processamento em lote
-
Adicione sua pasta de mp3, selecione Recorte automático e pressione Iniciar
Dicas
- Escolhaumapastadiferentecomosaídaparatestaralgunsarquivosderesultados.Depoisdeverificar,executenovamenteeescolhaSobrescreveroriginais.Vocêdeveterminaremalgunssegundos,poisoprogramanãorecodificaseusarquivosdemp3
- VocêprovavelmentedesejaativarConfigurações»Manterdataaosobrescreverarquivosdeorigem
Mp3splt-gtk (versão GUI, disponível para todas as principais plataformas de sistema operacional)
- Baixe $ start o programa, clique em Batch & divisão automática
-
Selecione Recorte usando a detecção de silêncio e pressione Batch split
mp3splt (versão Command Line, disponível para todas as principais plataformas de sistema operacional)
Faça o download do mp3splt , abra seu PowerShell ISE , altere os dois caminhos e execute o seguinte código:
$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
}
}
Dicas
-r-pth=-48,min=2
éaopçãopararemoverosilêncionoinício/finaldoseuarquivo.th
defineoníveldelimiteemdB.Tudoabaixoéconsideradocomosilêncio.min=2
defineosilênciomínimoemsegundos.Apenassilênciopormaisde2segundosserátruncado- Vocêpodefingirqueumtestefoiexecutadoadicionandoumcomando
-P
nofinaldocomandomp3splt.Elegeraerrosoudizquetudocorreubem.Seusado,comenteRemove
eRename
,poisnenhumarquivonovofoicriadoparaprocessá-los Paratestes,vocêtambémpodeusar
-dFOLDERPATH
paraescolherumaúnicapastadesaídae-o@f
parausaronomedoarquivooriginalcomosaída(casocontrário,_trimmed
seráanexado)Documentação explicando todas as opções disponíveis
FFmpeg (versão da linha de comando, disponível para todas as principais plataformas de sistema operacional)
O filtro de áudio do FFmpeg -af silenceremove
não deve ser usado, pois ele sempre recodifica seus arquivos e você não pode pelo amor de deus mantenha a mesma qualidade de áudio do seu arquivo de entrada . -acodec copy
não pode ser usado aqui. Você só pode escolher uma taxa de bits fixa, mesmo se você processar vários arquivos com qualidades diferentes.
No entanto, há outra opção de ffmpeg: -af silencedetect
. A teoria já está explicada no StackOverflow. Eu a adotei no Windows e no PowerShell.
Faça o download do ffmpeg , abra o seu PowerShell ISE , altere os dois caminhos e execute o seguinte código:
$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
}
}