Alsa를 사용하여 ffmpeg 또는 mpg123을 통해 재생되는 현재 오디오 레벨을 웹 대시보드에 표시하려면 어떻게 해야 합니까?

Alsa를 사용하여 ffmpeg 또는 mpg123을 통해 재생되는 현재 오디오 레벨을 웹 대시보드에 표시하려면 어떻게 해야 합니까?

저는 인터넷에서 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 출력 이미지는 상당히 크고 최소 동적 범위의 오디오 재생을 보여줍니다.

추신: 스크립트 작성(자동인 경우)은 애플리케이션에서 수행하는 것이 가장 좋습니다. 참고로 동일한 ebur128 필터를 사용하여 메타데이터를 다른 형식(예: JSON)으로 출력하여 자동인지 검사할 수 있습니다. 불행히도 다른 ffmpeg 출력과 혼합되어 있으므로 구문 분석하기가 약간 성가실 수 있습니다. 나는 썼다이를 수행하는 Perl 코드, 그러나 선택한 스크립팅 언어로 이 작업을 수행하는 것이 쉽다는 것을 알 수 있습니다.

관련 정보