FFMPEG,如何创建自定义波形

时间:2017-06-03 03:17:49

标签: audio ffmpeg waveform

我已经做过研究,试图用FFMPEG创建一个波形,我现在能够创建一个白色的png,波形是透明的。目标是生成波浪,如下面的平滑波,并使灰色透明。 ffmpeg wavform

这是我当前的FFMPEG波形发生器和输出。

ffmpeg -i ./_test.mp3 -filter_complex \
"[0:a]aformat=channel_layouts=mono,compand=gain=-6, \
showwavespic=s=450x46:colors=white,negate[a]; \
color=white:450x46[c]; \
[c][a]alphamerge"  -vframes 1 _test.png

ffmpeg wavform

1 个答案:

答案 0 :(得分:2)

你不能在FFmpeg中做到这一点,一个是因为波形不是用线绘制的,而是填充多边形,两个因为FFmpeg似乎在处理毫秒持续时间的音频时遇到了麻烦。 / p>

使用更高级的数学/绘图软件(如R,Octave或matplotlib)可能会这样做,但我首先想到的是使用三个更小的更专业的命令行实用程序:

  • SoX修剪,重新取样并将音频文件保存为可解析的.dat格式
  • (grep / sed清理.dat文件)
  • Gnuplot根据该.dat文件绘制一个图并保存为.png
  • Imagemagick修改.png以使绘制的线条透明

最后,我的示例脚本最终像这样

# create example file
sox -n -r 32k -b 16 pnoise.wav synth 10 pinknoise norm -0.1

# trim/convert
sox --norm=-1 pnoise.wav test.dat remix 1 trim 5 0.002 rate 200k

grep -v "^;" test.dat |\
  sed -e "s/^[[:space:]]*//" -e "s/[[:space:]]*$//" > test.txt

# draw plot    
gnuplot

set term png size 600,200 background "#BBBBBB"

set output "test.png"

unset key
unset border
unset xtics
unset ytics

set margins 0, 0, 0, 0

set yrange [-1:1]

plot "test.txt" with lines lt rgb "#FF0000" lw 3

exit

# replace red opaque with fully transparent
mogrify -channel rgba -matte -fill "#FF000000" -opaque "#FF0000" test.png

enter image description here