1 (изменено: Malcev, 2012-10-02 06:01:09)

Тема: AHK: Определить, что идет звук

Нужно послать email, если при воспроизведении видео на ютубе идет звук.
Как бы это сделать без привлечения стороннего софта, как аудио мониторига, или аудио записи с пропуском тишины.
Спасибо!
Update: Решил задачу другим способом, без реакции на звук, но если кто даст ответ - буду рад.

2

Re: AHK: Определить, что идет звук

VA_GetAudioMeter, пример по ссылке. Отсечь лишнее и готов «детектор звука».

3

Re: AHK: Определить, что идет звук

Note: This library depends entirely upon APIs present only in Windows Vista and later. Scripts using it should NOT be run in XP compatibility mode or on any version of Windows older than Vista.

А как быть с XP?

4 (изменено: Pokerist, 2013-01-25 05:10:21)

Re: AHK: Определить, что идет звук

creature.ws пишет:

VA_GetAudioMeter, пример по ссылке. Отсечь лишнее и готов «детектор звука».

  Вы не поможете опредлить, что именно там лишнее? Я лично ничего не понял, кроме того, что пяток функий там не созданы, но используются.

5 (изменено: creature.ws, 2013-02-05 06:10:48)

Re: AHK: Определить, что идет звук

#Include VA.ahk
#Persistent

audioMeter := VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VarSetCapacity(peakValues, channelCount*4)
SetTimer, GetPeakValues, 100
return

GetPeakValues:
    VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
    loop %channelCount%
        if NumGet(peakValues, A_Index*4-4, "float") {
            MsgBox раздался звук
            break
        }
    return

6

Re: AHK: Определить, что идет звук

Создал ahk-файл с этим кодом. В папке с ним создал файл VA.ahk  с кодом


#SingleInstance, Force
MeterLength = 30

audioMeter := VA_GetAudioMeter()

VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)

; "The peak value for each channel is recorded over one device
;  period and made available during the subsequent device period."
VA_GetDevicePeriod("capture", devicePeriod)

Loop
{
    ; Get the peak value across all channels.
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)    
    meter := MakeMeter(peakValue, MeterLength)
    
    ; Get the peak values of all channels.
    VarSetCapacity(peakValues, channelCount*4)
    VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
    Loop %channelCount%
        meter .= "`n" MakeMeter(NumGet(peakValues, A_Index*4-4, "float"), MeterLength)

    ToolTip, %meter%
    Sleep, %devicePeriod%
}

MakeMeter(fraction, size)
{
    global MeterLength
    Loop % fraction*size
        meter .= "|"
    Loop % (1-fraction)*size
        meter .= "."
    meter .= "  " fraction
    return meter
}

   И полчаю ошибку  "С: ... \VA.ahk (4) : ==> Call to nonexistent function." 
   Эта функция действительно не определена. По крайней мере, в приведенном коде. Помогите, пожлуйста!

7

Re: AHK: Определить, что идет звук

@Pokerist Вам нужно скачать архив и распаковать его либо в той же директории где и сам код, тогда уместна в коде такая запись:

creature.ws пишет:
#Include VA.ahk
...

Либо распаковать содержимое архива в папку библиотеки - ...\AutoHotkey\Lib\, директива #Include в коде будет не нужна.

8 (изменено: Pokerist, 2013-02-11 02:34:48)

Re: AHK: Определить, что идет звук

Спасибо, разобрался. Правда он работает не совсем так, как я расчитывал, но это другой вопрос.

9

Re: AHK: Определить, что идет звук

А на что вы расчитывали?
«Молвит тут скрипт человечьим голосом: — Не серчай…»

10

Re: AHK: Определить, что идет звук

Я рассчитывал, что он будет слышать то же что и я.    Крутится видео - идёт звук: срабатывание.  А он срабатывает, даже если видео остановить. Нужно обязательно закрывать окно плеера, чтобы срабатывания прекратились.
  Если запущено приложение со встроенным flash, то тоже срабатывания идут вне зависимости, проигрывается заук или нет. 
  Пока не понял как выловить именно тут звук, что я хочу поймать.

