FFMPEG искажается при передискретизации звука

Я делаю mp3 из файла flac с помощью ffmpeg. Обычно для меня это ерунда.

Сегодня вечером по какой-то причине преобразованный звук искажается, когда я использую те же команды, которые я всегда использовал. После устранения неполадок выяснилось, что проблема связана с флагом «-out_sample_rate».

Моя команда:

ffmpeg -i input.flac -write_id3v1 1 -id3v2_version 3 -dither_method modified_e_weighted -out_sample_rate 44.1k -b:a 320k output.mp3

Затем звук в mp3 невероятно искажается из-за усиления, что приводит к цифровому клиппированию.

Я попытался обновить ffmpeg, но проблема осталась. Я пробовал конвертировать различные частоты дискретизации (исходные файлы 44,1k, исходные файлы 48k, исходные файлы 96k) как в 44,1k, так и в 48k mp3, проблема остается всякий раз, когда происходит преобразование.

У меня macOS, и я установил ffmpeg через доморощенный.

Любые идеи?


person jsamsf    schedule 14.08.2017    source источник
comment
изменение -out_sample_rate 44.1k на -ar 44100 дает тот же результат.   -  person jsamsf    schedule 14.08.2017
comment
Поделитесь полным логом. Вы тестировали файл, который ранее успешно конвертировался с помощью этой команды?   -  person Gyan    schedule 14.08.2017
comment
Ваши старые файлы все еще работают? Если да, то я бы отправил образец в ffmpeg trac, так как он не работает...   -  person rogerdpack    schedule 18.08.2017


Ответы (1)


Вы уверены, что искажение исходит от передискретизации?

Даже самый плохой алгоритм передискретизации не искажает. Более типичными артефактами от плохой передискретизации являются резкие высокие частоты из-за алиасинга и шума квантования.

Ресемплер FFmpeg не самый лучший, но совсем не плохой. Это вообще не должно приводить к искажению. Достаточно для среднего использования.

Сколько места в исходном файле?

Если этого недостаточно, передискретизация или преобразование MP3 могут привести к клиппингу. Кодер MP3 удаляет частоты из сигнала (даже при 320 кбит/с), поэтому форма сигнала изменится.

Так что повторно импортируйте закодированный MP3 в аудиоредактор и поищите вырезки.

Если вы не уверены, с какого шага исходит искажение, разделите команду и посмотрите, какой шаг приводит к отсечению:

ffmpeg -i input.flac -write_id3v1 1 -id3v2_version 3 -dither_method modified_e_weighted -out_sample_rate 44.1k intermediate.flac

ffmpeg -i intermediate.flac -b:a 320k output.mp3

Перед преобразованием в MP3 должен оставаться запас не менее 1 дБ. Если нет, уменьшите усиление до этого.

Если передискретизация промежуточного .flac приводит к значительному выигрышу по амплитуде, исходный input.flac плохо освоен. Если это так (и качество действительно важно), выполните преобразование SR в аудиоредакторе (например, Audacity, он лучше справляется с передискретизацией, чем FFMpeg) и примените ограничитель между шагами передискретизации и дизеринга, чтобы красиво понизить несколько сильных пиков.

Если это не поможет: Что именно содержит файл input.flac? Музыка? Шум? Речь? а он самодельный или взят из чего то другого?

person Frank Saibert    schedule 19.08.2017
comment
Чтобы подтвердить, цифровое отсечение происходит из-за увеличенной амплитуды. Я прошел устранение неполадок с разделением команды, прежде чем опубликовать вопрос, и именно так я смог передать его в ресемплер. В то время казалось, что проблемы вызывал флаг -out_sample_rate. Делая это снова, оказывается, что это метод dither_method, только с треугольной и прямоугольной работой (то есть без увеличения усиления). Конечно, это снова ресемплер. Список методов дизеринга: ffmpeg.org/ffmpeg-resampler.html - person jsamsf; 21.08.2017