Kotec Posted May 21, 2020 Share Posted May 21, 2020 Проекту необходимо добавить аудиофайлы (музыка на заднем фоне и звук нажатия кнопок), как это можно реализовать в вашей библиотеке? Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted May 23, 2020 Administrators Share Posted May 23, 2020 Это можно сделать пока только через Android Api. Quote Link to comment Share on other sites More sharing options...
Kotec Posted May 24, 2020 Author Share Posted May 24, 2020 Не подскажете, как именно это сделать и можно ли где-то найти примеры реализации? Quote Link to comment Share on other sites More sharing options...
Stas Posted May 24, 2020 Share 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 Link to comment Share on other sites More sharing options...
k0de Posted August 17, 2020 Share 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 Link to comment Share on other sites More sharing options...
k0de Posted August 18, 2020 Share 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 Link to comment Share on other sites More sharing options...
knsg12 Posted January 11, 2021 Share Posted January 11, 2021 23.05.2020 в 17:03, Yaroslav Brovin сказал: Это можно сделать пока только через Android Api. Не подскажете а каким образом сейчас возможно на iOs воспроизвести звук, ну или какой то тоновый стандартный звук? Есть ли возможность? Необходимо звуковое сопровождение на реакцию. Quote Link to comment Share on other sites More sharing options...
knsg12 Posted January 11, 2021 Share Posted January 11, 2021 up! Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 11, 2021 Administrators Share Posted January 11, 2021 Можно воспользоваться AVAudioPlayer. Нужно его создать и указать файл. А дальше все как у обычного плейера. 1 Quote Link to comment Share on other sites More sharing options...
knsg12 Posted January 11, 2021 Share Posted January 11, 2021 @Yaroslav Brovin большое спасибо за направление, но был бы примерчик как его создать, вот это бы помогли. За ранее прошу прощения, но никогда не делал подобного и беглый поиск ничего не дал. Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 12, 2021 Administrators Share 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 Link to comment Share on other sites More sharing options...
knsg12 Posted January 20, 2021 Share 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 Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 20, 2021 Administrators Share 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 Link to comment Share on other sites More sharing options...
Stas Posted January 21, 2021 Share Posted January 21, 2021 Однако, я тоже попробовал, кстати на FMX тоже не работает, может это SDK(13.5) или особенности трансляции хедеров? Хотя демка на свифте заработала Quote Link to comment Share on other sites More sharing options...
Administrators Yaroslav Brovin Posted January 21, 2021 Administrators Share Posted January 21, 2021 Судя по документации еще надо указать специальный режим для фонового выполнения. Однако, указав его, все равно звук не работает. Посмотрю еще. Quote Link to comment Share on other sites More sharing options...
Stas Posted January 22, 2021 Share 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 Link to comment Share on other sites More sharing options...
knsg12 Posted January 24, 2021 Share Posted January 24, 2021 @Stasспасибо за ваше участие! Проверил у себя, звук работает, все отлично! На заметку, в ассет менеджере файл заливаем и ставим место распаковки: Закрытые документы (private)! Иначе чета он там файл не может создать и т.д. 1 Quote Link to comment Share on other sites More sharing options...
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.