Всем привет! Давно ничего не писал. Хочу поделиться найденным, на просторах интернета, способом воспроизведения звука. Но обо всем по порядку.
Я часто делаю воспроизведение звука в 1С, когда стоит вопрос о сканировании штрих-кодов, чтобы подтвердить факт добавления товара в документ, или сообщить об ошибке. Эта необходимость возникла при большом потоке товаров и работе в терминальном режиме со сканерами через эмуляцию клавиатуры. Дело в том, что из-за проблем с задержками, например WiFi, сканированный код может доходить с задержками до двух секунд, и драйвер некорректно распознает код. Если никак не сообщать об этом менеджеру, то в потоке товаров они не замечают, что товар не был добавлен в документ.
Собственно никогда проблем, с воспроизведением звуков, у меня не возникало. Я использовал встроенный в Windows плеер mplay32.exe и скрипты WScript. Однако в новых версиях Windows этого плеера нет, копирование его ни к чему хорошему не приводит, приходится полностью отключать защиту на уровне пользователей и другие сложности с ошибкой 0x80070002 при работе в терминале на Windows Server 2008 R2.
Были опробованы варианты с проигрыванием через ActiveX или в поле HTML документа. С ними проблема в том, что звук не воспроизводится, если форма с полем не видна. А мне надо звук воспроизводить фоном. Вставлять ActiveX на каждую форму работающую с штрих-кодом не вариант.
Наконец, решение было найдено, простое и 100% работающее. Проверено на Windows 7/2008R2:
oVoice = Новый COMObject(«SAPI.SpVoice»);
oSpFileStream = Новый COMObject(«SAPI.SpFileStream»);
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();
Для 1С 7-ки:
oVoice = СоздатьОбъект(«SAPI.SpVoice»);
oSpFileStream = СоздатьОбъект(«SAPI.SpFileStream»);
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();
Visual Basic (Excel, Word и т.п.)
Dim oVoice As Object
Dim oSpFileStream As Object
Set oVoice = CreateObject(«SAPI.SpVoice»)
Set oSpFileStream = CreateObject(«SAPI.SpFileStream»)
oSpFileStream.Open ПутьДоФайла
oVoice.SpeakStream oSpFileStream
oSpFileStream.Close
Проверял на WAV файлах, на счет mp3 сказать не могу, не тестировал.
Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:
oVoice.Speak(«Hello!»);
уже есть публикация по SAPI.SpVoice, и, по-моему, даже не одна
1, Все верно. Но в этих публикациях ничего не сказано про воспроизведение WAV файлов, только про говорилку…
Все таки «Новый COMObject» и «без ActiveX» — взаимоисключающие параграфы.
Я бы «без ActiveX» убрал из названия публикации.
А то такое чувство, что повелся на «без голоданий и диет», но понял, что чудес не бывает.
Клево!!!
Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:
oVoice.Speak(«Hello!»);
Что напишешь — то комп и скажет????
(4) yuraos, а что в этом сверхординарного? ещё под DOS, помню, была прога, принимающая с ком.строки текст, и озвучивающая его на PC Speaker 🙂
(4)
А русский язык понимает? И в частности не нормативную лексику???
А то я нарулю в 1С-ке всяких проверок,
если юзер чё не то нажмет —
— она его тремя буквами и тремя этажами!!!!!
Нет, на нынешней работе не прокатит — тогда придется на все компы колонки покупать…
Фин.директор — удавится.
Он и так всех заставил печатать договора с двух сторон печатать,
не взирая на замяте бумаги и повышенный износ принтеров.
;))))
(2) zsrg, ну дык есть же оф.описание объектной моделиhttp://msdn.microsoft.com/en-us/library/ms722561%28v=vs.85%29.aspx
(3) orefkov, Новый COMObject прямого отношения к ActiveX не имеет, но раз смущает, то уберу 🙂
(6) yuraos,
она и английский-то понимает с трудом, куда уж русский 🙂
(6) yuraos, у меня русский не держит, на Windows Server, только по английски. Но у меня просто русский MUI установлен. Возможно на полной русской версии и заговорит по русски. Должен, по идее, так как говорилка встроена для поддержки людей с ограниченными возможностями.
(9)как бы имеет. ActiveX суть ком сервер, просто реализующий в довесок пару дополнительных интерфейсов.
(2) zsrg, Шпарит WAV-ки как миленький
Проверил. WAV воспроизводит. MP3 — нет. Что-то смешное говорит.
Не удивительно. WAV родной форматы винды, а mp3 уже расширение кодека для мультимедиа плеера.
Так чисто для прикола, наверное можно поюзать, но в реальных базах врядли.
Говорилку пользователи отключают или сразу или максимум через день — мешает работать.
Звуковые файлы можно проигрывать
ЗапуститьПриложение(ПутьДоФайла)
и не надо думать какой виндовс, какой формат файла …
А вот подать сигнал (не работающая почему-то нигде и никогда Сигнал()) я предпочитаю баяном. Например:
Баян=CreateObject(«DynamicWrapper»);
Баян.Register(«KERNEL32.DLL», «Beep», «i=ll», «f=s», «r=l»);
Баян.Beep(330*4,300);
Баян.Beep(494*4,200);
Работает тоже в любом виндовсе, звучать будет через все, что сможет, даже через динамик системного блока …
Не полифония, конечно, но можно довольно затейливые рулады воспроизвести …
(15) {Форма.Форма.Форма(3,6)}: Процедура или функция с указанным именем не определена (CreateObject)
Баян=<<?>>CreateObject(«DynamicWrapper»); (Проверка: Толстый клиент (обычное приложение))
(16) Aleks1973, Забудь про снеговик …
(4) yuraos,
А то! Сейчас такие студенты пошли, что ого-го! Что напишут на русском — то комп и выполняет.
Без дураков.
(9) zsrg,
Браво!
БравО!!!
А к чему COM, реализованный в 1С, имеет отношение?
Автор, а что «опустил», что этот «SAPI.SpVoice» должен быть установлен прежде всего?
И, наконец, «решение простое и 100% работающее» — это воспроизведение звуковых файлов посредством открытия через 1С.
И как в анекдоте с динозавром: «50 на 50 — либо заиграет (если есть драйвера и звуковуха), либо нет» 🙂
На сервере Управляемые Формы не воспроизводить звук Выдает ошибку что oSpFileStream.Open не определено
Все правильно и не должно воспроизводить. Звук должен воспроизводиться на клиенте, а не на сервере!
(20) zsrg,
Скрипт = Новый COMОбъект(«MSScriptControl.ScriptControl»);
Скрипт.Language=»vbscript»;
Скрипт.AddCode(»
|Function Main()
|Set oVoice = CreateObject(«»SAPI.SpVoice»»)
|set oSpFileStream = CreateObject(«»SAPI.SpFileStream»»)
|oSpFileStream.Open «»D:Muz1.wav»»
|oVoice.SpeakStream oSpFileStream
|End Function»);
Скрипт.Run(«Main»);
Так работает на сервере но вопрос как записать в место жесткой привязки к пути значение например реквизита или константы!?
Если я правильно понял:
|oSpFileStream.Open «»»+ПутьДоФайла+»»»
Отлично!
Хоть и выдает ошибку
Ошибка при вызове метода контекста (SpeakStream): Произошла исключительная ситуация (0x80070057)
oVoice.SpeakStream(oSpFileStream);
по причине:
Произошла исключительная ситуация (0x80070057)
но звук воспроизводит!
Но есть одно «но». Как сделать, чтобы 1С не ждала окончания воспроизведения звука, а продолжала работать?
Как, например, через WshShell.Run(,0,0) это замутить?
(3)orefkov,
http://infostart.ru/public/248770/
Без ActiveX можно через html bgsound
внёс
в процедуру.
Вызов ее, как написано выше, производится только &НаКлиенте
Почему-то вызов этой процедуры (&НаКлиенте Посигналить();) не производится: программа не находит ее. А из других клиентских — пожалуйста.
Столкнулся с тем, что при выполнении кода выходила ошибка 0x80045003
Решение: формат звукового файла .wav обязательно должен быть mono, а не stereo.
Конвертировали с помощью плагина AIMP.
(23) Хороший вопрос! — я сделал так:http://infostart.ru/public/655524/
Благодарю, чувак! Сэкономил кучу нервов и времени коллеге. Плюс 1 в карму.
(15)
Для восьмерки:
DW = Новый COMОбъект(«DynamicWrapper»);
DW.Register(«KERNEL32.DLL», «Beep», «i=ll», «f=s», «r=l»);
DW.Beep(330*4,300);
DW.Beep(494*4,200);
(26) Не факт. Стерео тоже может быть, но надо формат семплов устанавливать в 16 бит