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»

これは1秒あたりの画像を出力する必要があります(これは1秒あたりのオーディオ処理であることに注意してください。少なくとも、出力がデータをそのようにすばやく受け入れることができる場合、ffmpegは通常CPUが許可するのと同じくらい速く実行されます。出力がこれを制限すると仮定します。 . 1xで実行)。値を変更して画像の更新頻度を変更できますfps=。 2は1秒あたり2回、0.5は2秒に1回を意味します。

明らかに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:スクリプトの作成(自動の場合)はアプリケーションで実行するのが最善です。ちなみに、同じebur128フィルタを使用して、メタデータを別の形式(JSONなど)に出力して自動かどうかを確認できます。残念ながら、他のffmpeg出力と混在しているため、解析するのは少し面倒です。私は書いたこれを行うPerlコードただし、選択したスクリプト言語でこれを行うのは簡単です。

おすすめ記事