Что нового

Циклический запуск .mp3 файла

Alsagas

Новичок
Сообщения
15
Репутация
0
Версия AutoIt: 3.3.12.0

Описание: Добрый день. Нужен скрипт для циклического запуска .mp3 файла. По умолчанию стоит виндовс медиа плеер. Нужно чтобы музыкальный файл перезапускался по завершении, при этом окно WMP должно быть скрыто, так как при этом еще и работает реклама в PowerPoint, ну и нужна остановка скрипта по какой-нибудь клавише. Заранее благодарен.

Примечания:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Код:
#include <Sound.au3>
Global $paused = False
Global $hSound
Global $sSound = ""
Global $status

Local $tmp = FileOpenDialog("Select sound", @ScriptDir & "\", "mp3 (*.mp3)|wave (*.wav)|All (*.*)", 1, "")
If @error Then
	Exit
Else
	$sSound = $tmp
EndIf
If Not FileExists($sSound) Then
	MsgBox(16, "error", "File not exists" & @CRLF & $sSound)
	Exit 1
EndIf

Func _quit()
	_SoundStop($hSound)
	_SoundClose($hSound)
	Exit
EndFunc   ;==>_quit
HotKeySet("{ESC}", "_quit")

Func _toggle()
	$status = _SoundStatus($hSound)
	If $status = "playing" Then
		$paused = True
		_SoundPause($hSound)
;		While $paused
;			Sleep(100)
;		WEnd
	ElseIf $status = "paused" Then
		$paused = False
		_SoundResume($hSound)
	Else
		$paused = False
		_SoundPlay($hSound)
	EndIf
EndFunc   ;==>_toggle
HotKeySet("{F8}", "_toggle")

If Not FileExists($sSound) Then
	MsgBox(16, "error", "File not exists" & @CRLF & $sSound)
	Exit 1
EndIf
ToolTip("toggle: F8, Quit: ESC.", 0, 0, "player")
$hSound = _SoundOpen($sSound)
_SoundPlay($hSound)
While 1
	$status = _SoundStatus($hSound)
	If $status <> "playing" And $paused == False Then _SoundPlay($hSound)
	Sleep(100)
WEnd
_SoundClose($hSound)
 
Автор
A

Alsagas

Новичок
Сообщения
15
Репутация
0
Большое спасибо, все работает. Это именно то, что мне нужно было :smile:
 
Автор
A

Alsagas

Новичок
Сообщения
15
Репутация
0
Прошу еще раз помощи по этому же вопросу: Теперь потребовался циклический запуск нескольких треков. Такое возможно?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Вот написал, только мне кажется это велосипед, но работает... :smile:
Код:
#include <Sound.au3>
Global $paused = False, $iEnd = 0
Global $hSound
Global $sSound = "", $aSounds, $iMult = 0
Global $status

Local $tmp = FileOpenDialog("Select sounds", @ScriptDir & "\", "mp3 (*.mp3)|wave (*.wav)|All (*.*)", 1 + 4, "")
If @error Then
	Exit
Else
	If Not StringInStr($tmp, "|") Then
		$iMult = 0
		$sSound = $tmp
	Else
		$iMult = 1
		$aSounds = StringSplit($tmp, "|")
		$sPath = $aSounds[1]
	EndIf
EndIf

If $iMult = 0 Then
	If Not FileExists($sSound) Then
		MsgBox(16, "error", "File not exists" & @CRLF & $sSound)
		Exit 1
	EndIf
Else
	For $i = 2 To $aSounds[0]
		If Not FileExists($sPath & "\" & $aSounds[$i]) Then
			MsgBox(16, "error", "File not exists" & @CRLF & $sPath & "\" & $aSounds[$i])
			Exit 1
		EndIf
	Next
EndIf

Func _quit()
	_SoundStop($hSound)
	_SoundClose($hSound)
	Exit
EndFunc   ;==>_quit
HotKeySet("{ESC}", "_quit")

Func _toggle()
	$status = _SoundStatus($hSound)
	If $status = "playing" Then
		$paused = True
		_SoundPause($hSound)
		;   While $paused
		;   Sleep(100)
		;   WEnd
	ElseIf $status = "paused" Then
		$paused = False
		_SoundResume($hSound)
	Else
		$paused = False
		_SoundPlay($hSound)
	EndIf
EndFunc   ;==>_toggle
HotKeySet("{F8}", "_toggle")

ToolTip("toggle: F8, Quit: ESC.", 0, 0, "player")
If $iMult = 0 Then
	$hSound = _SoundOpen($sSound)
	_SoundPlay($hSound)
	While 1
		$status = _SoundStatus($hSound)
		If $status <> "playing" And $paused == False Then _SoundPlay($hSound)
		Sleep(500)
	WEnd
	_SoundClose($hSound)
Else
	$iEnd = 0
	Local $i = 2
	While $i <= $aSounds[0]
		$hSound = _SoundOpen($sPath & "\" & $aSounds[$i])
		_SoundPlay($hSound)
		While 3
			$status = _SoundStatus($hSound)
			If $status <> "playing" And $status <> "stopped" And $paused == False Then _SoundPlay($hSound)
			If $status = "stopped" And $paused == False Then ExitLoop
			If $iEnd = 1 Then ExitLoop 2
			Sleep(500)
		WEnd
		_SoundClose($hSound)
		$i += 1
		If $i > $aSounds[0] Then $i = 2
		Sleep(500)
	WEnd
EndIf
 
Автор
A

Alsagas

Новичок
Сообщения
15
Репутация
0
Большое спасибо, отлично работает, но нельзя ли обойтись без диалога открытия файла? Просто тупо вписать несколько треков в скрипт и все. Там ситуация в чем, скрипт в автозагрузке стоит и там же презентация. При рестарте компа с рекламой презентация запускается, а скрипт в таком виде запустит диалог открытия файла, который некому будет обработать, поэтому хотелось бы просто вписать несколько треков и работать с ними.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Alsagas [?]
но нельзя ли обойтись без диалога открытия файла? Просто тупо вписать несколько треков в скрипт и все.
А, ну так конечно можно... :smile:
Код:
#include <Sound.au3>
Global $paused = False, $iEnd = 0
Global $hSound
Global $sSound = "", $aSounds, $iMult = 0
Global $status

; пути / имена файлов через |
$aSounds = StringSplit("112.mp3|1337.mp3|22_bg_music.mp3", "|")

If Not IsArray($aSounds) Then
	MsgBox(0, "error", "aSound not array")
	Exit
EndIf

For $i = 1 To $aSounds[0]
	If Not FileExists($aSounds[$i]) Then
		MsgBox(16, "error", "File not exists" & @CRLF & $aSounds[$i])
		Exit 1
	EndIf
Next

Func _quit()
	_SoundStop($hSound)
	_SoundClose($hSound)
	Exit
EndFunc   ;==>_quit
HotKeySet("{ESC}", "_quit")

Func _toggle()
	$status = _SoundStatus($hSound)
	If $status = "playing" Then
		$paused = True
		_SoundPause($hSound)
		;   While $paused
		;   Sleep(100)
		;   WEnd
	ElseIf $status = "paused" Then
		$paused = False
		_SoundResume($hSound)
	Else
		$paused = False
		_SoundPlay($hSound)
	EndIf
EndFunc   ;==>_toggle
HotKeySet("{F8}", "_toggle")

ToolTip("toggle: F8, Quit: ESC.", 0, 0, "player")
$iEnd = 0
Local $i = 1
While $i <= $aSounds[0]
	$hSound = _SoundOpen($aSounds[$i])
	_SoundPlay($hSound)
	While 3
		$status = _SoundStatus($hSound)
		If $status <> "playing" And $status <> "stopped" And $paused == False Then _SoundPlay($hSound)
		If $status = "stopped" And $paused == False Then ExitLoop
		If $iEnd = 1 Then ExitLoop 2
		Sleep(500)
	WEnd
	_SoundClose($hSound)
	$i += 1
	If $i > $aSounds[0] Then $i = 1
	Sleep(500)
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Alsagas,
ИМХО, в скрипте надо указать папку с mp3-файлами получать список через _FileListToArray. Тогда можно менять треки не меняя ничего в скрипте.
alex33,
ИМХО, можно один раз посмотреть продолжительность (по времени) очередного mp3-файла (при паузе делать счетчик времени паузы) и не проверять каждые полсекунды статус.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
madmasles
Спасибо, что-то не подумал об этом...
 
Автор
A

Alsagas

Новичок
Сообщения
15
Репутация
0
madmasles сказал(а):
Alsagas,
ИМХО, в скрипте надо указать папку с mp3-файлами получать список через _FileListToArray. Тогда можно менять треки не меняя ничего в скрипте.
Большое спасибо за совет, но я в этом деле пока совсем тугой, а начальство трясет, так что я могу только попросить добавить эту папку. Прошу прощения за то, что напрягаю своими проблемами.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Alsagas,
Мой вариант.
Код:
#include <Sound.au3>
#include <File.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sDir, $aMP3, $iCount, $fPause, $aSound

HotKeySet('{Esc}', '_Exit');		Esc - выход
_Start()
HotKeySet('{F8}', '_Pause');		F8 - пауза в проигрывании
HotKeySet('+{F8}', '_PlayNext');	Shift+F8 - проигрывать следующий файл

While 1
	Sleep(500)
WEnd

Func _Pause()
	Local $i_Len, $i_Pos
	$fPause = Not $fPause
	If $fPause Then
		AdlibUnRegister('_PlayNext')
		TraySetToolTip('(' & $aMP3[0] & ') пауза')
		If IsArray($aSound) Then
			If Not _SoundPause($aSound) Then
				$fPause = False
				_Pause()
			EndIf
		EndIf
	Else
		If IsArray($aSound) Then
			$i_Len = _SoundLength($aSound, 2)
			If @error Then _PlayNext()
			$i_Pos = _SoundPos($aSound, 2)
			If @error Then _PlayNext()
			_SoundResume($aSound)
			If @error Then _PlayNext()
			TraySetToolTip('(' & $aMP3[0] & ') ' & $iCount & ' - ' & $aMP3[$iCount])
			AdlibRegister('_PlayNext', $i_Len - $i_Pos + 250)
		Else
			_PlayNext()
		EndIf
	EndIf
EndFunc   ;==>_Pause

Func _Exit()
	If IsArray($aSound) Then
		_SoundStop($aSound)
		_SoundClose($aSound)
	EndIf
	Exit
EndFunc   ;==>_Exit

Func _PlayNext()
	AdlibUnRegister('_PlayNext')
	Local $i_Len
	If IsArray($aSound) Then
		_SoundStop($aSound)
		_SoundClose($aSound)
		$aSound = 0
	EndIf
	$iCount += 1
	If $iCount > $aMP3[0] Then $iCount = 1
	If Not FileExists($sDir & $aMP3[$iCount]) Then _PlayNext()
	$aSound = _SoundOpen($sDir & $aMP3[$iCount])
	If @error Or @extended Then _PlayNext()
	$i_Len = _SoundLength($aSound, 2)
	If @error Then _PlayNext()
	If Not _SoundPlay($aSound) Then _PlayNext()
	TraySetToolTip('(' & $aMP3[0] & ') ' & $iCount & ' - ' & $aMP3[$iCount])
	AdlibRegister('_PlayNext', $i_Len + 250)
EndFunc   ;==>_PlayNext

Func _Start()
	Local $s_Ini = @ScriptDir & '\Info.ini', $s_Mask, $i_Len

	$sDir = StringRegExpReplace(IniRead($s_Ini, 'Info', 'Dir', @ScriptDir), '\\*$', '') & '\'
	$s_Mask = '*.' & StringRegExpReplace(IniRead($s_Ini, 'Info', 'Files', 'mp3'), '^.*\.', '')
	$aMP3 = _FileListToArray($sDir, $s_Mask, 1)
	If @error Then
		MsgBox(16, 'Error', 'Не найдено файлов ' & $s_Mask & 'в папке ' & $sDir)
		Exit
	EndIf
	_PlayNext()
EndFunc   ;==>_Start
Рядом со скриптом должен лежать Info.ini с таким содержимым:
Код:
[Info]
Dir=G:\Downloads-1\Музыка
Files=mp3
Где Dir - полный путь к папке с муз. файлами (по умолчанию будет искать в своей папке), Files - расширение муз. файлов (по умолчанию будет искать mp3). Все значения оставил свои, поменяйте на нужные Вам.
 
Автор
A

Alsagas

Новичок
Сообщения
15
Репутация
0
madmasles сказал(а):
Alsagas,
Мой вариант.
Код:
#include <Sound.au3>
#include <File.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sDir, $aMP3, $iCount, $fPause, $aSound

HotKeySet('{Esc}', '_Exit');		Esc - выход
_Start()
HotKeySet('{F8}', '_Pause');		F8 - пауза в проигрывании
HotKeySet('+{F8}', '_PlayNext');	Shift+F8 - проигрывать следующий файл

While 1
	Sleep(500)
WEnd

Func _Pause()
	Local $i_Len, $i_Pos
	$fPause = Not $fPause
	If $fPause Then
		AdlibUnRegister('_PlayNext')
		TraySetToolTip('(' & $aMP3[0] & ') пауза')
		If IsArray($aSound) Then
			If Not _SoundPause($aSound) Then
				$fPause = False
				_Pause()
			EndIf
		EndIf
	Else
		If IsArray($aSound) Then
			$i_Len = _SoundLength($aSound, 2)
			If @error Then _PlayNext()
			$i_Pos = _SoundPos($aSound, 2)
			If @error Then _PlayNext()
			_SoundResume($aSound)
			If @error Then _PlayNext()
			TraySetToolTip('(' & $aMP3[0] & ') ' & $iCount & ' - ' & $aMP3[$iCount])
			AdlibRegister('_PlayNext', $i_Len - $i_Pos + 250)
		Else
			_PlayNext()
		EndIf
	EndIf
EndFunc   ;==>_Pause

Func _Exit()
	If IsArray($aSound) Then
		_SoundStop($aSound)
		_SoundClose($aSound)
	EndIf
	Exit
EndFunc   ;==>_Exit

Func _PlayNext()
	AdlibUnRegister('_PlayNext')
	Local $i_Len
	If IsArray($aSound) Then
		_SoundStop($aSound)
		_SoundClose($aSound)
		$aSound = 0
	EndIf
	$iCount += 1
	If $iCount > $aMP3[0] Then $iCount = 1
	If Not FileExists($sDir & $aMP3[$iCount]) Then _PlayNext()
	$aSound = _SoundOpen($sDir & $aMP3[$iCount])
	If @error Or @extended Then _PlayNext()
	$i_Len = _SoundLength($aSound, 2)
	If @error Then _PlayNext()
	If Not _SoundPlay($aSound) Then _PlayNext()
	TraySetToolTip('(' & $aMP3[0] & ') ' & $iCount & ' - ' & $aMP3[$iCount])
	AdlibRegister('_PlayNext', $i_Len + 250)
EndFunc   ;==>_PlayNext

Func _Start()
	Local $s_Ini = @ScriptDir & '\Info.ini', $s_Mask, $i_Len

	$sDir = StringRegExpReplace(IniRead($s_Ini, 'Info', 'Dir', @ScriptDir), '\\*$', '') & '\'
	$s_Mask = '*.' & StringRegExpReplace(IniRead($s_Ini, 'Info', 'Files', 'mp3'), '^.*\.', '')
	$aMP3 = _FileListToArray($sDir, $s_Mask, 1)
	If @error Then
		MsgBox(16, 'Error', 'Не найдено файлов ' & $s_Mask & 'в папке ' & $sDir)
		Exit
	EndIf
	_PlayNext()
EndFunc   ;==>_Start
Рядом со скриптом должен лежать Info.ini с таким содержимым:
Код:
[Info]
Dir=G:\Downloads-1\Музыка
Files=mp3
Где Dir - полный путь к папке с муз. файлами (по умолчанию будет искать в своей папке), Files - расширение муз. файлов (по умолчанию будет искать mp3). Все значения оставил свои, поменяйте на нужные Вам.

Это то, что я хотел увидеть. Большое спасибо. Жаль что не вижу никаких плюсиков для повышения репутации. :IL_AutoIt_1:
 
Верх