Kotec Posted May 21, 2020 Posted May 21, 2020 Проекту необходимо добавить аудиофайлы (музыка на заднем фоне и звук нажатия кнопок), как это можно реализовать в вашей библиотеке? Quote
Administrators Yaroslav Brovin Posted May 23, 2020 Administrators Posted May 23, 2020 Это можно сделать пока только через Android Api. Quote
Kotec Posted May 24, 2020 Author Posted May 24, 2020 Не подскажете, как именно это сделать и можно ли где-то найти примеры реализации? Quote
Stas Posted May 24, 2020 Posted May 24, 2020 Здравствуйте У Ярослава в поставке есть файл Android.Api.Media.pas. Там реализован класс TJMediaPlayer. Один из конструкторов которого class function create(const AArg0: TJContext; const AArg1: TJUri): TJMediaPlayer; overload; Так же в этом классе есть методы procedure start; procedure stop; Я думаю, Вам стоит посмотреть в этом направлении. Спасибо 1 Quote
k0de Posted August 17, 2020 Posted August 17, 2020 Сделал так: var m : JMediaPlayer; Asset: TfgAssetFile; begin m := TJMediaPlayer.Create; if TfgAssetsManager.Current.Find<TfgAssetFile>(R.Files.MUZ_MP3, Asset) then begin m.setDataSource(StringToJString(Asset.FileName)); m.start; end; end; Но звука нет. Что не так сделал? Quote
k0de Posted August 18, 2020 Posted August 18, 2020 Сделал вот так: var Asset: TfgAssetFile; MP : JMediaPlayer; AudioObj: JObject; begin if TfgAssetsManager.Current.Find<TfgAssetFile>(R.Files.MUZ_MP3, Asset) then begin MP := TJMediaPlayer.Create; MP.setDataSource(StringToJString(Asset.FileName)); MP.setVolume(1, 1); MP.prepare; MP.start; FreeAndNil(MP); end; end; Звук играет. Однако не уверен в этом коде и есть пару вопросов: 1. Правильно ли делать FreeAndNil тут? Если я к примеру загоню это в функцию, то так можно будет ей пользоваться часто? 2. Музыкальный файл был взят длинный и не смотря на то, что после MP.Start идёт сразу FreeAndNil, музыка продолжает играть. Меня это устраивает, просто интересно нормально ли это и правильно ли это? Не будет ли каких либо утечек? Quote
knsg12 Posted January 11, 2021 Posted January 11, 2021 23.05.2020 в 17:03, Yaroslav Brovin сказал: Это можно сделать пока только через Android Api. Не подскажете а каким образом сейчас возможно на iOs воспроизвести звук, ну или какой то тоновый стандартный звук? Есть ли возможность? Необходимо звуковое сопровождение на реакцию. Quote
Administrators Yaroslav Brovin Posted January 11, 2021 Administrators Posted January 11, 2021 Можно воспользоваться AVAudioPlayer. Нужно его создать и указать файл. А дальше все как у обычного плейера. 1 Quote
knsg12 Posted January 11, 2021 Posted January 11, 2021 @Yaroslav Brovin большое спасибо за направление, но был бы примерчик как его создать, вот это бы помогли. За ранее прошу прощения, но никогда не делал подобного и беглый поиск ничего не дал. Quote
Administrators Yaroslav Brovin Posted January 12, 2021 Administrators Posted January 12, 2021 В релизе 1.9.0.0 добавил хедеры для AVFoundation, в котором находится AVAudioPlayer. Как выйдет релиз, то вот код по воспроизведению аудио файла: uses iOS.Api.AVFoundation, iOS.Api.Helpers, iOS.Api.Foundation; var AudioPlayer: AVAudioPlayer; AudioFileUrl: NSURL; ErrorPtr: Pointer; Error: NSError; begin AudioPlayer := TAVAudioPlayer.Create; AudioFileUrl := StrToNSUrl('Имя файла'); AudioPlayer := TAVAudioPlayer.Wrap(AudioPlayer.initWithContentsOfURL(AudioFileUrl, @ErrorPtr)); if ErrorPtr = nil then begin // Не удалось открыть файл Error := TNSError.Wrap(ErrorPtr); raise Exception.Create(NSStrToStr(Error.localizedDescription)); end else begin AudioPlayer.prepareToPlay; AudioPlayer.play; end; 1 1 Quote
knsg12 Posted January 20, 2021 Posted January 20, 2021 Звук почему то все равно не воспроизводит. Делаю вот так: if (TfgAssetsManager.Current.Find<TfgAssetFile>('muz', Asset)) then begin AudioPlayer := TAVAudioPlayer.Create; AudioFileUrl := StrToNSUrl(Asset.FileName); AudioPlayer := TAVAudioPlayer.Wrap(AudioPlayer.initWithContentsOfURL(AudioFileUrl, @ErrorPtr)); if ErrorPtr = nil then begin // Не удалось открыть файл Error := TNSError.Wrap(ErrorPtr); raise Exception.Create(NSStrToStr(Error.localizedDescription)); end else begin AudioPlayer.prepareToPlay; // <-- на этом месте слетает и дальше не отрабатывает. Хотя ошибок нет AudioPlayer.play; end; end; Что я делаю не так, подскажите пожалуйста. Quote
Administrators Yaroslav Brovin Posted January 20, 2021 Administrators Posted January 20, 2021 В целом посмотрел. Сделал все, как по документации, но пока не работает: procedure TFormMain.PlaySound(const AAssetName: TfgAssetName); var AudioFileUrl: NSURL; Asset: TfgAssetFile; ErrorPtr: Pointer; Error: NSError; Session: AVAudioSession; d: NSTimeInterval; begin if TfgAssetsManager.Current.Find<TfgAssetFile>(AAssetName, Asset) then begin Session := TAVAudioSession.OCClass.sharedInstance; Session.setCategory(AVAudioSessionCategoryPlayback, @ErrorPtr); if ErrorPtr <> nil then begin // Не удалось задать категорию воспроизведения звуков Error := TNSError.Wrap(ErrorPtr); raise Exception.Create(NSStrToStr(Error.localizedDescription)); end; FAudioPlayer := TAVAudioPlayer.Create; AudioFileUrl := StrToNSUrl(Asset.FileName); FAudioPlayer := TAVAudioPlayer.Wrap(FAudioPlayer.initWithContentsOfURL(AudioFileUrl, @ErrorPtr)); if ErrorPtr <> nil then begin // Не удалось открыть файл Error := TNSError.Wrap(ErrorPtr); raise Exception.Create(NSStrToStr(Error.localizedDescription)); end; if FAudioPlayer.prepareToPlay then FAudioPlayer.play; end else raise Exception.CreateFmt('Cannot play sound. Asset is not available: assetName="%s"', [AAssetName]); end; Завтра продолжу. Файл открывается, но не может забуферизироваться. Quote
Stas Posted January 21, 2021 Posted January 21, 2021 Однако, я тоже попробовал, кстати на FMX тоже не работает, может это SDK(13.5) или особенности трансляции хедеров? Хотя демка на свифте заработала Quote
Administrators Yaroslav Brovin Posted January 21, 2021 Administrators Posted January 21, 2021 Судя по документации еще надо указать специальный режим для фонового выполнения. Однако, указав его, все равно звук не работает. Посмотрю еще. Quote
Stas Posted January 22, 2021 Posted January 22, 2021 Если использовать TAVPlayer и Sex Pistols, то работает. procedure TFormMain.PlaySound(const AAssetName: TfgAssetName); var Asset: TfgAssetFile; ErrorPtr: Pointer; FName:string; Session: AVAudioSession; begin if TfgAssetsManager.Current.Find<TfgAssetFile>(AAssetName, Asset) then begin FName:=Asset.FileName; FAudioPlayer := TAVPlayer.Create; FAudioPlayer := TAVPlayer.Wrap(FAudioPlayer.initWithURL(TNSURL.OCClass.fileURLWithPath(StrToNSStr(FName)))); Session := TAVAudioSession.OCClass.sharedInstance; Session.setCategory(AVAudioSessionCategoryPlayback, @ErrorPtr); Session.setActive(True,@ErrorPtr); FAudioPlayer.play; end else raise Exception.CreateFmt('Cannot play sound. Asset is not available: assetName="%s"', [AAssetName]); end; testIosSound.zip 1 Quote
knsg12 Posted January 24, 2021 Posted January 24, 2021 @Stasспасибо за ваше участие! Проверил у себя, звук работает, все отлично! На заметку, в ассет менеджере файл заливаем и ставим место распаковки: Закрытые документы (private)! Иначе чета он там файл не может создать и т.д. 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.