Тема: AHK: Воспроизведение одного звука из mp4
Здравствуйте.
Подскажите как средствами AHK - без открытия посторонних программ - воспроизвести звук файла "C:\звуки 1\1.mp4" ?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте.
Подскажите как средствами AHK - без открытия посторонних программ - воспроизвести звук файла "C:\звуки 1\1.mp4" ?
Проще всего так:
SoundPlay
Если не захочет играть, тогда так:
; https://docs.microsoft.com/en-us/windows/desktop/WMP/object-model-reference-for-scripting
#Persistent
filePath := "C:\звуки 1\1.mp4"
Player := ComObjCreate("WMPlayer.OCX.7")
ComObjConnect(Player, "WMP_")
Player.Settings.Volume := 50
Player.url := filePath
Return
WMP_StatusChange(wmp) {
if wmp.PlayState = 1 ; Stopped
ExitApp
}
teadrinker, скажите - а как заставить этот код бесконечно проигрывать звук ?
Какой код, первый, или второй?
teadrinker, второй код.
Тот который вы к своему сообщению приложили.
Добавьте строчку
Player.Settings.SetMode("loop", true)
teadrinker, скажите - а вот допустим скрипт 1.ahk проигрывает звук бесконечно.
Как закрыть этот скрипт, чтобы выключить это проигрывание ?
Правой кнопкой по иконке скрипта в трее —> Exit.
Это понятно.
Я имею ввиду - как другим скриптом выключить скрипт 1.ahk ?
SetTitleMatchMode 2
DetectHiddenWindows, On
WinClose, 1.ahk ahk_class AutoHotkey
teadrinker, не работает.
Сперва запускаю 1.ahk - начинает играть звук.
Потом запускаю последний код - и ничего не происходит.
Звук продолжает проигрываться.
У меня работает. Попробуйте убрать в конце "ahk_class AutoHotkey".
teadrinker, убрал.
Теперь скрипт выглядит вот так:
SetTitleMatchMode 2
DetectHiddenWindows, On
WinClose, 1.ahk
Но он по-прежнему не закрывает процесс 1.ahk и звук продолжает играть.
teadrinker, я не совсем разбираюсь в ahk.
Поэтому немного непонятно как эти процессы отображаются в диспетчере задач.
У меня постоянно висит в трее - несколько других рабочих скриптов ahk, которых не нужно закрывать.
И как я понял - им всем сопоставлен процесс AutoHotkey.exe
Когда я запускаю 1.ahk - то в диспетчере задач появляется еще один процесс с точно таким же названием AutoHotkey.exe.
Всё правильно, так и должно быть. Ещё так можно попробовать:
WM_COMMAND := 0x111, ID_FILE_PAUSE := 65403, ID_FILE_CLOSE = 65405
scriptName := "1.ahk ahk_class AutoHotkey"
DetectHiddenWindows, On
SetTitleMatchMode 2
if !hWnd := WinExist(scriptName) {
MsgBox, Окно не найдено!
Return
}
PostMessage, WM_COMMAND, ID_FILE_PAUSE
PostMessage, WM_COMMAND, ID_FILE_CLOSE
teadrinker, запускаю этот скрипт, но ничего не происходит.
1.ahk по-прежнему висит в трее и продолжает проигрывать звуковой файл.
Не знаю тогда, в чём может быть проблема. Разве что 1.ahk запущен от администратора, а тот, которым пытаетесь закрыть — нет.
Попробуйте запустить в таком виде:
WM_COMMAND := 0x111, ID_FILE_PAUSE := 65403, ID_FILE_CLOSE = 65405
scriptName := "1.ahk ahk_class AutoHotkey"
DetectHiddenWindows, On
SetTitleMatchMode 2
MsgBox, Закрывающий скрипт запущен
if !hWnd := WinExist(scriptName)
MsgBox, Окно не найдено!
else
MsgBox, Окно 1.ahk обнаружено
PostMessage, WM_COMMAND, ID_FILE_PAUSE
MsgBox, % ErrorLevel
PostMessage, WM_COMMAND, ID_FILE_CLOSE
MsgBox, % ErrorLevel
Какие сообщения выдаёт?
teadrinker, теперь появилось окно "Закрывающий скрипт запущен".
Затем пишет "Окно 1.ahk обнаружено".
Затем пишет "0".
Затем опять пишет "0" - и звук перестает проигрываться и файл 1.ahk закрывается.
А как это все - без лишних окон сделать ?
Просто закрыть и все.
Попробуйте так:
WM_COMMAND := 0x111, ID_FILE_PAUSE := 65403, ID_FILE_CLOSE = 65405
scriptName := "1.ahk ahk_class AutoHotkey"
DetectHiddenWindows, On
SetTitleMatchMode 2
if !WinExist(scriptName) {
MsgBox, Окно не найдено!
Return
}
PostMessage, WM_COMMAND, ID_FILE_PAUSE
Sleep, 100
PostMessage, WM_COMMAND, ID_FILE_CLOSE
teadrinker, вот сейчас все заработало.
Большое спасибо вам.
Gui, Add, ActiveX, vMP, WMPlayer.OCX
MP.url := file ; путь к файлу
gui, show, hide
WP.Play
Остановка:
gui, destroy
А GUI зачем?
Добавьте строчку
Player.Settings.SetMode("loop", true)
Странный эффект, в WMP из под винды или в большинстве других плееров в момент повторного проигрывания нет мелькания как в ActiveX.
Точнее в момент окончания воспроизведения последний кадр пропадает (так же как и при однократном воспроизведении), то есть становится черная картинка.
Причём такого нет, если ActiveX в точности соответствует размерам видео, то есть по окончании воспроизведения остаётся последний кадр.
Отслеживай конец и перематывай сам на начало.
Непрерывно следить когда текущая позиция совпадёт с концом, что то не очень.
Так в конце не исчезает:
#SingleInstance Force
#NoEnv
File = w2v.mp4
OnExit Wmpclose
Global hWmp
Gui, Margin, 0,0
Gui +LastFound +AlwaysOnTop -Caption
Gui Add, ActiveX, w111 h111 vWmp hwndhWmp, WmpLayer.OCX
ComObjConnect(Wmp, WmpEvents)
Wmp.uiMode := "none"
Wmp.Url := File
Gui, Show, NA x0 y0
return
Class WmpEvents
{
StatusChange(Wmp) {
If Wmp.PlayState = 3 ; Playing
{
Height := Wmp.currentMedia.imageSourceHeight
Width := Wmp.currentMedia.imageSourceWidth
winmove, ahk_id %hWmp%, , 0, 0, Width, Height
Gui, Show, NA w%Width% h%Height%
}
}
}
esc::
Wmpclose:
Wmp.close
ExitApp
Но если изменить размер, то исчезает.
winmove, ahk_id %hWmp%, , 0, 0, Width, Height-1
Через settimer?
Таймер исходя из продолжительности?
На коротких роликах не айс, и при открытии файла, даже картинки, WMP очень прожорлив, будут просадки.
Также при открытии почему то начинают перерисовываться некоторые другие окна, например блокнот++, думаю это тоже часть большой нагрузки. В других плеерах такого не наблюдал.
То что в 28 последний кадр остаётся, это по твоему баг.
Можно запускать таймер при событии начала воспроизведения, после чего подписку на событие прекращать.
А таймер уже будет запускать "Wmp.controls.currentPosition := 0".
Тебе же непрерывный цикл нужен, так что файл будет открываться только первый раз.
То что в 28 последний кадр остаётся, это по твоему баг.
По-моему WMP - это один большой баг.
Да уж, работает через одно место. Знаешь какие то плееры с API и.т.п.
Не, никакие не тестировал.
Но у меня без глюков работает если в таймере прописать:
Wmp.controls.Pause
Wmp.controls.currentPosition := 0
Wmp.controls.Play
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться