2016-11-12 12 views
0

Я знаю, как изменить темп с помощью atempo, но аудиофайл немного искажается, и я не могу найти надежный способ изменить высоту тона. (скажем, увеличить темп и шаг вместе 140%)Как сменить шаг и темп вместе, надежно с ffmpeg

Sox имеет опцию скорости, но обрезает громкость И не так широко доступен, как ffmpeg. У mplayer есть опция скорости, которая отлично работает, но я не могу выводить без дополнительных библиотек.

Я, кажется, понимаю, что у ffmpeg нет способа изменить высоту тона (возможно, это последнее?), Но есть ли способ изменить частоту или некоторые другие флаги, чтобы эмулировать изменение высоты тона? Посмотрел довольно далеко и не может найти достойного решения.

Редактировать: asetrate: 48k * 1.4 (предположительно изначально 48k), похоже, не работает, все еще искажение и подача сильно не меняются.

Edit2: https://superuser.com/a/1076762 этот ответ рода работ, но качество намного ниже, чем sox speed 1.4 вариант

ответ

2

ffmpeg -i <input file name> -filter:a "asetrate=<new frequency>" -y <output file name>, кажется, работает для меня. Я проверил свойства как входных, так и выходных файлов с помощью ffprobe, и, похоже, нет никаких различий, которые могли бы повлиять на его качество. Хотя это правда, что я запустил его несколько раз, и в результате файл на некоторых из них имел некоторые артефакты, даже если строка кода была одинаковой, поэтому это может быть вызвано некоторой ошибкой ffmpeg; попробуйте запустить его снова, если вы не удовлетворены качеством.

+0

Вы правы, что похоже на работу. Может быть, это потому, что до того, как я коснулся «atempo» с помощью 'asetrate', но он, похоже, работает. Качество кажется чуть хуже, чем sox или mplayer, но это достаточно близко, я полагаю. Спасибо за помощь. Знаете ли вы, есть ли способ установить мультипликативную <новую частоту> оригинала без предварительной проверки? Как вместо 48k * 1.4 я могу просто поставить 1.4, и это увеличит частоту asetrate на 1.4? – jake

+1

Хмм, я не знаю, есть ли прямой способ сделать это, единственное, что я могу придумать, это получить значение исходной частоты с помощью ffprobe -just value и удалить всю дополнительную информацию, чтобы вы могли ее передать как переменная к исходной строке кода. Вы можете сделать это следующим образом: 'ffmpeg -i <имя входного файла> -filter: a" asetrate = $ (ffprobe -v error -show_entries stream = sample_rate -of default = noprint_wrappers = 1: nokey = 1 <имя входного файла>) * 1.4 "-y <имя выходного файла>' – Sizigia