【问题标题】:Generating a waveform using ffmpeg使用 ffmpeg 生成波形
【发布时间】:2015-11-22 03:46:20
【问题描述】:

我正在尝试使用 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】:

    默认波形

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

    注意事项

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

    • 背景是透明的。

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

    • 您可以使用colors 选项更改通道颜色,例如"showwavespic=colors=blue|yellow"。查看list of valid color names 或使用十六进制表示法,例如#ffcc99

    • 有关其他选项,请参阅showwavespic filter documentation

    • 如果您想要视频而不是图片,请使用showwaves filter

    花式波形

    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
    

    选项说明

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

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

    3. showwavespic 制作实际波形。

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

    5. drawgrid 在背景上添加一个网格。网格不代表任何东西,而只是为了外观。网格颜色与波形颜色相同 (#9cf42f),但不透明度设置为 10% (@0.1)。

    6. overlay 会将[bg](我将其命名为背景过滤图)放在[fg](波形)后面。

    7. 最后,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
    

    【讨论】:

    • 感谢 LongNeckbeard,您是 FFmpeg 大师!当我执行“无聊的默认 wav”命令时,它已经有了透明背景和红色波浪,我不必添加额外的东西,效果很好。
    • Option 'colors' not found -- 我假设我需要一个构建标志
    • @chovy 你的ffmpeg 太旧了。请参阅FFmpeg Download 页面以获取指向您操作系统的“静态构建”的链接。
    • @llogan 有没有办法以数组格式生成波形数据,以便手动绘制?
    • @Jérémy 请参阅答案中的“每音频帧的 RMS 电平”命令,但将 -of csv=p=0 > rms.log 更改为 -of json > output.json
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2017-07-08
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多