Шаблон конверта в SoX (Sound eXchange) или ffmpeg

Я использовал SoX для создания белого шума. Я ищу способ модулировать громкость по всей дорожке таким образом, чтобы создать шаблон, подобный этому:

Эффект огибающей белого шума

Я экспериментировал с затуханием, но оно постепенно увеличивалось до 100% громкости и исчезало до 0% громкости, что в данном случае просто боль.

Эффект тремоло тоже не совсем то, что мне нужно, так как частота паттерна будет меняться со временем.

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

Я проверял этот пример Использование SoX для изменения уровня громкости диапазона времени в аудиофайле, но я не думаю, что это совсем то, что мне нужно.

Я использую командную строку в Ubuntu с SoX, но я открыт для предложений с ffmpeg или любым другим решением командной строки на основе Linux.


person pJay    schedule 25.05.2016    source источник


Ответы (1)


С ffmpeg вы можете использовать фильтр громкости

ffmpeg -i input.wav -af \
"volume='if(lt(mod(t\,5)/5\,0.5), 0.2+0.8*mod(2*t\,5)/5\, 1.0-0.8*mod(t-(5/2)\,5)/(5/2))':eval=frame" \
  output.wav

Выражение в приведенном выше фильтре увеличивает громкость с 0,2 до 1,0 в течение t=0 до t=2,5 секунд, а затем постепенно снижает до 0,2 при t=5 секунд. Период огибающей здесь равен 5 секундам.

person Gyan    schedule 26.05.2016
comment
Простой и элегантный ответ. Это сработало отлично. Однако мне интересно, если бы я хотел использовать кучу огибающих разной длины на протяжении всей звуковой дорожки, как бы я это сделал? Большое спасибо! :) - person pJay; 26.05.2016
comment
Затем вы должны последовательно соединить несколько фильтров громкости, каждый из которых имеет выражение, чтобы их приложения не перекрывались, т. Е. Если один фильтр создает огибающую между 30 и 50 с, то никакой другой фильтр не изменяет громкость в этом диапазоне (если вы этого не хотите). Вы гирлянду, как это: -af "volume=..., volume=..., volume=..." - person Gyan; 26.05.2016
comment
Блестящий. Это заставило меня двигаться в правильном направлении, хотя я не мог заставить гирляндную цепочку работать, как вы предложили, но мне удалось встроить операторы if-else в операторы if-else, т.е. "volume='if (x, y, if (x, y, if(x, y, z) ) ) - person pJay; 27.05.2016
comment
Что случилось с гирляндной цепью? - person Gyan; 27.05.2016
comment
В первом примере с использованием гирляндной цепочки выходной файл представляет собой просто молчание ffmpeg -i input.wav -af "volume='if (between(t, 0, 5), (t/5)+ (0.2-((0.2/5)*t)))', volume='if (between(t, 5, 10), (1-(t-5)/5) + ((0.2 / (10-5)) * (t-5)))':eval=frame" output.wav. Но во втором примере, встраивая операторы IF, я получаю гладкую оболочку: ffmpeg -i input.wav -af "volume='if (between(t, 0, 5), (t/5)+ (0.2-((0.2/5)*t)), if (between(t, 5, 10), (1-(t-5)/5) + ((0.2 / (10-5)) * (t-5)) ) )':eval=frame" output.wav - person pJay; 27.05.2016
comment
Я просто добавил это выше, я нажал ввод слишком рано! :) - person pJay; 27.05.2016
comment
В вашей 1-й команде первому фильтру нужен eval=frame. Кроме того, выражение первого фильтра можно упростить до 0.16t + 0.2 - person Gyan; 27.05.2016
comment
И 2-й фильтр на 1.5 - 0.1*t - person Gyan; 27.05.2016
comment
Я пробовал изменения, но тихая звуковая дорожка все еще возвращается. Я временно изменил громкость на 1, чтобы помочь найти неисправность. ffmpeg -i input.wav -af "volume='if (between(t, 0, 5), 1)':eval=frame, volume='if (between(t, 5, 10), 1)':eval=frame" output.wav - person pJay; 27.05.2016
comment
Хорошо, if ожидает три аргумента, поэтому первым будет volume='if (between(t, 0, 5), 0.16t + 0.2 ,1)',. Просто используйте 1 в качестве третьего аргумента, чтобы оставить громкость без изменений, если между возвращает false. - person Gyan; 27.05.2016
comment
Гениально!.. Отлично сработало. Еще раз спасибо за ваше время!! - person pJay; 27.05.2016
comment
Поскольку (t) проходит через звуковую дорожку, работая с моими операторами IF, придерживается ли он какой-то частоты кадров? (Поскольку ffmpeg также обрабатывает видео). Я спрашиваю, потому что, если я создаю, например, 35 огибающих в секунду, некоторые из них не формируются должным образом при частоте дискретизации 44100. Увеличивая масштаб сигнала, я вижу заметные шаги громкости, а не линейное увеличение/уменьшение громкости. Если моя частота дискретизации составляет 192000, это дает идеальные огибающие, но в итоге я получаю очень требовательные к памяти аудиофайлы. Есть ли способ заставить ffmpeg обрабатывать звук более подробно, не увеличивая частоту дискретизации? - person pJay; 14.06.2016
comment
Фильтры работают только с потоками, подаваемыми на него, поэтому аудиофильтр, работающий с одним аудиопотоком, не связан с каким-либо другим видео- или аудиопотоком в этом файле. Можете ли вы показать команду, которую вы сейчас используете? Один из вариантов — семплировать до 192k, обрабатывать, а затем снова сэмплировать до 44,1 кГц. - person Gyan; 15.06.2016