默认波形
ffmpeg -i input.wav -filter_complex showwavespic -frames:v 1 output.png
注意事项
花式波形
ffmpeg -i input.mp4 -filter_complex \
"[0:a]aformat=channel_layouts=mono, \
compand=gain=-6, \
showwavespic=s=600x120:colors=#9cf42f[fg]; \
color=s=600x120:color=#44582c, \
drawgrid=width=iw/10:height=ih/5:color=#9cf42f@0.1[bg]; \
[bg][fg]overlay=format=auto,drawbox=x=(iw-w)/2:y=(ih-h)/2:w=iw:h=1:color=#9cf42f" \
-frames:v 1 output.png
选项说明
-
aformat 将音频下采样为单声道。否则,默认情况下,立体声输入会为每个通道产生不同颜色的波形(参见上面的默认波形示例)。
-
compand 修改音频的动态范围,使波形看起来不那么平坦。它对实际音频的表示不太准确,但对于某些输入可能更具视觉吸引力。
-
showwavespic 制作实际波形。
-
color源过滤器用于制作与波形大小相同的彩色背景。
-
drawgrid 在背景上添加一个网格。网格不代表任何东西,而只是为了外观。网格颜色与波形颜色相同 (#9cf42f),但不透明度设置为 10% (@0.1)。
-
overlay 会将[bg](我将其命名为背景过滤图)放在[fg](波形)后面。
-
最后,drawbox 将制作水平线,因此任何静默区域都不是空白。
渐变示例
使用gradients filter:
ffmpeg -i input.mp3 -filter_complex "gradients=s=1920x1080:c0=000000:c1=434343:x0=0:x1=0:y0=0:y1=1080,drawbox=x=(iw-w)/2:y=(ih-h)/2:w=iw:h=1:color=#0000ff[bg];[0:a]aformat=channel_layouts=mono,showwavespic=s=1920x1080:colors=#0068ff[fg];[bg][fg]overlay=format=auto" -vframes:v 1 output.png
彩色背景
ffmpeg -i input.opus -filter_complex "color=c=blue[color];aformat=channel_layouts=mono,showwavespic=s=1280x720:colors=white[wave];[color][wave]scale2ref[bg][fg];[bg][fg]overlay=format=auto" -frames:v 1 output.png
scale2ref 过滤器自动使背景与波形大小相同。
图片背景
当然,您可以使用图片或视频代替背景:
ffmpeg -i audio.flac -i background.jpg -filter_complex \
"[1:v]scale=600:-1,crop=iw:120[bg]; \
[0:a]showwavespic=s=600x120:colors=cyan|aqua[fg]; \
[bg][fg]overlay=format=auto" \
-q:v 3 showwavespic_bg.jpg
获取波形统计数据和数据
使用astats 过滤器。许多统计数据可用:RMS、峰值、最小值、最大值、差异等。
每个音频帧的 RMS 电平
获取标准 RMS 电平的示例,以 dBFS 为单位测量每个音频帧:
ffprobe -v error -f lavfi -i "amovie=input.wav,astats=metadata=1:reset=1" -show_entries frame_tags=lavfi.astats.Overall.RMS_level -of csv=p=0 > rms.log
每秒峰值级别
添加asetnsamples 过滤器。
ffprobe -v error -f lavfi -i "amovie=input.wav,asetnsamples=44100,astats=metadata=1:reset=1" -show_entries frame_tags=lavfi.astats.Overall.Peak_level -of csv=p=0
同上,但有时间戳
ffprobe -v error -f lavfi -i "amovie=input.wav,asetnsamples=44100,astats=metadata=1:reset=1" -show_entries frame=pkt_pts_time:frame_tags=lavfi.astats.Overall.Peak_level -of csv=p=0
输出到文件
只需将> output.log 附加到命令的末尾即可:
ffprobe -v error -f lavfi -i "amovie=input.wav,asetnsamples=44100,astats=metadata=1:reset=1" -show_entries frame_tags=lavfi.astats.Overall.RMS_level -of csv=p=0 > output.log
JSON
ffprobe -v error -f lavfi -i "amovie=input.wav,asetnsamples=44100,astats=metadata=1:reset=1" -show_entries frame_tags=lavfi.astats.Overall.RMS_level -of json > output.json