Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
VIsuaL_DG
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 26
1

Определить статус воспроизведения файла

05.07.2014, 16:19. Просмотров 1864. Ответов 34
Метки нет (Все метки)

Здравствйуте!

Опишу ситуацию:

У меня есть программа в которой для воспроизведения аудио я использую библиотеки winmm.dll:

Visual Basic
1
Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
а для воспроизведения собственно аудиофайла команду:
Visual Basic
1
Call mciExecute("play 1.mp3")
Вопрос:

Как по нажатии на Command1 узнать играет ли 1.mp3 или уже воспроизведение завершено?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2014, 16:19
Ответы с готовыми решениями:

Сделать зацикливание воспроизведения звукового файла
Здравствуйте! Работаю в Visual Basic 6. Работая со звуком столкнулся с...

Как определить статус службы?
Добрый день всем. Подскажите пожалуйста, как определить статус службы? Знаю,...

Скорость воспроизведения музыки
Подскажите пожалуйста !!! Как воспроизводить музыку с помощью элемента...

Контрол для воспроизведения видео
Люди дайте кто-нибудь контрол для воспроизведения видео plz...

Закрыть wmplayer после воспроизведения
Добрый день! Помогите разобраться Фрагмент кода: sPaths...

34
Pro_grammer
Модератор
6157 / 2239 / 441
Регистрация: 24.04.2011
Сообщений: 3,964
Записей в блоге: 10
05.07.2014, 18:48 2
Цитата Сообщение от VIsuaL_DG Посмотреть сообщение
узнать играет ли 1.mp3 или уже воспроизведение завершено?
Можно с помощью mciSendString "status " узнать общую длину - length и сравнить с текущим статусом position
0
VIsuaL_DG
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 26
07.07.2014, 09:37  [ТС] 3
А почему бы вам уважаемый не пояснить ответ свой на примере?!
Сколько не пытался все таки не разобрался с кодом. Как реализовать то?

mciSendString наверно еще как-то надо объявлять сначала?!
0
Pro_grammer
Модератор
6157 / 2239 / 441
Регистрация: 24.04.2011
Сообщений: 3,964
Записей в блоге: 10
07.07.2014, 18:56 4
Цитата Сообщение от VIsuaL_DG Посмотреть сообщение
А почему бы вам уважаемый не пояснить ответ свой на примере?
Так я и вашего примера - кода программы не видел. А писать всё самому - уж увольте!
Цитата Сообщение от VIsuaL_DG Посмотреть сообщение
mciSendString наверно еще как-то надо объявлять сначала?!
Обязательно объявлять!
0
VIsuaL_DG
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 26
07.07.2014, 19:36  [ТС] 5
Какой то сложный вы человек, чес слово...))

Опишу подробнее:
В событие FormUnload хочу вписать код который проверяет играет ли сейчас аудиофайл и если играет то завершить его а если нет то просто End

PureBasic
1
If аудиофайл играет then Call mciExecute("close 1.mp3") else unload end
0
VIsuaL_DG
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 26
07.07.2014, 19:39  [ТС] 6
Есть еще один вопрос не по теме!

Опишу подробнее:

В программе исползую:

PureBasic
1
2
Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Call mciExecute("play 1.mp3")
В событие FormUnload хочу вписать код который проверяет играет ли сейчас аудиофайл и если играет то завершить его а если нет то просто End

PureBasic
1
If [U][B]играет[/B][/U] then Call mciExecute("close 1.mp3") else unload end
Помогите найти решение
0
Антихакер32
Заблокирован
07.07.2014, 19:46 7
Надо промониторить процесс и его поток
ну это через API делается
0
Pro_grammer
Модератор
6157 / 2239 / 441
Регистрация: 24.04.2011
Сообщений: 3,964
Записей в блоге: 10
07.07.2014, 20:10 8
Лучший ответ Сообщение было отмечено VIsuaL_DG как решение

Решение

Цитата Сообщение от VIsuaL_DG Посмотреть сообщение
В событие FormUnload хочу вписать код который проверяет играет ли сейчас аудиофайл и если играет то завершить его а если нет то просто End
Для этого нет необходимости узнавать, играет файл или нет.
Можно просто закрыть все открытые файлы
Декларация:
Visual Basic
1
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Использование
Visual Basic
1
2
3
Private Sub Form_Unload(Cancel As Integer)
mciSendString "close all", 0, 0, 0
End Sub

Общая продолжительность файла mp3 ( strFileToPlay путь и имя файла в кавычках напр. strFileToPlay = Chr(34) & Text1.Text & Chr(34))
Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim lTotalTime As Long
Private Sub TotalTime()
    Dim TotalTime As String * 128
    mciSendString "open " & strFileToPlay & " type MPEGVideo", 0, 0, 0
    mciSendString "PLAY MP3 wait", "", 0, 0
    mciSendString "set " & strFileToPlay & " time format ms", TotalTime, 128, 0&
    mciSendString "status " & strFileToPlay & " length ", TotalTime, 128, 0&
    Debug.Print "t=" & TotalTime
    lTotalTime = Val(TotalTime)
End Sub
Если " length " заменить на " position " то текущая позиция.
2
The trick
Модератор
7384 / 2646 / 759
Регистрация: 22.02.2013
Сообщений: 3,824
Записей в блоге: 76
07.07.2014, 20:29 9
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от Антихакер32 Посмотреть сообщение
Надо промониторить процесс и его поток
ну это через API делается
Что-что? Можно примерчик, хотя бы в псевдокоде?

По теме. Можно (и это правильней) уведомлять окно о воспроизведении и ловить сообщение MM_MCINOTIFY.
Также можно проверять статус девайса:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Option Explicit
 
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringW" (ByVal lpstrCommand As Long, ByVal lpstrReturnString As Long, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
 
Private Sub Command1_Click()
    Dim ret As String
    
    ret = Space(255)
    
    mciSendString StrPtr("status Music mode"), StrPtr(ret), Len(ret), 0
    
    If StrComp(Left$(ret, 7), "playing", vbTextCompare) = 0 Then
        MsgBox "Г…Г№ГҐ ГЁГЈГ°Г*ГҐГІ"
    Else
        MsgBox "ГЋГ±ГІГ*Г*îâëåГ*Г®"
    End If
End Sub
 
Private Sub Form_Load()
    Dim ret     As Long
    Dim file    As String
    
    file = Chr$(34) & "D:\Òîëèê\ÌóçûêГ*\ZX-Spectrum\ZX Spectrum - Lyra 2 Megademo (1991).mp3" & Chr$(34)
    ret = mciSendString(StrPtr("open " & file & " alias Music"), 0, 0, 0)
    mciSendString StrPtr("play Music"), 0, 0, 0
    
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    mciSendString StrPtr("close Music"), 0, 0, 0
End Sub
Добавлено через 2 минуты
Pro_grammer,
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Visual Basic
1
... Alias "mciSendStringA" ...
Так лучше не декларировать.
1
Pro_grammer
Модератор
6157 / 2239 / 441
Регистрация: 24.04.2011
Сообщений: 3,964
Записей в блоге: 10
07.07.2014, 20:36 10
Цитата Сообщение от The trick Посмотреть сообщение
Так лучше не декларировать.

Не по теме:

Вот мне раеально ваши с Хакером заморочки по поводу юникода по барабану!
И уж тем более там, где это работает без всяких W

0
VIsuaL_DG
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 26
07.07.2014, 20:48  [ТС] 11
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Можно просто закрыть все открытые файлы
А если воспргоизведение уже завершено то возникает ошибка вне программы Visual Basic. То есть ошибка в Winm.dll а перехватить его не удается...
0
The trick
07.07.2014, 20:51
  #12

Не по теме:

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Вот мне раеально ваши с Хакером заморочки по поводу юникода по барабану!
Тебе может и по барабану, а пользователю нет. И это не мои заморочки, а давно уже стандарт.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И уж тем более там, где это работает без всяких W
Да ну? Ну проиграй с помощью своего кода эту песню. И таких исполнителей я тебе могу назвать огромное количество. Я бы не писал такое если бы не был в этом уверен.
PS. Я тебе написал без всяких придирок, просто порекомендовал, не нужно злиться на рекомендации

0
Антихакер32
Заблокирован
07.07.2014, 21:24 13
Я бы вообще не заморачивался тоже..
вызвал бы с помощью Shell плейер который по умолчанию в системе для MP3
и мониторил бы в таймере его движения, после мог-бы либо закрывать его
немедленно, либо дождаться его окончания-мелодии(или фильма) и закрыть..
а если музыка в фоне программы нужна, то можно воспользоваться
sndPlaySound

Visual Basic
1
2
3
4
5
6
7
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
 
Private Sub Command1_Click()
'    sndPlaySound "notify", 1
'    sndPlaySound "Вход в Windows XP", 1
    sndPlaySound "tada", 1
End Sub
Добавлено через 8 минут
К тому-же можно еще и посылать сообщения вызванным плейерам
в интерн. есть примеры, через PostMessage

Добавлено через 4 минуты

Не по теме:

позже, приколю своим примером пользователей VBA

0
Pro_grammer
Модератор
6157 / 2239 / 441
Регистрация: 24.04.2011
Сообщений: 3,964
Записей в блоге: 10
07.07.2014, 21:31 14
Цитата Сообщение от The trick Посмотреть сообщение
Да ну? Ну проиграй с помощью своего кода эту песню.
Определить статус воспроизведения файла

Так то я не играть этот файл собирался, а длительность проверять.
Длительность правильно определилось. декларацию сам видишь.
А на счет "давно стандарт" , да, для современных ЯП, где с бубном не надо прыгать. А в VB6 даже контролы стандартные юникод не поддерживают, вот вам весь стандарт.
0
The trick
Модератор
7384 / 2646 / 759
Регистрация: 22.02.2013
Сообщений: 3,824
Записей в блоге: 76
07.07.2014, 22:03 15
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Так то я не играть этот файл собирался, а длительность проверять.
Это не важно, его все равно нужно открыть исходя из твоего кода.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
декларацию сам видишь.
Ты его не сможешь открыть, если ты конечно не переименовывал файл. Скинь проект, у меня mciSendString возвращает MCIERR_FILE_NOT_FOUND:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Option Explicit
 
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
 
