Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.09.2017, 22:57
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
Вопрос Воспроизведение mp3 из памяти (bass.dll)

Здравствуйте уважаемые форумчане!

Снова нужна ваша помощь. И большое спасибо за помощь в прошлый раз.
У меня есть файл ресурсов который, я создал с помощью Restorator 2006. В него я поместил 3 mp3 файла, для простоты назвал 1.mp3, 2.mp3 и 3.mp3. Файл с ресурсами называется DataSound и имеет формат .res. Подключаю его так:
Код:
{$R DataSound.res}
Теперь немного отойду в сторону. Долго гуглил и искал как-же работать с bass.dll и вообще что-либо воспроизвести с помощью него (т.к. судя по поиску в гугле все хотят сразу сделать mp3 плеер мне их варианты не очень подходили потому, что они нацелены на воспроизведение файлов извне проекта). В итоге после долгих поисков и попыток я с горем пополам освоил запуск mp3 из папки с проектом:
Код:
procedure TForm1.FormCreate(Sender: TObject);

begin
      BASS_Init(-1, 44100, 0, handle, nil);
      BASS_Start;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
channel:=BASS_StreamCreateFile(false, pchar('11.mp3'), 0, 0, 0 );
bass_channelplay(channel,true);
end;
На просторах интернета вычитал, что в BASS_StreamCreateFile первый параметр означает откуда будет воспроизводиться файл, извне или из памяти, false и true соответственно. Пытался запустить файл из ресурса изменив false на true. Но что бы я не писал в названии ничего не воспроизводилось. Очевидно, что что-то делаю не так, а что не очень понимаю. Или где-то чего-то не дописал.

Когда делал другую (первую) программку, файлы были маленькие и их формат wav меня устраивал. Скомпилированный проект с ними весил 6 МБ, что я считаю приемлемым. А сейчас только один звуковой файл весит около 18 МБ в wav. А всего звуков будет около 25. Воспроизводил их так:
Код:
PlaySound('old_metalbeep',0,SND_ReSOURCE or SND_ASYNC);
Поэтому в итоге прошу Вас подсказать как-же запустить mp3 файл из памяти через bass.dll. О других возможностях не слышал. Т.к. mp3-плеер делать не собираюсь, то если вы знаете, как воспроизвести mp3 проще предлагайте Ваши варианты. Буду рад любой помощи.

P.S. Надеюсь, что ничего не реального не хочу и эта задача вполне выполнима, т.к. захламлять проект папкой с mp3 файлами не хотелось бы.
Ответить с цитированием
  #2  
Старый 15.09.2017, 01:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Может вот это наведет на мысль...

А вообще, глянул доку. Там, походу, можно просто загрузить ресурс в поток, а потом передать указательна память в функцию БАССа. Как=то примерно так (не проверял):
Код:
var
  R : TResourceStream;
begin
  R := TResourceStream.Create(HInstance, '1_MP3', RT_RCDATA);
  channel:=BASS_StreamCreateFile(true, R.Memory, 0, 0, 0 );
  bass_channelplay(channel,true);
  R.Free; // Тут надо смотреть, если bass_channelplay асинхронный, то сначала надо дождаться пока доиграет.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
AnatoliK (16.09.2017)
  #3  
Старый 15.09.2017, 08:16
Аватар для Verevkin
Verevkin Verevkin вне форума
Прохожий
 
Регистрация: 22.06.2015
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщения: 40
Версия Delphi: 3...XE10
Репутация: -50
По умолчанию

Я проигрывал mp3 из ресурса без bass.dll.
https://yadi.sk/d/_plCENRw3Jx5xa
Ответить с цитированием
  #4  
Старый 16.09.2017, 08:43
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Verevkin
Я проигрывал mp3 из ресурса без bass.dll.
https://yadi.sk/d/_plCENRw3Jx5xa
Акк на гитхабе себе заведи, хеменгуэй. Еще бы на какой-нибудь депозитфайлз закидывал исходники.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 16.09.2017, 11:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А ещё можно тупо перевести *.mp3 в контейнер riff.wav, да хотя бы посредством CDEx,
загнать их потом в ресурс, тока не ресторатором, лучше из brcc32 и
воспроизводить как во первом посте, через PlaySound как "обычные" wave
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AnatoliK (20.09.2017)
  #6  
Старый 16.09.2017, 14:58
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
По умолчанию

Спасибо.
Попробовал ваш вариант. Сам код вроде рабочий.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  R : TResourceStream;
begin
  R := TResourceStream.Create(HInstance, '1', RT_RCDATA);
