|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Воспроизведение mp3 из памяти (bass.dll)
Здравствуйте уважаемые форумчане!
Снова нужна ваша помощь. И большое спасибо за помощь в прошлый раз. У меня есть файл ресурсов который, я создал с помощью Restorator 2006. В него я поместил 3 mp3 файла, для простоты назвал 1.mp3, 2.mp3 и 3.mp3. Файл с ресурсами называется DataSound и имеет формат .res. Подключаю его так: Код:
{$R DataSound.res} Код:
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; Когда делал другую (первую) программку, файлы были маленькие и их формат wav меня устраивал. Скомпилированный проект с ними весил 6 МБ, что я считаю приемлемым. А сейчас только один звуковой файл весит около 18 МБ в wav. А всего звуков будет около 25. Воспроизводил их так: Код:
PlaySound('old_metalbeep',0,SND_ReSOURCE or SND_ASYNC); P.S. Надеюсь, что ничего не реального не хочу и эта задача вполне выполнима, т.к. захламлять проект папкой с mp3 файлами не хотелось бы. |
#2
|
|||
|
|||
Может вот это наведет на мысль...
А вообще, глянул доку. Там, походу, можно просто загрузить ресурс в поток, а потом передать указательна память в функцию БАССа. Как=то примерно так (не проверял): Код:
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
|
||||
|
||||
Я проигрывал mp3 из ресурса без bass.dll.
https://yadi.sk/d/_plCENRw3Jx5xa Flash, Flash, Hundred Yard Dash! Buddy, it's nice to see you. |
#4
|
||||
|
||||
Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
А ещё можно тупо перевести *.mp3 в контейнер riff.wav, да хотя бы посредством CDEx,
загнать их потом в ресурс, тока не ресторатором, лучше из brcc32 и воспроизводить как во первом посте, через PlaySound как "обычные" wave Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AnatoliK (20.09.2017)
|
#6
|
|||
|
|||
Спасибо.
Попробовал ваш вариант. Сам код вроде рабочий. Код:
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
|
|||
|
|||
Цитата:
|
#8
|
|||
|
|||
Цитата:
Попробую создать ресурс с помощью brcc32. А на счет wav писал: Цитата:
|
#9
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AnatoliK (20.09.2017)
|
#10
|
|||
|
|||
Цитата:
Там надо указвапть ID ресурса. Естественно, я не знаю с какими ID ты запихал ресурсы, соотв. надо поправить. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
AnatoliK (20.09.2017)
|
#11
|
|||
|
|||
Цитата:
Шаг 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} Код:
procedure TForm1.FormCreate(Sender: TObject); begin BASS_Init(-1, 44100, 0, handle, nil); BASS_Start; end; Код:
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; |
#12
|
||||
|
||||
Ну раз иструкции пошли, то вот ещё одна о том, как без сторонних библиотек воспроизвести мр3 из-под PlaySound:
Шаг 1. "Создал новую папку. В нее запихал mp3-файлы." Шаг 2. Открыл CDEx, выбрал нужный mp3 из "новой папки" в диалоге, дальше пункт меню Convert: в результате там получился упакованный wav-файл того же размера и с именем, что и исходная пестня, только с расширением.wav. Повторил для всех остальных. Шаг 3. Создал текстовый файл DataSound.txt с содержимым Цитата:
Шаг 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
|
|||
|
|||
Цитата:
Да. Ваш вариант с маскировкой mp3 под wave работает. Просто не успел об этом написать с инструкцией в понедельник. P.S. Спасибо большое за помощь Alegun и lmikle. Теперь не могу понять, я получил, что хотел или нет?) Давайте пока остановимся на этом методе. А если еще, что по звуку надо будет я здесь отпишу. Или лучшую новую тему создать? И в каком разделе тогда, "Начинающим" или Мультимедиа? |
#14
|
||||
|
||||
Цитата:
Код:
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; Flash, Flash, Hundred Yard Dash! Buddy, it's nice to see you. |
Этот пользователь сказал Спасибо Verevkin за это полезное сообщение: | ||
M.A.D.M.A.N. (21.09.2017)
|
#15
|
||||
|
||||
Чего творишь, Эрни? Срочно перечитай своё «По ком звонит колокол»
Ну ты понел ^_^. |