| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > КАК ПРОИГРАТЬ MP3 ИЗ РЕСУРСА? |
| Автор: Kostya-xp 12.1.2005, 17:47 |
| Как проиграть MP3 из ресурса, не сохраняя файл на диск. Например, с помощью BASS, FMOD, DSPack или любой другой библиотеки, компонента (чего угодно лишь бы проиграло MP3 из ресурса) Помогите конкретным куском кода пожалуйста - |
| Автор: Kostya-xp 12.1.2005, 20:24 |
| Ну, хоть кто-нибудь знает, как это сделать? |
| Автор: Illusion Dolphin 12.1.2005, 20:47 | ||
| Знаю Во-первых надо вспомнить, что не все файлы с расширением wav такие огромные... почему? Да потому что они закомпрессированы с помощью mp3. итого: берём в руки какой-нибудь конвертор и кодируем нашь mp3 файл в wav, но при этом wav-файл сжимается mp3 кодеком. (надеюсь меня поняли
Вот и всё... теперь в приложении играется по сути мр3 файл. |
| Автор: Kostya-xp 12.1.2005, 21:10 |
| Illusion Dolphin Не играет. Вроде sndPlaySound играет только разжатые WAV файлы - с ними проблем нет, а вот с сжатыми… |
| Автор: Illusion Dolphin 12.1.2005, 21:16 |
| Как это не играет? У меня всё прекрасно играет! И именно сжатый! Вопросы таковы: какая у тебя винда (я говорил об ограничениях), как ты получаешься wav файл и как ты его сохраняешь в ресурсы (туда ли куда надо)?. Или я могу примерчик кинуть маленький.. может... |
| Автор: Illusion Dolphin 12.1.2005, 21:24 |
| Вот, я прогу прицепил - там и исходник и скомпилиный экзешник (всего 100 кило всё весит). |
| Автор: Kostya-xp 12.1.2005, 21:27 |
| Получаю так REZ: MyWave RCDATA LOADONCALL 1.wav Запихиваю его в прогу: Uses MMSYSTEM и т.д. ... {$R sound.res} ... procedure TForm1.Button1Click(Sender: TObject); var WaveHandle: THandle; WavePointer: pointer; begin WaveHandle := FindResource(hInstance, 'MyWave', RT_RCDATA); if WaveHandle <> 0 then begin WaveHandle := LoadResource(hInstance, WaveHandle); if WaveHandle <> 0 then begin; WavePointer := LockResource(WaveHandle); sndPlaySound(WavePointer, snd_Memory or SND_ASYNC); UnlockResource(WaveHandle); FreeResource(WaveHandle); end; end; Скачал пример. Но звука не слышно. Подскажи что за звук должен быть? Добавлено @ 21:33 О системе: У меня стоит 2003 Server Enterprice Edition.Это конечно не 2000 и не XP, но по старости подходить должна |
| Автор: Kostya-xp 12.1.2005, 21:39 |
| Illusion Dolphin Как бы там не было спасибо за пример. |
| Автор: Illusion Dolphin 12.1.2005, 21:41 |
| Теперь разобрался (как видишь, пример я уже прицепил - успел опередить ;))? Работает на твоей машине? Если неполучается собрать или файл ресурсов создать нормальный, то я могу помочь парочкой советов.... |
| Автор: Kostya-xp 12.1.2005, 21:45 |
| Нет, в смысле все еще не сдвинулось с мертвой точки тишины... Сейчас попробую на XP. |
| Автор: Kostya-xp 12.1.2005, 21:57 |
| Illusion Dolphin А на XP все пашет!!! И у меня все запустилось... |
| Автор: Illusion Dolphin 12.1.2005, 22:00 | ||
|
| Автор: Kostya-xp 12.1.2005, 22:01 |
| Буду ломать голову из-за чего на 2003 винде не пашет... (Вроде 2003 еще не устарела |
| Автор: Snowy 13.1.2005, 08:22 |
| Установи кодеки, которыми вав зажат. Скорее всего дело именно в этом. Поставь KLite. Еще можно Lame установить как кодек. И зачем использовать sndPlaySound? PlaySound имеет более расширеные возможности. А в XP кодек MP3 прошит уже при инсталяции, поэтому работает. В 2003 этого делать не стали - система серверная, а не музыкальная. |
| Автор: Kostya-xp 13.1.2005, 17:09 |
| У меня стоит K-Lite 2.27. И все равно молчит. Файл сжат LAME 3.92. А в состав K-Lite 2.27 входит 3.96. Так что кодек есть. |
| Автор: Kostya-xp 13.1.2005, 21:10 |
| |
| Автор: Snowy 14.1.2005, 10:12 |
| А с несжатым файлом пробовал? Может и несжатый играть не будет? Тогда тут другие грабли. Может попробовать загрусить файл в память и играть не из ресурса, а из памяти? |
| Автор: Illusion Dolphin 14.1.2005, 16:06 | ||
| Ну что? Никто не знает 1) Копируем библиотеку http://trackers.pp.ru/soft/util/bassdll.zip 2) Копируем архив http://www.un4seen.co.uk/files/bass17.zip И из последнего копируем себе файлик BASS.pas 3) ложим в папку с прогой библиотеку, подключаем себе этот модуль. 4) подключаем файл ресурсов, у меня ЧИСТЫЙ mp3 (без извращений) нажодился в \mp3\mp3 5) Пишем в делфе:
P.S. За освобождением памяти следите уж как-нибудь сами, т.к. это не суть сабжа, а я пока искал всё это уже замучался FIN |
| Автор: Snowy 14.1.2005, 16:20 |
| В данном случае придется еще и BASS с собой таскать (кстати он уже версии 2.1) PlaySound в данном случае удобней, но есть зависимость от кодека. Интересно, а можно ли так извернуться, чтобы еще и BASS.dll запихать в ресурс и оттуда его юзать? |
| Автор: Illusion Dolphin 14.1.2005, 16:28 | ||||||
Смотри первый пост.
уже нет
Можно туда засунуть и при необходимости "инсталить" в систему, но напрямую без сохванения на диск вроде как не получится. |
| Автор: Kostya-xp 14.1.2005, 17:37 |
| Snowy Не сжатый файл играет спокойно. Illusion Dolphin Спасибо за пример. |
| Автор: Kostya-xp 14.1.2005, 18:46 |
| Illusion Dolphin Все сделал, Ошибки таковы: [Error] Unit1.pas(56): Undeclared identifier: 'SineStream' [Error] Unit1.pas(58): Missing operator or semicolon {(это к Error)} возникла парочка вопросов: Я задал SineStream по типу DWORD. Осталось определиться с Error Если не трудно, ты бы не мог кинуть рабочий пример, без самого mp3 конечно? P.S. Да это не sndPlaySound… |
| Автор: Illusion Dolphin 14.1.2005, 19:16 | ||
Прогу прилагаю. |
| Автор: Kostya-xp 15.1.2005, 16:32 | ||
| Illusion Dolphin По поводу примера: А можно ли использовать что-то другое, а не
Чтобы приложение не засыпало |
| Автор: Illusion Dolphin 15.1.2005, 17:46 |
| Я sleep использовал только из-за того, что демо-программа была неоконной, а звук играется асинхронно. Если у тебя есть любое окно, то тогда тебе sleep использовать совсем не нужно. |
| Автор: Kostya-xp 15.1.2005, 18:16 |
| Illusion Dolphin Все это я уже совсем запрограммировался ... |