У TMediaPlayer нет метода "загрузи-ка мне вон тот файл из ресурсов".
Ответ первый - воспользоваться сторонними библиотеками, которые это умеют. Типа давно известной BASS. Ну сторонние компоненты не хочется добавлять, там определенные условия использования и т.п.
Ответ второй - создать свой модуль медиакодека и зарегистрировать его через TMediaCodecManager.RegisterMediaCodecClass под поддельное расширение файла. Собственный медиакодек будет отбрасывать расширение файла и грузить ресурс по имени файла. Описано здесь в ответах - https://stackoverflow.com/questions/362 ... m-resource . Сложновато, всю обвязку городить пусть и на основе примера...
Ответ третий - загрузить из ресурса через LoadResource и потом проигрывать через sndPlaySound, но это не будет работать под андроидом =(
Ответ четвертый - вытащить файл из ресурсов во временную папку и потом указать его плееру через MediaPlayer.FileName.
Код: Выделить всё
var
rest:TResourceStream;
fil:string;
begin
rest := TResourceStream.Create(hInstance, 'mustit', RT_RCDATA);
fil:=TPath.GetPublicPath+TPath.DirectorySeparatorChar+'mustit.mp3';
rest.SaveToFile(fil);
rest.Free;
MediaPlayer1.FileName:=fil;
MediaPlayer1.Play();
end;
Windows XP: C:\Documents and Settings\All Users\Application Data
Windows Vista и новее: C:\ProgramData (там хорошо бы создать подпапку для вашей программы, но можно кидать и просто в эту папку как в примере наверху)
Android: /storage/emulated/0/Android/data/<application ID>/files
Все вытаскивается из ресурсов и проигрывается на ура. Главное потом не забыть удалить эти файлы (особенно если это какие-то огромные музыкальные или видео-файлы) чтоб они не занимали место у пользователя после закрытия вашей программы.
Если подумать, то кроме мелких звуков придется грузить и среднюю по размеру музыку, и огромные по размеру видеофайлы (катсцены). Хранить все это в памяти тяжеловато. Временная папка с файлом - решение получше. Видимо поэтому MediaPlayer и проигрывает только из файлов, а не из памяти.
Чтоб играть музыку и звуки одновременно - кидаем на форму несколько MediaPlayer. Заранее в них грузим через MediaPlayer.FileName:='путь и имя файла' файлы (в каждый медиаплеер свой файл). И когда нужно их проиграть вызываем для конкретного плеера перемотку назад и проигрывание:
Код: Выделить всё
MediaPlayer1.CurrentTime:=0;
MediaPlayer1.Play;
Чтоб зациклить музыку раньше было событие onNotify, которое вызывалось при смене статуса с Playing на Stopped или другой. В Firemonkey такого события что-то не видно у медиаплеера. Т.к. программа в постоянном цикле отрисовки, то в конец цикла можно добавить проверку на запуск музыки снова если она доигралась до конца:
Код: Выделить всё
if MediaPlayer1.State=TMediaState.Stopped then
begin
MediaPlayer1.CurrentTime:=0;
MediaPlayer1.Play;
end;