2016-06-28 3 views
1

Используя ffmpeg, насколько мы можем контролировать уровень звука? Например, я хотел бы отобразить форму «М» на временной шкале программы:Сложные изменения громкости звука с помощью ffmpeg

t0 - t1 : fade in from 0 to 1 
t1 - t2 : play at full volume 
t2 - t3 : fade out to 25% 
t3 - t4 : play at 25% volume 
t4 - t5 : fade in (from 25%) to full volume 
t5 - t6 : play at full volume 
t6 - t7 : fade out from 1 to 0 

Это можно сделать? Сочетания, которые я пробовал (из ряда вон и громкости, а также с использованием редактирования временной шкалы), пока не были успешными.

Вот то, что близко:

ina="infile.caf" 
out="outfile.mp3" 

time ffmpeg -i $ina -af \ 
"afade=enable='between(t,0,3)':t=in:ss=0:d=3, \ 
afade=enable='between(t,7,8)':t=out:st=7:d=1, \ 
volume=enable='between(t,8,12)':volume=.25:eval=frame, \ 
afade=enable='between(t,12,13)':t=in:st=12:d=1, \ 
afade=enable='between(t,15,18)':t=out:st=15:d=3" \ 
$out 

.. но в двух средних точках (точки, где она затухает до 25%, а в точке, где она затухает обратно в полном объеме) есть являются глюки - звуковые звуковые щелчки.

+0

Какую команды вы пробовали? – Mulvya

+0

@ Mulvya, я добавил пример того, что я пытался. Это близко, но еще не приемлемо. – coco

+0

Фильтры Fade идут или начинаются с нуля. Вы должны сделать это полностью, используя объемные фильтры. Я скоро отвечу. – Mulvya

ответ

3

Я собирался предложить сделать это полностью с помощью объемных фильтров, но это может быть сделано текущим путем с незначительными изменениями.

ffmpeg -i $ina -af \ 
"afade=enable='between(t,0,3)':t=in:ss=0:d=3, \ 
afade=enable='between(t,7,8)':t=out:st=7:d=1.333, \ 
volume=enable='between(t,8,12)':volume=.25:eval=frame, \ 
afade=enable='between(t,12,13)':t=in:st=11.6667:d=1.333, \ 
afade=enable='between(t,15,18)':t=out:st=15:d=3" \ 
$out 

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

+0

Да, это работает удивительно хорошо. Я полагаю, что даже с разными кривыми на «afade» можно было бы найти точку вставки, чтобы сделать ее гладкой. Но я должен признать, я с нетерпением ждал, как это можно сделать, используя только фильтр 'volume'! Если путь объема стал более сложным, мне было интересно, может ли быть больше контроля. – coco

+0

Хорошо, пример. Это то, что затухает до 25%, будет с объемом: 'volume = enable = 'между (t, 7,8)': volume = '1 - 0.75 * (t - 7)': eval = frame' – Mulvya

+0

Фантастический! Раньше у меня возникала проблема с подключением фильтров 'volume', но выяснилось. Я собираюсь выписать ваше решение выше, но используя 'volume'. Благодаря! – coco

3

В качестве альтернативы (большого) ответа по @Mulvya, вот метод, использующий volume фильтра, который производит один и тот же вывод:

infile="infile.caf" 
outfile="outfile.mp3" 

ffmpeg -i $ina -af \ 
"volume=enable='between(t,0,3)':volume='t/3.0':eval=frame, \ 
volume=enable='between(t,3,7)':volume='1':eval=frame, \ 
volume=enable='between(t,7,8)':volume='1 - 0.75 * (t - 7)':eval=frame, \ 
volume=enable='between(t,8,12)':volume='0.25':eval=frame, \ 
volume=enable='between(t,12,13)':volume='.25 + 0.75 * (t - 12)':eval=frame, \ 
volume=enable='between(t,13,15)':volume='1':eval=frame, \ 
volume=enable='between(t,15,18)':volume='1 - (t - 15)/3.0':eval=frame" \ 
$out 
Смежные вопросы