310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
1 | |
Синхронное воспроизведение через mciSendString13.08.2014, 18:51. Показов 3165. Ответов 32
Метки нет Все метки)
(
Для Wav файлов есть sndPlaySound и константы. Иногда нужно выстраивать озвучиваемые файлы в очередь, а в моем случае в этой очереди еще и озвучка текста. Для Wav очень удобно при этом пользоваться SND_SYNC. Но понадобилось мне воспроизводить еще MP3. Выбрал вариант с mciSendString. Но воспроизводит асинхронно, возвращая управление сразу, не дожидаясь окончания звучания. Может кто знает, как придержать дальнейшее выполнение кода, пока файл полностью не проиграет?
0
|
|
13.08.2014, 18:51 | |
Ответы с готовыми решениями:
32
Воспроизведение mp3-файлов через VB
MciSendString и Windows 10 Толковые описания по mciSendString |
Модератор
|
|
13.08.2014, 19:15 | 2 |
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
13.08.2014, 23:17 [ТС] | 3 |
Да, думаю что можно гонять цикл с задержкой, и постоянно спрашивать статус. А нельзя ли как с WAV файлами и sndPlaySound? тут можно просто выбрать синхронный или асинхронный режим.
0
|
Модератор
|
||||||
13.08.2014, 23:28 | 4 | |||||
![]() Решение
Можно - есть флаг wait:
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
14.08.2014, 00:20 [ТС] | 5 |
Да вот пробовал так, и поимел одни тормоза ))
Попробую еще поиграться, но наверное придется гонять цикл, или искать что то другое для mp3 Добавлено через 49 минут ключ "wait" лишь притормозил сам процесс mciSendString, и поглючил на это время форму (окно моей программы с кнопками и прочей фигней), но сам код vb продолжал исполняться. Более того, следующее задание (файл) для mciSendString был поставлен в очередь (но только именно для него). В общем получилась гадость. Задача такая: Есть три требования: 1. Озвучивать переданный текст. Проговаривать его с помощью движа. 2. проигрывать Wav файлы 3. проигрывать mp3 файлы Все это добро ставить в очередь, чтобы одно не перебивало другое. Для спича у меня есть dll с синхронным восроизведением. Тоесть когда я отправляю что то проговариватья, дальше код не движется, пока предложение не закончиться. Когда отправляю wav файл - тоже самое по средствам Global Const SND_SYNC = &H0 Звук воспроизводится синхронно, и функция не возвращает управления до окончания его проигрывания. Как быть с MP3 я пока не разобрался
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
14.08.2014, 23:40 [ТС] | 7 |
А вот и не тоже! Да, действительно, с добавлением слова "wait", следующая строка исполняется только после окончания звучания файла. НО!
В моей проге первый запущенный экземпляр становится сервером, и висит пока его не закроешь. Вторые экземпляры программы просто передают параметры командной строки (звуковые файлы или текст на озвучку) первому экземпляру по средствам SendMessage Lib "user32.dll". Другими словами есть обработчик событий, который срабатывает по приему сообщения. А вот, если в это время проигрывался mp3 файл, даже не смотря на добавленный "wait", все равно начнется обработка. А в случае с WAV, sndPlaySound и Const SND_SYNC, даже если за время звучания по средствам SendMessage отправить хоть 10 команд, все они встанут в очередь. Обработка не начнется пока не закончится воспроизведение файла. Вот как то так.
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
||||||
14.08.2014, 23:50 [ТС] | 9 | |||||
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
14.08.2014, 23:57 [ТС] | 11 |
Спасибо! буду благодарен. Сейчас соберу все в кучку и прикреплю
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
15.08.2014, 00:12 [ТС] | 12 |
Вот весь проект. Там все по модулям разложено. Думаю нет смысла выдирать из него кусок, чтобы потом пытаться заставить его работать. Все что касается отправки и приема сообщений находится только в модуле SendMessage. При запуске на другом компе скорее всего нужно будет выбрать другой движек синтеза речи, т.к. прога помнит последний выбор.
0
|
Модератор
|
||||||
15.08.2014, 01:15 | 13 | |||||
Что за кривой способ воспроизведения? Это ужас!
Все воспроизводится последовательно. Во-первых, нужно закрывать файл после воспроизведения; во-вторых нужно давать псевдонимы файлам, если они у тебя будут идти в списке, когда очередной с таким же именем еще играется:
Сейчас у тебя, запустив 100 приложений для воспроизведения 100 звуков, последний будет ждать, пока не проиграются все предыдущие 99 файлов (в памяти будут сидеть 100 процессов).
1
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
15.08.2014, 01:24 [ТС] | 14 |
Спасибо за замечания! open - play - close уже вычитал и сделал. А вот про рандомные псевдонимы это фишка. Сейчас добавлю. По поводу освобождения вызывающего процесса это да. Так было бы лучше. Но в очереди кроме звуковых файлов есть еще и текст на озвучку. Так что не думаю что тут это можно обыграть. Да и такой очереди у меня не бывает. Максимум 2-3 вызова. Но конечно надо делать правильно.
К стати, раз уж смотрел весь проект, может подскажешь как сделать выбор звуковой карты? У меня тут только список строится, и показывает которая в винде выбрана основной. Изменить увы нельзя. А для меня это очень важно.
0
|
Модератор
|
|
15.08.2014, 02:03 | 15 |
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
15.08.2014, 02:20 [ТС] | 16 |
Если правильно понял, то на форме требуется добавить контрол с именем MMControl1. А если его нет, то как быть? Для проигрывания файлов он мне не был нужен.
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|||||||||||
15.08.2014, 03:11 [ТС] | 18 | ||||||||||
Пока не получилось.
Нашел обсуждение, где в самом начале получают
Думаю что такой вариант должен бы работать. Но получаю The command failed.
0
|
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
|
|
16.08.2014, 01:18 [ТС] | 20 |
Ошибки в коде нет, но функция mciSendCommand = MMSYSERR_NOERROR, а именно rc=274
Судя по описанию вот оно: http://stackoverflow.com/quest... ing-an-mp3 Сейчас спать, а потом путем переведу эту страничку. Истина где то рядом )) Но в любом случае радоваться не стоит. Этот способ лишь заставит играть звуковые файлы на нужной карте. Но ничем не поможет в синтезе речи. Там своя библиотека, и выбора карты нет. Одно без другого бесполезно в программе, но весьма поучительно для себя. Так что будет рыть. Добавлено через 26 минут Вообще я ранее даже и не читал про выбор устройства вывода для mciSendCommand, потому что искал как это сделать для своего приложения в общем. Т.к. в программе может быть куча разных функций, которые воспроизводят звуки. Не знаю есть ли такой способ, но я ничего не нашел.
0
|
16.08.2014, 01:18 | |
Помогаю со студенческими работами здесь
20
Воспроизведение mp3 (mciSendString) Объект WindowsMediaPlayer - синхронное воспроизведение mciSendString() необходимо чтобы воспроизведение звука постоянно повторялась Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |