Vai al contenuto
Home » Blog » Silence detector con FFmpeg e PowerShell

Silence detector con FFmpeg e PowerShell

Silence detector

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *