使用ffmpeg生成波形

问题描述 投票:0回答:1

我正在尝试使用 ffmpeg 生成波形图像。

我已经成功制作了波形图,但是看起来不太好看...

我一直在四处寻找,尝试对图像进行样式设计,使其看起来更好,但是我无法找到有关此的任何信息或任何有关此的教程。

我使用 PHP 和 shell_exec 来创建波形。

我知道有 php 库可以做到这一点,但由于文件格式的原因,这是一个漫长的过程。

我使用的代码如下:

$command = 'convertvid\bin\ffmpeg -i Temp\\'.$file.' -y -lavfi showwavespic=split_channels=0:s='.$width.'x50 Temp\\'.$PNGFileName;
shell_exec($command);

基本上我想在中间添加一条线,因为目前有空白点,并且希望能够设置背景和波浪颜色。

php ffmpeg
1个回答
76
投票

默认波形

Default waveform

ffmpeg -i input.wav -filter_complex showwavespic -frames:v 1 output.png

注释

  • 注意中间的无声音频片段(如果您想了解如何添加线条,请参阅下面的“花式波形”)。

  • 背景是透明的。

  • 立体声输入的默认颜色为红色(左通道)和绿色(右通道)。颜色在通道重叠的地方混合。

  • 您可以使用

    colors
    选项更改通道颜色,例如
    "showwavespic=colors=blue|yellow"
    。请参阅有效颜色名称列表或使用十六进制表示法,例如
    #ffcc99

  • 请参阅 showwavespic 滤镜文档了解其他选项。

  • 如果您想要视频而不是图像,请使用 showwaves 滤镜

奇特的波形

Fancy waveform

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=#[email protected][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

选项说明

  1. aformat 将音频下采样为单声道。否则,默认情况下,立体声输入将导致每个通道的波形具有不同的颜色(请参阅上面的默认波形示例)。

  2. compand 修改音频的动态范围,使波形看起来不那么平坦。它对实际音频的表示不太准确,但对于某些输入来说在视觉上更具吸引力。

  3. showwavespic 制作实际波形。

  4. 颜色源滤波器用于制作与波形大小相同的彩色背景。

  5. drawgrid 在背景上添加网格。网格不代表任何东西,只是为了美观。网格颜色与波形颜色相同 (

    #9cf42f
    ),但不透明度设置为 10% (
    @0.1
    )。

  6. 覆盖将把

    [bg]
    (我为背景命名的过滤图)放在
    [fg]
    (波形)后面。

  7. 最后,drawbox将制作水平线,因此任何静音区域都不是空白。

渐变示例

Gradient example

使用渐变过滤器

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

彩色背景

waveform with simple color background

ffmpeg -i input.opus -filter_complex "color=c=blue[color];aformat=channel_layouts=mono,showwavespic=s=1280x720:colors=white[wave];[color][wave]scale=rw:rh[bg];[bg][wave]overlay=format=auto" -frames:v 1 output.png

scale 过滤器自动使背景与波形大小相同。

图像背景

当然您可以使用图像或视频代替背景:

Image background example

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 电平

获取每个音频帧以 dBFS 为单位测量的标准 RMS 电平的示例:

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
© www.soinside.com 2019 - 2024. All rights reserved.