Jump to content

Recommended Posts

Posted

Проекту необходимо добавить аудиофайлы (музыка на заднем фоне и звук нажатия кнопок), как это можно реализовать в вашей библиотеке?

Posted

Не подскажете, как именно это сделать и можно ли где-то найти примеры реализации?

Posted

Здравствуйте

У Ярослава в поставке есть файл Android.Api.Media.pas. Там реализован класс TJMediaPlayer.

Один из конструкторов которого

    class function create(const AArg0: TJContext; const AArg1: TJUri): TJMediaPlayer; overload;

Так же в этом классе есть методы

    procedure start;
    procedure stop;

Я думаю, Вам стоит посмотреть в этом направлении.

Спасибо

 

  • Like 1
  • 2 months later...
Posted

Сделал так:

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;

image.png.9a367168ff3d276dc83ac5e47f242272.png

 

Но звука нет. Что не так сделал?

Posted

Сделал вот так: 

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, музыка продолжает играть. Меня это устраивает, просто интересно нормально ли это и правильно ли это? Не будет ли каких либо утечек?

  • 4 months later...
Posted
23.05.2020 в 17:03, Yaroslav Brovin сказал:

Это можно сделать пока только через Android Api. 

Не подскажете а каким образом сейчас возможно на iOs воспроизвести звук, ну или какой то тоновый стандартный звук? Есть ли возможность? Необходимо звуковое сопровождение на реакцию.

Posted

@Yaroslav Brovin большое спасибо за направление, но был бы примерчик как его создать, вот это бы помогли. За ранее прошу прощения, но  никогда не делал подобного и беглый поиск ничего не дал. 

  • Administrators
Posted

В релизе 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;
  • Like 1
  • Thanks 1
  • 2 weeks later...
Posted

Звук почему то все равно не воспроизводит.

Делаю вот так:
 

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;

Что я делаю не так, подскажите пожалуйста.

  • Administrators
Posted

В целом посмотрел. Сделал все, как по документации, но пока не работает:

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;

Завтра продолжу. Файл открывается, но не может забуферизироваться.

Posted

Однако, я тоже попробовал, кстати на FMX тоже не работает, может это SDK(13.5) или особенности трансляции хедеров?

Хотя  демка на свифте заработала

  • Administrators
Posted

Судя по документации еще надо указать специальный режим для фонового выполнения. Однако, указав его, все равно звук не работает. Посмотрю еще.

Posted

Если использовать 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

  • Thanks 1
Posted

@Stasспасибо за ваше участие! Проверил у себя, звук работает, все отлично! 

На заметку, в ассет менеджере файл заливаем и ставим место распаковки: Закрытые документы (private)! Иначе чета он там файл не может создать и т.д. 

  • Thanks 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...