6

Итак, у меня есть сотни файлов .mp3 в папке. Почти у каждого из них есть период молчания, прежде чем вы услышите звук. И периоды имеют разный размер.

То же самое с концом файлов.

Есть ли какое-либо приложение (бесплатное, если возможно), с помощью которого я мог бы обрезать все файлы одновременно, чтобы у каждого из них было равное время молчания (например, пять секунд) до и в конце песни.

Или, может быть, mp3-плеер, который может регулировать тишину каждой песни описанным способом.

Кроме того, если я должен вырезать все файлы один за другим, какое приложение наиболее подходит (то есть достаточно скорости) для этой задачи)?

2 ответа2

7

Я знаю четыре метода: mp3DirectCut, Mp3splt-GTK, Mp3splt или ffmpeg


mp3DirectCut (GUI-версия, лучший выбор для быстрых результатов)

  • После запуска перейдите в Файл »Пакетная обработка
  • Добавьте папку mp3, выберите « Автоподрез» и нажмите «Пуск».

Советы

  • Выберите другую папку в качестве вывода, чтобы проверить некоторые файлы результатов. После проверки перезапустите его и выберите « Перезаписать оригиналы». Вы должны сделать это за пару секунд, так как программа не перекодирует ваши mp3 файлы
  • Вы, вероятно, хотите включить Настройки »Сохранить дату при перезаписи исходных файлов

Mp3splt-gtk (версия с графическим интерфейсом, доступная для всех основных платформ ОС)

  • Загрузите $, запустите программу, нажмите « Пакетная обработка»
  • Выберите Trim, используя обнаружение тишины, и нажмите Batch split


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
    }
}
-1

Если вам нужно проанализировать тишину в каждом треке, то это будет большая задача.

Если вы собираетесь автоматизировать это, то FFMPEG должен быть в состоянии помочь ... результаты могут быть не гарантированы, так как я не уверен, можете ли вы нацелить фильтр FFMPEG silenceremove на начало или конец дорожки - что определяет конец отслеживать? Риторический вопрос, но это важно, если вы пытаетесь найти инструмент для автоматизации и дать вам желаемые результаты. Возможно, вам придется сделать это один за другим ... Audacity (бесплатно) можно использовать для визуального анализа звуковой дорожки, чтобы вы могли работать там, где требуется обрезка

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .