Jump to content

Как воспроизвести аудиофайл?


Recommended Posts

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

Link to post
Share on other sites

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

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

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

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

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

    procedure start;
    procedure stop;

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

Спасибо

 

  • Like 1
Link to post
Share on other sites
  • 2 months later...

Сделал так:

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

 

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites
  • 4 months later...
23.05.2020 в 17:03, Yaroslav Brovin сказал:

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites
  • Administrators

В релизе 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
Link to post
Share on other sites
  • 2 weeks later...

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

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

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;

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

Link to post
Share on other sites
  • Administrators

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

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;

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites
  • Administrators

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

Link to post
Share on other sites

Если использовать 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
Link to post
Share on other sites

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

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

  • Thanks 1
Link to post
Share on other sites

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...