Aparar vários arquivos mp3 de uma só vez

6

Então, eu tenho centenas de arquivos .mp3 em uma pasta. Quase cada um deles tem um período de silêncio antes que você possa ouvir um som. E os períodos são do tamanho diferente.

O mesmo acontece com o final dos arquivos.

Existe algum aplicativo (livre, se possível) pelo qual eu poderia cortar todos os arquivos de uma só vez, para que cada um deles tenha o mesmo tempo de silêncio (por exemplo, cinco segundos) antes e no final da música.

Ou talvez um mp3 player que possa ajustar o silêncio de cada música da maneira descrita.

Além disso, se eu precisar cortar todos os arquivos um por um, qual aplicativo é mais adequado (por exemplo, velocidade suficiente) para essa tarefa)?

    
por qadenza 28.08.2015 / 08:25

2 respostas

7

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.thdefineoníveldelimiteemdB.Tudoabaixoéconsideradocomosilêncio.min=2defineosilênciomínimoemsegundos.Apenassilênciopormaisde2segundosserátruncado
  • Vocêpodefingirqueumtestefoiexecutadoadicionandoumcomando-Pnofinaldocomandomp3splt.Elegeraerrosoudizquetudocorreubem.Seusado,comenteRemoveeRename,poisnenhumarquivonovofoicriadoparaprocessá-los
  • Paratestes,vocêtambémpodeusar-dFOLDERPATHparaescolherumaúnicapastadesaídae-o@fparausaronomedoarquivooriginalcomosaída(casocontrário,_trimmedserá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
    }
}
    
por 28.08.2015 / 11:22
-1

Se você precisar analisar o silêncio em cada faixa, será uma grande tarefa.

Se você for automatizar isso, o FFMPEG deve ser capaz de ajudar ... os resultados podem não ser garantidos, pois não tenho certeza se você pode direcionar o filtro FFMPEG silenceremove para o início ou fim de uma faixa - o que define o final de uma faixa? Pergunta retórica, mas é importante se você está tentando encontrar uma ferramenta para automatizar e dar os resultados desejados. Talvez você precise fazer isso um por um ... O Audacity (gratuito) pode ser usado para analisar visivelmente uma trilha de áudio para que você possa descobrir onde as necessidades devem ser cortadas

    
por 28.08.2015 / 10:56

Tags