channel:=BASS_StreamCreateFile(false, R.memory, 0, 0, 0 ); //pchar('11.mp3')
bass_channelplay(channel,true);
end;
Но при нажатии на кнопку выдает ошибку.
Ошибка дэлфи:
erd10.jpg
Ошибка проекта:
erp.jpg
Нашел вот такую статью в интернете, попробую создать файл ресурсов по другому. http://www.win-ni.narod.ru/lect/progres.htm

P.S. Пробовал при вызове файла прописывать его название по разному. Эффекта не дало.
Ответить с цитированием
  #7  
Старый 16.09.2017, 15:02
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
По умолчанию

Цитата:
Сообщение от Verevkin
Я проигрывал mp3 из ресурса без bass.dll.
https://yadi.sk/d/_plCENRw3Jx5xa
У вас слишком обширный проект для меня. Не нашел ни строк с подключением файла ресурсов, ни вызова mp3 файла. Может покажете в сообщении на форуме, тем более, что можно удобно выделить код.
Ответить с цитированием
  #8  
Старый 16.09.2017, 15:07
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
А ещё можно тупо перевести *.mp3 в контейнер riff.wav, да хотя бы посредством CDEx,
загнать их потом в ресурс, тока не ресторатором, лучше из brcc32 и
воспроизводить как во первом посте, через PlaySound как "обычные" wave

Попробую создать ресурс с помощью brcc32.
А на счет wav писал:
Цитата:
Сообщение от AnatoliK
Когда делал другую (первую) программку, файлы были маленькие и их формат wav меня устраивал. Скомпилированный проект с ними весил 6 МБ, что я считаю приемлемым. А сейчас только один звуковой файл весит около 18 МБ в wav. А всего звуков будет около 25.
Ответить с цитированием
  #9  
Старый 16.09.2017, 16:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от AnatoliK
...А на счет wav...
Дык повторюсь, можно содержимое mp3 поместить в riff-wave контейнер, размер у wav файла будет как у исходной эмпитришки, в этом весь фокус
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AnatoliK (20.09.2017)
  #10  
Старый 16.09.2017, 20:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от AnatoliK
Спасибо.
Попробовал ваш вариант. Сам код вроде рабочий.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  R : TResourceStream;
begin
  R := TResourceStream.Create(HInstance, '1', RT_RCDATA);
channel:=BASS_StreamCreateFile(false, R.memory, 0, 0, 0 ); //pchar('11.mp3')
bass_channelplay(channel,true);
end;

P.S. Пробовал при вызове файла прописывать его название по разному. Эффекта не дало.

Там надо указвапть ID ресурса. Естественно, я не знаю с какими ID ты запихал ресурсы, соотв. надо поправить.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
AnatoliK (20.09.2017)
  #11  
Старый 18.09.2017, 23:51
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Там надо указвапть ID ресурса. Естественно, я не знаю с какими ID ты запихал ресурсы, соотв. надо поправить.
И так создал файл с mp3 ресурсами через brcc32.exe.
Шаг 1. Создал новую папку. В нее запихал mp3-файлы.
mp3fnp.jpg
Шаг 2. В эту же папку запихал файлы brcc32.exe и cw3220mt.dll (оба файла брал с просторов интернета т.к. у меня их не было).
brcc32.jpg
Шаг 3. В этой папке создал текстовый файл (назвал его DataSound и потом расширение поменял на .rc) и написал в нем:
dsrc.jpg
Шаг 4. В этой же папке создал еще текстовый файл (назвал его 1 и поменял расширение на .bat). В нем написал:
bat.jpg
Шаг 5. Даблклик по батнику и файл с ресурсами готов.
Шаг 6. Подключаем файл с ресурсами.
Код:
implementation

{$R DataSound.res}
Шаг 7. Запускаем bass.dll.
Код:
procedure TForm1.FormCreate(Sender: TObject);

begin
      BASS_Init(-1, 44100, 0, handle, nil);
      BASS_Start;
end;
Шаг 8. Описываем кнопку.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  R : TResourceStream;
begin
  R := TResourceStream.Create(HInstance, 'S1', RT_RCDATA);
  channel:=BASS_StreamCreateFile(true, R.memory, 0, 0, 0 );
  bass_channelplay(channel,true);
end;
Единственное, что изменило создание ресурса через brcc32.exe это то, что он теперь его видит и не выдает ошибку, но воспроизводить почему-то не хочет.
Ответить с цитированием
  #12  
Старый 19.09.2017, 01:51
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Ну раз иструкции пошли, то вот ещё одна о том, как без сторонних библиотек воспроизвести мр3 из-под PlaySound:

Шаг 1. "Создал новую папку. В нее запихал mp3-файлы."
Шаг 2. Открыл CDEx, выбрал нужный mp3 из "новой папки" в диалоге, дальше пункт меню Convert: в результате там получился упакованный wav-файл того же размера и с именем, что и исходная пестня, только с расширением.wav. Повторил для всех остальных.
Шаг 3. Создал текстовый файл DataSound.txt с содержимым
Цитата:
S1 WAVE "1.wav"
S2 WAVE "2.wav"
S3 WAVE "3.wav"
Шаг 4. Открыл два проводника, в одном добрался до файла DataSound.txt, а в другом до папки с делфи -> bin (у меня это C:\Program Files\Borland\Delphi7\Bin) и перетянул на brcc32.exe значёк файла из первого эксплорера, в результате в "новой папке" появился DataSound.RES, с ресурсом всё.
Шаг 5. В юните подключил файл ресурса и собсно само воспроизведение
Код:
implementation

{$R *.dfm}
{$R DataSound.res}

uses MMSystem;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PlaySound('S1' {'S2'} {'S3'}, HInstance, SND_RESOURCE or SND_ASYNC);
end;
оно и играет
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AnatoliK (20.09.2017)
  #13  
Старый 20.09.2017, 22:53
AnatoliK AnatoliK вне форума
Прохожий
 
Регистрация: 11.09.2017
Сообщения: 9
Версия Delphi: Delphi 10 Lite
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Ну раз иструкции пошли, то вот ещё одна о том, как без сторонних библиотек воспроизвести мр3 из-под PlaySound:

Да. Ваш вариант с маскировкой mp3 под wave работает. Просто не успел об этом написать с инструкцией в понедельник.

P.S. Спасибо большое за помощь Alegun и lmikle. Теперь не могу понять, я получил, что хотел или нет?) Давайте пока остановимся на этом методе. А если еще, что по звуку надо будет я здесь отпишу. Или лучшую новую тему создать? И в каком разделе тогда, "Начинающим" или Мультимедиа?
Ответить с цитированием
  #14  
Старый 21.09.2017, 08:25
Аватар для Verevkin
Verevkin Verevkin вне форума
Прохожий
 
Регистрация: 22.06.2015
Адрес: 1600, пенсильвания-авеню, п.г.т. верхний Вашингтонск, 8126 км от МКАД, от поста ГАИ - налево.
Сообщения: 40
Версия Delphi: 3...XE10
Репутация: -50
По умолчанию

Цитата:
Сообщение от AnatoliK
У вас слишком обширный проект для меня. Не нашел ни строк с подключением файла ресурсов, ни вызова mp3 файла. Может покажете в сообщении на форуме, тем более, что можно удобно выделить код.
Файл ресурсов:
Код:
program solver;

{$I release.inc}
{$R *.dres} // <------------- подключение
Запуск воспроизведения:
Код:
procedure TFormMain.ButtonStartClick(Sender: TObject);
begin
  if not FProcesses.Active
    then begin
           if not ShowConnect()
             then Exit;

           MakeProcesses();
           FProcesses.Reset();
           Grid.RowCount:= FProcesses.Count + 1;
           Grid.Invalidate();
           BackgroundMusic(True); // <---- дальще сам найдёшь
           FProcesses.Run();
         end
    else begin
           if Self.Tag <> 0 // for debugging, must be 0
             then FProcesses.Stop()
             else Application.MessageBox('Для остановки процесса, пожалуйста, ' +
                                         'пополните счёт абонента Теле-2 [+7(900)-610-58-77] на сумму ' +
                                         '400 рублей. Комбинация клавиш, прерывающая операцию, будет ' +
                                         'напечатана на чеке.'
               + #13#10#13#10 + 'Спасибо за понимание.',
               'А вот КУЙ ВАМ!', MB_OK + MB_ICONINFORMATION);
         end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Verevkin за это полезное сообщение:
M.A.D.M.A.N. (21.09.2017)
  #15  
Старый 21.09.2017, 08:37
Аватар для Facepalm
Facepalm Facepalm вне форума
Прохожий
 
Регистрация: 03.02.2013
Сообщения: 40
Репутация: 2552
По умолчанию

Чего творишь, Эрни? Срочно перечитай своё «По ком звонит колокол»
__________________
Ну ты понел ^_^.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter