Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > КАК ПРОИГРАТЬ MP3 ИЗ РЕСУРСА?


Автор: Kostya-xp 12.1.2005, 17:47
Как проиграть MP3 из ресурса, не сохраняя файл на диск. Например, с помощью BASS, FMOD, DSPack или любой другой библиотеки, компонента (чего угодно лишь бы проиграло MP3 из ресурса) smile
Помогите конкретным куском кода пожалуйста - smile

Автор: Kostya-xp 12.1.2005, 20:24
Ну, хоть кто-нибудь знает, как это сделать? smile

smile

Автор: Illusion Dolphin 12.1.2005, 20:47
Знаю smile И даже без посторонних библиотек smile Правда, это всё идёт только на винь2000\ХР... на ранних версиях вроде как не катит - увы. ПО если мы не пишем под старьё, то так:
Во-первых надо вспомнить, что не все файлы с расширением wav такие огромные... почему? Да потому что они закомпрессированы с помощью mp3. итого: берём в руки какой-нибудь конвертор и кодируем нашь mp3 файл в wav, но при этом wav-файл сжимается mp3 кодеком. (надеюсь меня поняли smile , т.к. я не уверен, что чистый mp3 так пойдёт). Создаём файл ресурсов, туда в секцию RCData заносим "MY_WAVE" - имя ресурса, в который записываем нашь wav (но он внутри как mp3). Сохраняем на диске и теперь в проекте:
Код

uses
 MMSystem, ....;

{$R sound.res} //я файл обозвал как "sound.res"

procedure TForm1.Button1Click(Sender: TObject);
var
 WaveHandle: THandle;
 WavePointer: pointer;
begin
WaveHandle := FindResource(hInstance, 'MY_WAVE', 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;

end;

Вот и всё... теперь в приложении играется по сути мр3 файл.

Автор: Kostya-xp 12.1.2005, 21:10
Illusion Dolphin
Не играет. smile
Вроде 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, но по старости подходить должна smile

Автор: 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
Цитата

Правда, это всё идёт только на винь2000\ХР... на ранних версиях вроде как не катит - увы. ПО если мы не пишем под старьё, то так:

smile

Автор: Kostya-xp 12.1.2005, 22:01
Буду ломать голову из-за чего на 2003 винде не пашет...
smile

(Вроде 2003 еще не устарела smile )

Автор: Snowy 13.1.2005, 08:22
Установи кодеки, которыми вав зажат. Скорее всего дело именно в этом.
Поставь KLite. Еще можно Lame установить как кодек.
И зачем использовать sndPlaySound? PlaySound имеет более расширеные возможности.
А в XP кодек MP3 прошит уже при инсталяции, поэтому работает.
В 2003 этого делать не стали - система серверная, а не музыкальная.

Автор: Kostya-xp 13.1.2005, 17:09
У меня стоит K-Lite 2.27. И все равно молчит. smile
Файл сжат LAME 3.92. А в состав K-Lite 2.27 входит 3.96. Так что кодек есть.

Автор: Kostya-xp 13.1.2005, 21:10
smile

Автор: Snowy 14.1.2005, 10:12
А с несжатым файлом пробовал? Может и несжатый играть не будет? Тогда тут другие грабли.
Может попробовать загрусить файл в память и играть не из ресурса, а из памяти?

Автор: Illusion Dolphin 14.1.2005, 16:06
Ну что? Никто не знает smile? Ладно, придётся объяснять...
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) Пишем в делфе:

Код

procedure TForm1.Button2Click(Sender: TObject);
var
Res:TResourceStream;
m : Tmemorystream;
b:string;
begin
if not BASS_Init(-1, 44100, 0, handle) then begin
  Error('Could not initialize BASS');
  Exit;
end;
// start BASS
if not BASS_Start then begin
  Error('Could not start the BASS output');
  Exit;
end;
Res:=TResourceStream.Create(Hinstance,'MP3','MP3');
Res.Seek(0,soFromBeginning);
setlength(b,Res.size);
Res.ReadBuffer(b[1],Res.size);
m := Tmemorystream.Create;
m.Write(b[1],Res.size);
m.Seek(0,soFromBeginning);
SineStream:=BASS_StreamCreateFile(true, m.Memory,0,m.Size,0);
if (SineStream = 0) then begin
 Error('Could not create user stream');
 Exit;
end;
if not BASS_StreamPlay(SineStream, FALSE, 0) then begin
 Error('Could not start stream playback');
 Exit;
end;
end;


P.S. За освобождением памяти следите уж как-нибудь сами, т.к. это не суть сабжа, а я пока искал всё это уже замучался smile

FIN

Автор: Snowy 14.1.2005, 16:20
В данном случае придется еще и BASS с собой таскать (кстати он уже версии 2.1)
PlaySound в данном случае удобней, но есть зависимость от кодека.
Интересно, а можно ли так извернуться, чтобы еще и BASS.dll запихать в ресурс и оттуда его юзать? smile Теоретически да, но...

Автор: Illusion Dolphin 14.1.2005, 16:28
Цитата

В данном случае придется еще и BASS с собой таскать

Смотри первый пост.

Цитата

но есть зависимость от кодека

уже нет smile

Цитата

Интересно, а можно ли так извернуться, чтобы еще и BASS.dll запихать в ресурс и оттуда его юзать?

Можно туда засунуть и при необходимости "инсталить" в систему, но напрямую без сохванения на диск вроде как не получится.

Автор: Kostya-xp 14.1.2005, 17:37
Snowy
Не сжатый файл играет спокойно.

Illusion Dolphin
Спасибо за пример. smile Сейчас попробую поюзать...

Автор: 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… smile

Автор: Illusion Dolphin 14.1.2005, 19:16
Код

var
SineStream: HSTREAM;

Прогу прилагаю.

Автор: Kostya-xp 15.1.2005, 16:32
Illusion Dolphin
По поводу примера:
А можно ли использовать что-то другое, а не
Код

sleep(5000);

Чтобы приложение не засыпало smile

Автор: Illusion Dolphin 15.1.2005, 17:46
Я sleep использовал только из-за того, что демо-программа была неоконной, а звук играется асинхронно. Если у тебя есть любое окно, то тогда тебе sleep использовать совсем не нужно.

Автор: Kostya-xp 15.1.2005, 18:16
Illusion Dolphin
Все это я уже совсем запрограммировался ...smile
smile Все работает. Огромное спасибо за помощь. smile smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)