FFmpeg-从webm文件生成波形图像由于覆盖过滤器而不工作

FFmpeg-从webm文件生成波形图像由于覆盖过滤器而不工作,ffmpeg,waveform,webm,Ffmpeg,Waveform,Webm,我正在尝试从webm文件生成波形图像。我使用叠加滤波器将波形叠加在背景上。无论何时使用叠加滤波器,波形都不会显示。失败的命令: ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120[fg];color=s=640x120:color=#ff0000[bg];[bg][fg]overlay=format=auto" -frames:v 1 output.jpg 结果是: 我也尝试过使用图像作为背景,但效果相同

我正在尝试从webm文件生成波形图像。我使用叠加滤波器将波形叠加在背景上。无论何时使用叠加滤波器,波形都不会显示。失败的命令:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120[fg];color=s=640x120:color=#ff0000[bg];[bg][fg]overlay=format=auto" -frames:v 1 output.jpg
结果是:

我也尝试过使用图像作为背景,但效果相同:

ffmpeg -i big_buck_bunny.webm -i bg.jpg -filter_complex "showwavespic=s=640x120[fg];[1:v][fg]overlay=format=auto" -frames:v 1 output.jpg
在没有背景的情况下生成波形的工作原理与预期一致:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120" -frames:v 1 output.jpg

这是我正在使用的视频

我尝试过各种webm文件,结果都是一样的。我还测试了一些.mp4、.mov、.ogv文件,这些文件按预期工作。我正在使用最新的ffmpeg版本,下面是我的横幅

ffmpeg version 4.0.1 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 9.1.0 (clang-902.0.39.2)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.0.1 --enable-shared -- 
enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma
libavutil      56. 14.100 / 56. 14.100
libavcodec     58. 18.100 / 58. 18.100
libavformat    58. 12.100 / 58. 12.100
libavdevice    58.  3.100 / 58.  3.100
libavfilter     7. 16.100 /  7. 16.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  1.100 /  5.  1.100
libswresample   3.  1.100 /  3.  1.100
libpostproc    55.  1.100 / 55.  1.100

作为我的测试结果,当输入为webm格式时,
showwavespic
过滤器的输出具有非零pts(表示时间戳)。因此,
overlay
过滤器对第一帧不起作用。如果输出2帧(并更改背景色),如下所示:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120[fg];color=s=640x120:color=#ffff00[bg];[bg][fg]overlay=format=auto" -frames:v 2 output%d.jpg
你会看到第二帧是你想要的。您可以通过添加
showinfo
过滤器来打印pts:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120,showinfo[fg];color=s=640x120:color=#ffff00[bg];[bg][fg]overlay=format=auto,showinfo" -frames:v 2 output%d.jpg
我不知道为什么会这样。但您只需将
showwavespic
过滤器的pts强制为0即可解决此问题:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120,setpts=0[fg];color=s=640x120:color=#ffff00[bg];[bg][fg]overlay=format=auto" -frames:v 1 output.jpg

作为我的测试结果,当输入为webm格式时,
showwavespic
过滤器的输出具有非零pts(表示时间戳)。因此,
overlay
过滤器对第一帧不起作用。如果输出2帧(并更改背景色),如下所示:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120[fg];color=s=640x120:color=#ffff00[bg];[bg][fg]overlay=format=auto" -frames:v 2 output%d.jpg
你会看到第二帧是你想要的。您可以通过添加
showinfo
过滤器来打印pts:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120,showinfo[fg];color=s=640x120:color=#ffff00[bg];[bg][fg]overlay=format=auto,showinfo" -frames:v 2 output%d.jpg
我不知道为什么会这样。但您只需将
showwavespic
过滤器的pts强制为0即可解决此问题:

ffmpeg -i big_buck_bunny.webm -filter_complex "showwavespic=s=640x120,setpts=0[fg];color=s=640x120:color=#ffff00[bg];[bg][fg]overlay=format=auto" -frames:v 1 output.jpg