FFmpeg - 从 webm 文件生成波形图像由于覆盖过滤器而不起作用
FFmpeg - Generating waveform image from webm file not working due to overlay filter
我正在尝试从 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
Here是我用的视频
我尝试了各种 webm 文件,结果相同。我还测试了一些按预期工作的 .mp4、.mov、.ogv 文件。我使用的是最新的ffmpeg版本,下面是我的banner。
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
过滤器的输出具有非零点(表示时间戳)。所以 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
过滤器来打印点:
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 文件生成波形图像。我正在使用覆盖过滤器将波形覆盖在背景之上。每当使用叠加过滤器时,波形都不会显示。失败的命令:
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
Here是我用的视频
我尝试了各种 webm 文件,结果相同。我还测试了一些按预期工作的 .mp4、.mov、.ogv 文件。我使用的是最新的ffmpeg版本,下面是我的banner。
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
过滤器的输出具有非零点(表示时间戳)。所以 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
过滤器来打印点:
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