Questo semplice script PowerShell monitora una serie di ingressi audio e manda una mail se il livello scende sotto una data soglia per un determinato periodo di tempo (in questo esempio -50dB per 5 secondi).
Dando per scontato di avere FFmpeg installato ed aggiunto ai percorsi di sistema, il primo passo è individuare il nome delle interfacce da monitorare:
ffmpeg -list_devices true -f dshow -i dummy
Digitando questa riga nel terminale si ottiene un risultato simile:

All’inizio dello script si trova un array dove vanno copiati i nomi tra virgolette, fatto questo basta compilare la parte relativa alle credenziali email ed il gioco è fatto.
$Stations = @(
[pscustomobject]@{Name='Radio Pippo'; SoundCard='Microfono (3- USB Audio CODEC )'}
[pscustomobject]@{Name='Radio Pluto'; SoundCard='CABLE Output (VB-Audio Virtual Cable)'}
)
$Smtp = "smtp.gmail.com"
$Port = "587"
$To = @("destinatario1@radiotopolino.it", "destinatario2@radiotopolino.it")
$From = "mittente@radiotopolino.it"
$Password = "quivalapassword" | ConvertTo-SecureString -AsPlainText -Force
$Credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $From, $Password
foreach($Station in $Stations){
Start-Job -Name $Station.Name -ScriptBlock {
$SoundCard = $Using:Station.SoundCard
ffmpeg -f dshow -i audio=$SoundCard -af silencedetect=noise=-50dB:d=4.99 -f null /dev/null 2>&1 | Select-String -Pattern "silencedetect"
}
}
While($True){
foreach($Station in $Stations){
$Check = Receive-Job -Name $Station.Name
if($Check -like "*silence_start*"){
Write-Host $(Get-Date) $Station.Name rilevato silenzio -BackgroundColor Red
$Subject = 'Allarme! ' + $Station.Name + ' muta!'
$Body = "$(Get-Date) - Rilevato silenzio"
Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $Smtp -port $Port -UseSsl -Credential $Credentials -Encoding ([System.Text.Encoding]::UTF8)
}
if($Check -like "*silence_end*"){
Write-Host $(Get-Date) $Station.Name allarme rientato -BackgroundColor Green
$Subject = 'Tranquillo, ' + $Station.Name + ' è tornata in onda.'
$Body = "$(Get-Date) - Allarme rientrato"
Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $Smtp -port $Port -UseSsl -Credential $Credentials -Encoding ([System.Text.Encoding]::UTF8)
}
}
}
Lo script avvia un processo FFmpeg per ogni ingresso audio dichiarato nell’array, in questo modo tutti i flussi vengono monitorati contemporaneamente.
Con una piccola modifica è possibile monitorare streaming Icecast al posto di schede audio, basta sostituire la dichiarazione dell’ingresso nella chiamata a FFmpeg, ad esempio:
ffmpeg -i https://radiovegit.radioca.st/radiovegit_mp3 -af silencedetect=noise=-50dB:d=4.99 -f null /dev/null 2>&1