LINUX.ORG.RU

Обрезать аудиозапись по тишине

 ,


0

2

Имеется 52 файла в форматах Opus-Webm и AAC-MP4. (Звуковые дорожки от The Jungle Show, если интересно.) В каждом файле вначале идёт 7-8 секунд заставка, затем собственно песня, затем ещё секунд 40-42 заставка. Требуется обрезать заставки с минимальной потерей качества. Проблема в том, что время начала и конца песни относительно краёв файла в разных файлах могут отличаться на 1-2 секунды. Но они отделены от заставок, минимум, 1 секундой тишины. Поэтому требуется разрезать файл по тишине, положение которой известно приблизительно, и сохранить звук с минимальным перекодированием. Как это автоматизировать?

Изучать pydub пока не хочется.

Можно проанализировать каждый файл ffmpeg-ом:

ffmpeg -i $InFileName -af silencedetect=n=-50dB:d=0.5 -f null -

и результат подставить в

ffmpeg -ss $StartTime -i $InFileName -acodec copy -t $LengthTime $OutFileName

Но остаётся задача парсить вывод ffmpeg-овского silencedetect. Готовые решения есть?

И сразу вопрос по ffmpeg:

ffmpeg -ss 8.2 -i file1.m4a -acodec copy -t 261 out1.m4a
ffmpeg -ss 8.2 -i file2.webm -acodec copy -t 261 out2.webm

1-я команда копирует кусок длиной 261 секунд начиная с 8.2 секунд от начала файла. 2-я команда копирует кусок длиной 261 секунд начиная с начала файла. Почему так происходит? Слишком далеко от ключевого фрейма? Как сделать, чтобы работало и для opus/webm, но перекодировало только крайние фреймы, прилегающие к точке обрезки?

★★★★★

Последнее исправление: question4 (всего исправлений: 3)

Вообще хотел посоветовать тебе sox, по которому есть даже мануалы о разрезании аудио по тишине, но там, насколько я помню, AAC и тем более Opus не поддерживается — так что выйдет перекодировка и потеря качества (по крайней мере, из wav'а обратно в нужный формат так уж точно).
Пусть уж будет для затравки.

dogbert ★★★★★
()
Ответ на: комментарий от dogbert

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

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

тупо кормим ффмпег этими рав данными и получаем на выходе нужное.

При этом ffmpeg применяет к ним сжатие с потерей качества, а качество и так невысокое. Или есть способы избавиться от дальнейших потерь, используя кодек с потерями?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Или есть способы избавиться от дальнейших потерь, используя кодек с потерями?

Я так понял, идея deep-purple в том, чтобы твои файлы перегнать в технические wav, проанализировать их sox'ом и записать временные метки в условный текстовик (ну или сделать конвейер в командной строке).
А потом найденные sox'ом метки скормить тому же ffmpeg вместе с исходными файлами в формате m4a и опцией -acodec copy (как в твоём исходном посте). Соответственно, в итоговых файлах никакой перекодировки уже не будет.
Весьма разумно, кстати.
Так что я не очень понял, какие потери ты хочешь оптимизировать. Или ты имеешь в виду потери при кодировании в wav?)

dogbert ★★★★★
()
Последнее исправление: dogbert (всего исправлений: 1)
Ответ на: комментарий от dogbert

таки нет, я предлагал переконаерчивать, но твоя поправка конечно лучше.

deep-purple ★★★★★
()
Ответ на: комментарий от dogbert

Так что я не очень понял, какие потери ты хочешь оптимизировать.

Я ответил ему именно о потерях при перекодировании обратно из WAV, как он предлагал. Что это будет плохо.

question4 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.