11 (изменено: creature.ws, 2013-02-12 11:17:14)

Re: AHK: Определить, что идет звук

идёт звук: срабатывание

Верно.

А он срабатывает, даже если видео остановить

Неверно.

#Persistent

audioMeter := VA_GetAudioMeter()
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VarSetCapacity(peakValues, channelCount*4)
SetTimer, GetPeakValues, 100
return

GetPeakValues:
    VA_IAudioMeterInformation_GetChannelsPeakValues(audioMeter, channelCount, &peakValues)
    loop %channelCount%
        ToolTip %v%
    until v := NumGet(peakValues, A_Index*4-4, "float")
    return

Если во всплывающем сообщении, во время полной тишины, будут отображаться цифры отличные от 0 — ваш компьютер вам что-то нашептывает, необходимо использовать беруши и шапочку из фольги

12

Re: AHK: Определить, что идет звук

Спасибо! Похоже шапочка не понадобится. Приятно иметь дело с Профи!

13

Re: AHK: Определить, что идет звук

Если во всплывающем сообщении, во время полной тишины, будут отображаться цифры отличные от 0

float 0.000000 не равнозначно 0. Хоть это и противоречит здравому смыслу, но правильнее сравнивать 0.000000 не с 0 а с 0.000001 или со строкой "0.000000".

14

Re: AHK: Определить, что идет звук

А как бы микрофон добавить?

15 (изменено: Alectric, 2014-08-25 19:57:29)

Re: AHK: Определить, что идет звук

Вот этого кода достаточно, чтобы считывать уровень сигнала на устройстве записи по умолчанию:

#SingleInstance, Force
#include va.ahk

audioMeter := VA_GetAudioMeter("capture")
VA_IAudioMeterInformation_GetMeteringChannelCount(audioMeter, channelCount)
VA_GetDevicePeriod("capture", devicePeriod)

Loop
{
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
    ToolTip, %peakValue%
    Sleep, %devicePeriod%
}

Только чтобы и правда увидеть уровень сигнала, нужно запустить любое приложение использующее микрофон (или устройство записи), кроме тех приложений, которые используют устройство в "монопольном режиме".


Вариант (от автора VA) с инициализацией звукового клиента (не требует запуска левых приложений, показывает уровень сразу):

#SingleInstance, Force
#include va.ahk

; Get the device which we'll be monitoring.
device := VA_GetDevice("capture")
; Get IAudioClient interface.
VA_IMMDevice_Activate(device, IID_IAudioClient:="{1CB9AD4C-DBFA-4c32-B178-C2F568A703B2}", 7, 0, audioClient)
; Get mixer format to pass to Initialize.
VA_IAudioClient_GetMixFormat(audioClient, format)
; Initialize audio client to ensure peak meter is active.
VA_IAudioClient_Initialize(audioClient, 0, 0, 0, 0, format, 0)

; Get IAudioMeterInformation interface.
audioMeter := VA_GetAudioMeter(device)
; No longer needed, so free it:
MeterLength = 30
; "The peak value for each channel is recorded over one device
;  period and made available during the subsequent device period."
VA_GetDevicePeriod("capture", devicePeriod)

Loop
{
    VA_IAudioMeterInformation_GetPeakValue(audioMeter, peakValue)
    ToolTip, %peakValue%
    Sleep, %devicePeriod%
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

16

Re: AHK: Определить, что идет звук

Alectric пишет:

Вариант (от автора VA) с инициализацией звукового клиента (не требует запуска левых приложений, показывает уровень сразу):

То, что надо!!!

17 (изменено: stealzy, 2015-02-17 13:24:01)

Re: AHK: Определить, что идет звук

Malcev,
каким способом у вас решено было,
без реакции на звук,
не поделитесь?

18

Re: AHK: Определить, что идет звук

Через анализ цвета пикселя в графическом эквалайзере с уровнем громкости?

19

Re: AHK: Определить, что идет звук

Именно так.