Вопрос или проблема
Когда я читаю 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
для создания того же файла?
На это отвечают в посте Stack Overflow
используя FFMPEG с silencedetect для удаления звуковой тишины.
Первое замечание состоит в том, что silencedetect только обнаруживает тишину, а не удаляет ее. Вам следует вместо этого использовать фильтр silenceremove.
Чтобы проверить, поддерживает ли ваша версия ffmpeg этот фильтр, выполните:
ffmpeg -hide_banner -filters | grep silenceremove
Вывод должен выглядеть так:
silenceremove A->A Удалить тишину
Команда для удаления тихих частей может выглядеть так:
ffmpeg -i input.mp3 -af silenceremove=1:0:-50dB output.mp3
Где параметр silenceremove объясняется как удаляющий:
- в начале (указано первым аргументом
1
) - с минимальной длиной ноль (указано вторым аргументом
0
) - тишина классифицируется как все, что ниже -50 децибел (указано
-50dB
)
Ссылка: Фильтр удаления тишины FFMPEG.
Чтобы найти правильное значение для тишины, сначала нормализуйте громкость входного аудио до
0dB
, как описано в этом ответе.
Ответ или решение
Как автоматически удалить всю тишину (0 дБ) из MP3 без повторного кодирования
Удаление молчания из аудиофайлов является довольно распространенной задачей в мире обработки звука. Использование утилиты FFmpeg делает этот процесс достаточно простым и эффективным, однако если вы стремитесь избежать повторного кодирования, вам предстоит использовать другой подход. В данном ответе мы рассмотрим, как можно автоматизировать этот процесс.
1. Понимание задачи
Как упоминалось в вашем вопросе, использование фильтра silenceremove
в FFmpeg приводит к повторному кодированию файла. Если вы хотите сохранить качество оригинального MP3, необходимо избежать этого этапа. Вам следует использовать команду concat
, которая позволяет собрать аудиотреки без повторного кодирования.
2. Определение тишины с помощью silencedetect
Вы правы, что silencedetect
может быть полезен для обнаружения молчания, даже если он не удаляет его. Вы можете использовать эту команду, чтобы получить временные метки сегментов молчания.
Пример команды:
ffmpeg -i yourfile.mp3 -af silencedetect=n=-50dB:d=1 -f null -
Эта команда проверит ваш файл на наличие тишины в диапазоне ниже -50 дБ и с длиной молчания более 1 секунды. В результате вы получите вывод, который будет содержать временные метки молчания.
3. Автоматическое создание списка для concat
После того как вы получили временные метки молчания, вам нужно будет автоматически создать список с точками входа и выхода для использования в concat
. Чтение выходных данных команды silencedetect
можно осуществить через скрипт на Python или даже с помощью Bash, чтобы извлекать временные метки и формировать файл list.txt
.
Пример скрипта на Bash:
#!/bin/bash
output_file="list.txt"
echo "" > $output_file
# Запуск silencedetect и получение временных меток
ffmpeg -i yourfile.mp3 -af silencedetect=n=-50dB:d=1 -f null - 2> >(grep -o 'silence_start: [0-9.]*' | while read -r line; do
start=$(echo $line | cut -d ' ' -f 2)
echo "file 'yourfile.mp3'" >> $output_file
echo "inpoint $start" >> $output_file
done)
# Вы можете дополнительно обработать конец файла для добавления последнего сегмента
4. Использование команды concat
После того как вы сформируете файл list.txt
, вы можете выполнить команду ffmpeg
для объединения всех сегментов, сохраняя оригинальный формат audio:
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp3
Эта команда объединит все сегменты, указанные в вашем списке, в один файл output.mp3
, не изменяя кодек и качество.
Заключение
Удаление тишины из MP3 без повторного кодирования осуществимо при правильной последовательности действий. Используя комбинацию silencedetect
для нахождения молчания и concat
для сборки файлов, вы сможете создать окончательный аудиофайл с минимальными затратами ресурсов и без потери качества.
Если у вас остались вопросы или требуется дополнительная информация, не стесняйтесь обращаться!