А знаете ли Вы способ, который не загружает с диска этот файл всякий раз при проигрывании? А делает это один раз в начале работы скрипта
Пользователь
Сообщений: Регистрация: 30.01.2015
06.03.2024 08:14:52
Цитата
funduk написал: А знаете ли Вы способ, который не загружает с диска этот файл всякий раз при проигрывании? А делает это один раз в начале работы скрипта
Знаю, но написал специально эту тему с целью дать вариант простого решения без написания каких-либо вспомогательных функций. ------------------- Какой смысл усложнять решение , если загрузка этого файла займет микросекунды, а возможно ОС не будет грузить ее каждый раз снова.
Пользователь
Сообщений: Регистрация: 30.01.2015
06.03.2024 08:20:31
вот вариант многократного проигрывания звука с однократной загрузкой файла с диска
Код
local x="C:/Windows/Media/Alarm10.wav"
for j=1,10 do
local s="powershell -c (New-Object Media.SoundPlayer "..x..").PlaySync();"
os.execute(s);
end
играет 10 раз файл "C:/Windows/Media/Alarm10.wav"
Пользователь
Сообщений: Регистрация: 30.01.2015
06.03.2024 08:21:46
Код
local x="C:/Windows/Media/Alarm10.wav"
local s="powershell -c (New-Object Media.SoundPlayer "..x..").PlaySync();"
for j=1,10 do os.execute(s); end
Пользователь
Сообщений: Регистрация: 30.01.2015
06.03.2024 09:21:25
Пардон, ошибся В данной теме написан вариант запуска приложения плеера из командной строки ---------------------------- Т е загрузка файла звука делается приложением плеера. Т е сначала грузится приложение плеер а оно грузит исполняемый файл. --------------------- Основное время затрачивается на загрузку приложения плеер. Но плюсом такого решения является то, что плеер работает в своем потоке. ---------------------- Вариант
Код
local x="C:/Windows/Media/Alarm10.wav"
local s="powershell -c (New-Object Media.SoundPlayer "..x..").PlaySync();"
for j=1,10 do os.execute(s); end
Лишь упрощает написание командной строки но не исключает многократную загрузку ================= Чтобы загрузка была однократной надо использовать функцию на СИ и вызывать ее на исполнения. ----------------------- При этом если файл длинный, то воспроизведение звука будет тормозить скрипт. ------------------- Либо надо делать или брать готовую функцию исполняющую в отдельном потоке. ----------------- В инете есть монго решений.
Пользователь
Сообщений: Регистрация: 30.01.2015
06.03.2024 09:25:35
есть решение
Код
function PlaySoundFile(file_name)
w32.mciSendString("CLOSE QUIK_MP3")
w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
w32.mciSendString("PLAY QUIK_MP3")
end
Но оно делает тоже самое что и мой вариант, но для этого делается спец функция на СИ т е в этом решении вызова из командной строки, но через СИ.
Пользователь
Сообщений: Регистрация: 30.01.2015
06.03.2024 09:35:56
Есть еще они способ о котором возможно мало кто знает. Я использую такое решение в своих умных устройствах и для отладки звуковых команд для них на луа. --------------------------- Берем модуль внешнего плеера (цена вопроса 1 доллар) подключаем его к USB и загружаем на него свои звуковые файлы . На выход модуля можно подключить динамики. Есть вариант модуля с памятью на чипе флеш либо с внешней флеш. Число таких файлов может быть тысячи В луа используется функция вывода на виртуальнуй UART. Выводим код любого файла и модуль его играет, а скрипт работает дальше. Время вывода команды на модуль несколько мкс. Кроме музыки, в модуле можно синтезировать предложения .
Пользователь
Сообщений: Регистрация: 27.12.2022
06.03.2024 14:04:59
Цитата
nikolz написал: Кроме музыки, в модуле можно синтезировать предложения .
Круть. На след. этапе можно сделать виртуальную дикторшу. А для простых смертных у mciSendString предусмотрено проигрывание звука с заданного смещения и заданной длительности.
написал: Кроме музыки, в модуле можно синтезировать предложения .
Круть. На след. этапе можно сделать виртуальную дикторшу. А для простых смертных у mciSendString предусмотрено проигрывание звука с заданного смещения и заданной длительности.
Так Вы ничего и не поняли. Поясняю. В начале темы написана одна строчка как воспроизвести звуковой файл. -------------------- Тоже самое что и ваша dll на основе устаревшей функции mciSendString. -------------- Т е не надо никаких dll для этого , понятно?
Пользователь
Сообщений: Регистрация: 27.12.2022
06.03.2024 19:48:44
Цитата
nikolz написал: Т е не надо никаких dll для этого , понятно?
Из моей темы, где я привёл свой пример на основе w32, было видно, что мне это понятно... И мне почему-то кажется, что SoundPlayer не может воспроизводить mp3.
Пользователь
Сообщений: Регистрация: 27.12.2022
06.03.2024 20:21:56
Мне ваш пример с os.execute и 10-кратным появлением окна цмд перекрыл все стаканы... А если бы у меня в это время пошли сделки? Представляете свою материальную отвественность?
Пользователь
Сообщений: Регистрация: 27.01.2017
07.03.2024 09:45:12
Цитата
Serge123 написал: Мне ваш пример с os.execute и 10-кратным появлением окна цмд перекрыл все стаканы... А если бы у меня в это время пошли сделки? Представляете свою материальную отвественность?
Поэтому такой вариант плох. mciSendString - лучше. Либо наприсать свою dll с неустаревшей командой. Можно даже параллельно проигрывать звуки, если использовать правильную команду.
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 09:54:20
Цитата
Nikolay написал: Можно даже параллельно проигрывать звуки, если использовать правильную команду.
Спасибо, а правильная это какая? У меня создалось впечатление, что mci это не умеет.
написал: Можно даже параллельно проигрывать звуки, если использовать правильную команду.
Спасибо, а правильная это какая? У меня создалось впечатление, что mci это не умеет.
вариант воспроизведения mp3 файлов скачайте из интернета прогу mpg123.exe
Код
local x="D:/nks/test.mp3" -- звуковой файл
os.execute("D:/mpg123/mpg123.exe "..x)
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 10:00:38
Ещё для смешивания звуков на форумах советовали использовать сторонние звуковые биб-ки или ДиректХ (ДиректСаунд).
Пользователь
Сообщений: Регистрация: 30.01.2015
07.03.2024 10:04:23
Цитата
Serge123 написал: Ещё для смешивания звуков на форумах советовали использовать сторонние звуковые биб-ки или ДиректХ (ДиректСаунд).
могу выложить dll которая может воспроизводить WAV файлы асинхронно и синхронно из памяти и из файлов.
Пользователь
Сообщений: Регистрация: 27.01.2017
07.03.2024 10:21:39
Цитата
Serge123 написал: Спасибо, а правильная это какая? У меня создалось впечатление, что mci это не умеет.
PLAY
Все указано в документации Можно даже проигрывать кусок из файла.
Если проигрывается WAV, то ничего не надо делать более. Если другой формат, то должна быть поддержка. MP3, кажется, тоже проигрывает без доп. усилий.
У меня оповещения на сработавший ордер иногда используются. Если бы это было с блокировкой через команду OPEN или с показом окна терминала, то при одновременном срабатывании нескольких ордеров будет печаль.
Программеров интересуют исходники, чтобы не грузить зоопарк посторонних длл (по одной для каждого случая)...
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 12:41:36
Цитата
Nikolay написал: Можно даже проигрывать кусок из файла.
Я на те страницына сайте МС смотрел, не нашёл, как смешивать звуки. Я сейчас сделал аналог того, что у меня игралось в dll:
Код
#include <stdio.h>
#include <windows.h>
#include <Mmsystem.h>
int main()
{ if (!mciSendString("OPEN C:\\Windows\\Media\\chord.wav TYPE MpegVideo ALIAS QUIK_MP3", NULL, 0, NULL)) puts("fail");
mciSendString("PLAY QUIK_MP3", NULL, 0, NULL);
return 0;
}
Не играет, выдаёт fail. Не пойму, почему это работает в dll для Квика. Такое впечатление, что в консольной программе mciSendString не работает. А у вас как? Транслировать командой
Т.е., методика такая: один раз выдаём команду OPEN и потом много раз только PLAY, а в OnStop можно выдать CLOSE waveaudio?
Но почему не получается играть файлы с пробелами, как в комментариях?? И почему в консольной программе это всё продолжает не работать???
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 14:57:53
В принципе, получился неплохой подарок к 8 Марта (а чем я хуже женщины?) Но неработоспособность в некоторых случаях омрачает предпраздничное настроение...
Пользователь
Сообщений: Регистрация: 27.01.2017
07.03.2024 15:03:16
Цитата
Serge123 написал: Хм, методом тыка убрал ALIAS, как было в w32, устройство взял waveaudio, и звуки стали смешиваться:
Программеров интересуют исходники, чтобы не грузить зоопарк посторонних длл (по одной для каждого случая)...
Она одна на все случаи
Пользователь
Сообщений: Регистрация: 30.01.2015
07.03.2024 15:06:40
размером в 28 КБайт
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 15:07:06
Для чего в Си и в Луа в путях ставят две обратных косых вместо оной прямой, ведь Виндовс в путях понимает одну прямую косую: C:/Windows/Media/Alarm09.wav?
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 15:20:21
Цитата
Nikolay написал: Чтобы брался путь с пробелами, необходимо путь обрамлять кавычками.
Тьфу ты, черти мелкомягкие: я так и подозревал, что такой костыль заработает:
Код
mciSendString("PLAY C:/Windows/Media/Windows Hardware Fail.wav type waveaudio", NULL, 0, NULL);
Явная ошибка в парсинге команды...
Сколько времени на эту ерунду потерял вместо того, чтобы что-то полкзное для себя сделать...
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 16:04:41
Опять ошибся: это другой файл игрался, просто я с него комментарии зачем-то убрал...
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 16:09:44
Короче, устройство waveaudio почему-то не играет файлы с пробелами, хоть тресни...
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 16:18:15
Вернее, дело не в звуковом устройстве: в упрощённом варианте команд файлы с пробелами не играются, а в той форме, что была у w32, как помню, они игрались.
Пользователь
Сообщений: Регистрация: 30.01.2015
07.03.2024 16:44:18
Цитата
Serge123 написал: Вернее, дело не в звуковом устройстве: в упрощённом варианте команд файлы с пробелами не играются, а в той форме, что была у w32, как помню, они игрались.
Выкладываю исходник на варианте mciSendString
Код
static int mciSS(lua_State*L){
mciSendString((char*)lua_tostring(L,1),0,0,0);
if (lua_gettop(L)>1)SleepEx(lua_tointeger(L,2),1);
return 0; }
позволяет воспроизводить файлы wav, MP3, повторять, делать паузу
Пользователь
Сообщений: Регистрация: 27.01.2017
07.03.2024 17:09:38
Зачем какие-то дополнительные знаки
PLAY "C:\\Windows\\Media\\Windows Hardware Fail.wav"
Все также как при работе с терминалом. Там тоже надо путь с пробелами обрамлять в кавычки. Весь путь, а не только часть.
Пользователь
Сообщений: Регистрация: 27.12.2022
07.03.2024 18:55:41
Цитата
nikolz написал: if (lua_gettop(L)>1)SleepEx(lua_tointeger(L,2),1);
Не понял, в чём здесь отличие от простого Sleep?
Цитата
Nikolay написал: Там тоже надо путь с пробелами обрамлять в кавычки. Весь путь, а не только часть.
Я в #31 обрамлял также часть пути, по-всякому пробовал, не работает! Если у вас работает, то покажите команду из Луа и из Си.
Рассказываю как просто сделать функцию для воспроизведения звука в различных форматах. Надо сделать на СИ dll для луа вот с такой функцией.
Код
static int mciSS(lua_State*L){ mciSendString((char*)lua_tostring(L,1),0,0,0); }
если кто-то не сможет ,пишите - выложу готовую dll. Далее у меня такая dll называется nks. Вызов функции в скрипте записан как nks.mciss ================= Поясняю как ее применять: =========== Чтобы воспроизвести файл в формате WAV надо открыть устройство с этим файлом так:
Код
local file="C:/Windows/Media/Alarm10.wav" -- звуковой файл
nks.mciss("open "..file.." alias MediaFile wait"); -- открыть устройство
Для воспроизведения содержимого файла пишем там , где хочется:
Код
nks.mciss("play MediaFile FROM 0 wait");
======================== Чтобы воспроизвести файл в формате MP3 надо сделать все тоже самое, но для этого файла Например у меня это файл "D:/nks/test.mp3"
Код
local file="D:/nks/test.mp3" -- звуковой файл
nks.mciss("open "..file.." alias MediaFile wait"); -- открыть устройство
Для воспроизведения содержимого файла пишем там, где хочется:
Код
nks.mciss("play MediaFile FROM 0 wait");
Опции : ---------------------------- Если Вам хочется запустить звук и не ждать, когда закончится, то уберите в последней команде "wait" ---------------------------- Если Вам хочется воспроизводить много различных звуков в разных местах скрипта, то в начале скрипта откройте все звуковые файлы и для каждого из них сделайте уникальное имя устройства. Его надо написать вместо "MediaFile" Для воспроизведения конкретного файла надо указать имя его устройства в команде воспроизведения вместо "MediaFile" ============== Желаю успешного прослушивания звуковых файлов.
Да, Вы правы. Команда Play не поддерживает команды с именами файлов, которые нельзя привести к короткому имени, т.е. с пробелами. Посмотрел внимательно на MCI. Он действительно старый.
Но работает в команде Open. Т.е. надо подавать две команды OPEN "C:\\Windows\\Media\\Windows Hardware Fail.wav" ALIAS SND1 PLAY SND1
Для остановки команда STOP SND1
Также такой подход будет означать, что после команды OPEN, в памяти сохранится ALIAS SND1. И повторно не надо уже открывать. Можно просто заново подать команду PLAY.
Пользователь
Сообщений: Регистрация: 20.03.2023
09.03.2024 05:25:20
Цитата
nikolz написал: Если Вам хочется запустить звук и не ждать, когда закончится, то уберите в последней команде "wait"