Php
使用 Alsa,如何通過 ffmpeg 或 mpg123 獲得目前音頻播放級別以顯示在 Web 儀表板上?
我有一個我建構的應用程序,它只播放來自網際網路的 icecast 提要,如果提要消失了,它會播放備份提要或一些本地音頻文件。我需要一種方法來在同一台機器上的 nginx 伺服器上執行的儀表板上顯示播放音頻的表示。如果可能的話,我希望它是實時的,但僅顯示音頻移動就足夠了。另外,我會使用它來編寫一些腳本,以防音頻從流中靜音。
謝謝!
我能想到的最簡單的(雖然絕對不是最便宜的,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 退出,圖像將停止更新。類似地,如果它停止,例如因為輸出不會獲取更多數據,或者輸入沒有數據。圖像上的修改時間將很明顯這已經發生了。
drawtext
您還可以讓 ffmpeg 使用過濾器在圖像頂部加上目前時間的時間戳:⋮ -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 - 你只需要提供一個靜態圖像:
PS:至於腳本是否靜默,最好在您的應用程序中完成 - 僅供參考,您可以使用不同格式(例如 JSON)的相同 ebur128 過濾器輸出元數據,以便檢查它是否靜默。不幸的是,它與其他 ffmpeg 輸出混合在一起,因此解析可能有點煩人。我已經編寫了 Perl 程式碼來做這件事,但您可能會發現用您選擇的腳本語言來做這件事很容易。