使用 Alsa,如何获取通过 ffmpeg 或 mpg123 播放的当前音频级别以显示在 Web 仪表板上?

使用 Alsa,如何获取通过 ffmpeg 或 mpg123 播放的当前音频级别以显示在 Web 仪表板上?

我开发了一个应用程序,它只是播放来自互联网的 icecast 源,如果源消失了,它会播放备份源或一些本地音频文件。我需要一种方法来在同一台机器上的 nginx 服务器上运行的仪表板上显示正在播放的音频。如果可能的话,我希望它是实时的,但仅显示音频移动就足够了。此外,如果音频在流中静音,我会使用它来编写一些脚本。

谢谢!

答案1

我能想到的最简单的(虽然绝对不是最便宜的,从 CPU 角度来看)方法是让 ffmpeg 除了正常输出之外,每隔一段时间就输出一个带有响度计的图像。你可以这样做:

ffmpeg -i «INPUT» \
    -filter_complex '[0:a]ebur128=video=1:meter=18:metadata=0[g][j], [j]anullsink, [g]fps=1[g]' \
    -map '[g]' -f image2 -update 1 -y «IMAGEFILE».png \
    -map '0:a' -c:a copy -y «AUDIO_OUTPUT»

这应该每秒输出一次图像(尽管请注意,这是每秒处理的音频;ffmpeg 通常会以 CPU 允许的速度运行,至少如果输出能够如此快地接受数据的话。我假设您的输出将其限制为以 1x 运行)。您可以通过更改值来更改图像更新的频率fps=; 2 表示每秒两次,0.5 表示每 2 秒一次。

显然,如果 ffmpeg 退出,图像将停止更新。类似地,如果它被停止,例如,因为输出不会获取更多数据,或者输入没有数据。图像上的修改时间将使这种情况的发生变得足够明显。您还可以使用过滤器让 ffmpeg 在图像顶部添加当前时间的时间戳drawtext


    -filter_complex '[0:a]ebur128=video=1:meter=18:metadata=0[g][j], [j]anullsink, [g]fps=1, drawtext=text=%{localtime} %{pts}:x=60:y=460:fontcolor=Cyan[g]'

那么你甚至不需要 PHP——你只需要提供一个静态图像:

ffmpeg ebur128 输出图像显示相当响亮、最小动态范围的音频播放

PS:至于编写脚本(如果它是静默的),那最好在您的应用程序中完成 - 仅供参考,您可以使用不同格式(例如 JSON)的相同 ebur128 过滤器输出元数据,以便您可以检查它是否静默。不幸的是,它与其他 ffmpeg 输出混合在一起,因此解析可能有点烦人。我写过Perl 代码来做到这一点,但您可能会发现用您选择的脚本语言来完成这件事很容易。

相关内容