Как я могу автоматически вырезать все тишины (0 дБ) из mp3 без перекодирования?

250
Vitaly Zdanevich

Пока я читаю, silenceremove перекодирует файл.

Обычно я делаю это вручную, создавая файл вроде:

file 'file.mp3' inpoint 0 outpoint 01:55:00.0  file 'file.mp3' inpoint 02:03:50.0 

и выполнить эту команду:

ffmpeg -f concat -safe 0 -i list.txt -c copy file.mp3 

Может быть, я могу использовать silencedetect для создания того же файла ...

0
Поскольку MP3 является сжатым форматом, молчание можно определить только путем распаковки, что требует повторного сжатия после удаления. Чтобы удалить паузу без дальнейшей деградации, вам необходимо отредактировать оригинальный файл перед кодированием MP3; если это недоступно, лучшее, что вы можете сделать, - это распаковать, убрать паузу и сохранить с помощью кодера без потерь, но тогда у вас будет гораздо худшее сжатие по сравнению с MP3. AFH 5 лет назад 1
Но с помощью ffmpeg мы уже можем вырезать части mp3 без перекодирования, указывая регионы вручную. Vitaly Zdanevich 5 лет назад 0
Я не ожидал этого, но после просмотра спецификации MP3 кажется, что каждый блок данных может быть независимо сжат. Вы должны иметь возможность создавать список редактирования из `silencedetect`, но, вероятно, стоит проверить, можете ли вы добавить` -c copy` в командную строку `silenceremove`. К сожалению, у меня нет этих опций в моей копии `ffmpeg` (3.4.4), поэтому я не могу проверить, работает ли он. AFH 5 лет назад 0
@AFH [из другого ответа] (https://stackoverflow.com/a/29411973/1879101): «Вы не можете использовать копию -acodec для сохранения исходного качества». Vitaly Zdanevich 5 лет назад 0
Я посмотрел на ответ и ссылки @ harrymc: я обнаружил, что у меня _do_ есть `silenceremove` в качестве фильтра, но когда я попытался скомбинировать его с` -c copy`, я получил `Filtergraph 'silenceremove = 0.5: -50dB было определено для аудиопотока 0: 0, но была выбрана копия кодека. / `Фильтрация и потоковая копирование не могут использоваться вместе. Поэтому я думаю, что это должен быть ваш ответ, хотя список редактирования может по-прежнему разрешать ответ без перекодирования. AFH 5 лет назад 0

1 ответ на вопрос

0
harrymc

Ответ на это в посте переполнения стека с использованием FFMPEG с silencedetect для удаления аудио тишины .

Первое замечание заключается в том, что молчание определяет только молчание, а не удаляет его. Вы должны использовать вместо фильтра SilenceEmove.

Чтобы определить, есть ли в вашей версии ffmpeg этот фильтр, выполните:

ffmpeg -hide_banner -filters | grep silenceremove 

Вывод должен выглядеть так:

silenceremove A->A Remove silence 

Команда для удаления тихих частей может выглядеть так:

ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3 

Где параметр silenceremove объясняется как удаление:

  • в начале (указано первым аргументом 1)
  • с минимальной нулевой длиной (указывается вторым аргументом 0)
  • тишина классифицируется как что-либо ниже -50 децибел (обозначено -50dB)

Справка: FFMPEG Silent Remove Filter .

Чтобы найти правильное значение для тишины, сначала нормализуйте громкость звука на входе 0dB, как описано в этом ответе .

Прокомментируйте вашу первую ссылку: `Обратите внимание, что -af silenceremove ** перекодирует ** ваши аудиофайлы`. Vitaly Zdanevich 5 лет назад 0
Это на самом деле потребовалось бы, так как схема кодирования, возможно, должна была бы перекодировать аудио непосредственно перед или после вырезанной части без звука. harrymc 5 лет назад 0
Но используя ffmpeg, мы можем вручную вырезать части mp3 без перекодирования. Vitaly Zdanevich 5 лет назад 0
Я не знаю, как этот фильтр был запрограммирован. harrymc 5 лет назад 0
@VitalyZdanevich Фильтрация требует перекодирования. Входные данные [декодируются, передаются в фильтр, затем кодируются] (https://ffmpeg.org/ffmpeg.html#Simple-filtergraphs) в ваш выходной формат. Таким образом, вы не можете [потоковое копирование] (https://ffmpeg.org/ffmpeg.html#Stream-copy) при фильтрации. «Вручную вырезать части mp3» с потоковой копией пропускает декодирование / кодирование и только повторное мультиплексирование. LordNeckbeard 5 лет назад 1

Похожие вопросы