Private Sub Form_Load()
    Dim file    As String
    Dim FSO     As New FileSystemObject
    Dim fld     As Folder
    Dim fle     As file
    Dim ret     As Long
    
    Set fld = FSO.GetFolder("D:\Temp\Temp")
    
    For Each fle In fld.Files
        
        file = Chr$(34) & fle.Path & Chr$(34)
        
        ret = mciSendString("open " & file & " alias Music", vbNullString, 0, 0)
        ret = mciSendString("play Music", vbNullString, 0, 0)
        
    Next
    
    file = Dir("D:\Temp\Temp\")
    file = Chr$(34) & "D:\Temp\Temp\" & file & Chr$(34)
    
    ret = mciSendString("open " & file & " alias Music", vbNullString, 0, 0)
    ret = mciSendString("play Music", vbNullString, 0, 0)
    
End Sub
Как ни старайся, ты не сможешь открыть файлы, в которых есть символы не содержащиеся в текущей кодовой странице ANSI. Вот обрати внимание на статус операции. Но стоит мне переименовать è в e (в самом файле), так все начинает работать.
1
Миниатюры
Определить статус воспроизведения файла  
The trick
Модератор
7384 / 2646 / 759
Регистрация: 22.02.2013
Сообщений: 3,824
Записей в блоге: 76
07.07.2014, 22:14 16
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А на счет "давно стандарт" , да, для современных ЯП, где с бубном не надо прыгать.
Вообще-то юникод родная кодировка VB6. Все строковые функции работают с юникодом. Стандартные контролы, стандартные файловые функции и еще по мелочи, да, не работают, но тут этого и не надо.

Добавлено через 2 минуты
Цитата Сообщение от Антихакер32 Посмотреть сообщение
Я бы вообще не заморачивался тоже..
В твоей компетентности никто не сомневается.
0
Pro_grammer
Модератор
6157 / 2239 / 441
Регистрация: 24.04.2011
Сообщений: 3,964
Записей в блоге: 10
07.07.2014, 22:37 17
Цитата Сообщение от The trick Посмотреть сообщение
Как ни старайся, ты не сможешь открыть файлы, в которых есть символы не содержащиеся в текущей кодовой странице ANSI.
Ну не знаю, у меня длительность определяет, я скрины не подделываю
Смотри сам:
0
Вложения
Тип файла: zip mp3Длительность.zip (1.9 Кб, 5 просмотров)
The trick
Модератор
7384 / 2646 / 759
Регистрация: 22.02.2013
Сообщений: 3,824
Записей в блоге: 76
07.07.2014, 23:06 18
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Смотри сам:
Смотрю
0
Миниатюры
Определить статус воспроизведения файла  
Pro_grammer
Модератор
6157 / 2239 / 441
Регистрация: 24.04.2011
Сообщений: 3,964
Записей в блоге: 10
08.07.2014, 07:52 19
Да нету у меня таких символов!
Определить статус воспроизведения файла


Я даже не знаю, как у меня стандартный проводник выглядит, пользуюсь всегда Total Commander, он с архивами работает как с обычными папками. Внутри архива и на диск С:\ распаковал файл именно с теми символами, которые ты видишь на скрине.
Может потому и нет у меня твоих проблем с кодировками и несовместимостью? Рекомендую.
0
The trick
Модератор
7384 / 2646 / 759
Регистрация: 22.02.2013
Сообщений: 3,824
Записей в блоге: 76
08.07.2014, 10:17 20
Цитата Сообщение от Pro_grammer Посмотреть сообщение
на диск С:\ распаковал файл именно с теми символами, которые ты видишь на скрине.
Значит это минус Total Commander'у, интересно как он назовет эти файлы? Я удивляюсь тому, что ты не понимаешь что это неправильно. Программа должна давать такие имена файлов, какие у них есть на самом деле, иначе это может нарушить работу программы. Я очень часто работаю с программами на языках отличных от рус/eng, и часто они не работают, т.к. написаны без поддержки юникода - В ПОМОЙКУ ИХ. Тоже самое будет и с программами, которые не работают с юникодом, если их запустить в локали отличной от нашей.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
твоих проблем
Еще раз - это не мои проблемы, а любого пользователя, неужели ты не понимаешь этого? Обычный пользователь пользуется проводником в большинстве случаев и знать не знает про Total Commander.
В чем вообще проблема вместо Call func (String), написать Call func (StrPtr(String))? Или это считается граблями?
1
Вложения
Тип файла: rar Orbital Resonance.rar (5.66 Мб, 5 просмотров)
Тип файла: rar Трек.rar (7.01 Мб, 5 просмотров)
08.07.2014, 10:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 10:17

Статус служб в Windows
Как получить статус (запущена/остановлена) определенной службы в Windows ?

Прогрессбар в статус баре (как в IE)
сабж

Как узнать статус принтера?
Пожалуйста, помогите, кто может...! Имеется документ, который надо напечатать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru