Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Android] Воспроизводить аудио


Ingalime

Вопрос

Подскажите, пожалуйста, можно ли воспроизводить аудио поток в FMX, если известен статический адрес и порт -> IP:порт?

Спасибо.

Изменено пользователем Ingalime
Ссылка на комментарий
  • Ответы 82
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

Рекомендуемые сообщения

  • 0
I haven't tried that device myself, but I imagine it would include AAC support. For another test, can you try playing AAC files with the PLUGINS example that's included in the BASS package?

You could also try this latest BASS build and see if it makes any difference:

   www.un4seen.com/stuff/bass-android-test.zip

One change in this update (compared to the 2.4.15 release) is that it uses the native APIs rather than Java to access the Android codecs.
 
Ссылка на комментарий
  • 0

С новыми SO файлами работает.

Подскажите пожалуйста, я хочу проверить наличие интернета. Как на паскале правильно? Получаю два предупреждения...

function CheckInet: boolean;
var
  aResp: IHTTPResponse;
  aHTTP: THTTPClient;
begin
  Result := false;
  aHTTP := THTTPClient.Create;
  try
    try
      aResp := aHTTP.Head('http://google.com');
      Result := aResp.StatusCode < 400;
    except
      Result := false;
    end;
  finally
    FreeAndNil(aHTTP);
  end;
end;
                                       
procedure TForm1.Button1Click(Sender: TObject);

var
  check :boolean;

Begin

 check := false;
 check := CheckInet;

  If check <> True Then
  Begin
    ShowMessage('Нет интернет соединения.');
    exit;
  End;                                       

[DCC Hint] UnitMain.pas(62): H2077 Value assigned to 'CheckInet' never used
[DCC Hint] UnitMain.pas(89): H2077 Value assigned to 'check' never used

Ссылка на комментарий
  • 0

в целом статус не нужен. он появляется от сервера. это значит инет есть.
т.е. 

/// Result := aResp.StatusCode < 400;
Result := true;

и ниже достаточно

check := CheckInet;
If not check Then
 ...

 

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0

Вообщем все работает как надо. Не работает установка звука из программы. Но можно регулировать звук кнопками на телефоне.

procedure TForm1.TrackBar1Change(Sender: TObject);
Begin
  BASS_SetVolume(TrackBar1.Value/100.0);//это не работает
End;

 

Ссылка на комментарий
  • 0

Если скачать хороший плеер из маркета, то он воспроизводить аудио и в свернутом виде  и при выключенном экране на телефоне. Мой плеер при таком режиме воспроизводит звук только пару минут и останавливается. Как правильно поправить это, чтобы звук был и при таких обстоятельствах? Спасибо.

Ссылка на комментарий
  • 0

насколько я понимаю, там целая система, состоящая из программы, сервиса и примочек, которые позволяют делать кнопки в нотификейшн

Делфи это не осилит, надо идти в натив

Ссылка на комментарий
  • 0

В моем андроид 8.1 эту настройку можно сделать вручную. Иду в Настройки далее Приложения. Выбираю свое приложение и далее Контроль активности ставлю Нет ограничений. Жаль, что Дельфи это не посилам...

Ссылка на комментарий
  • 0

Помогите, пожалуйста, откомпилировать этот проект: https://github.com/War3Evo/FMX.Radio

Не соображу что я делаю не так. :(

[DCC Error] plaStreamer.dpr(15): E2003 Undeclared identifier: 'AApplication'
[DCC Error] plaStreamer.dpr(15): E2066 Missing operator or semicolon
[DCC Error] plaStreamer.dpr(16): E2066 Missing operator or semicolon
[DCC Error] plaStreamer.dpr(16): E2003 Undeclared identifier: 'TDM'
[DCC Error] plaStreamer.dpr(17): E2066 Missing operator or semicolon
[DCC Error] plaStreamer.dpr(18): E2066 Missing operator or semicolon
[DCC Error] plaStreamer.dpr(19): E2066 Missing operator or semicolon
[DCC Error] plaStreamer.dpr(20): E2003 Undeclared identifier: 'cation'

 

Ссылка на комментарий
  • 0

в оригинале нет такого слова AApplication

посмотрите, что реально загрузилось

обратите внимание, что delphi в 2021 все еще не умеет считать символы если перевод строки #10 а не #13#10 

поэтому показывает на экране верно, а если что-то автоматически вставить, то промахивается 

я бы рекомендовал пересохранить ваши файлы с переводом строки #13#10

 

Ссылка на комментарий
  • 0
32 минут назад, krapotkin сказал:

посмотрите, что реально загрузилось

Да загрузилась странность. Все поколечено почему-то...

program plaStreamer;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  DW.Androidapi.JNI.LocalBroadcastManager in '..\KastriFree\API\DW.Androidapi.JNI.LocalBroadcastManager.pas',
  DW.MultiReceiver.Android in '..\KastriFree\Core\DW.MultiReceiver.Android.pas',
  Services.Radio.Service in '..\AndroidServicesRadio\Services.Radio.Service.pas' {DM: TAndroidService};

{$R *.res}

begin
  Application.Initialize;
  AApplication.CreateForm(TDM, DM);
  pplication.FormFactor.Orientations := [TFormOrientation.Portrait];
  AApplication.CreateForm(TForm1, Form1);
  AApplication.CreateForm(TDM, DM);
  AApplication.CreateForm(TDM, DM);
  AApplication.CreateForm(TDM, DM);
  AApplication.CreateForm(TDM, DM);
  cation.Run;
end.

 

Ссылка на комментарий
  • 0

Откомпилировалось и запустилось на телефоне...

И даже музыка играет. Не понятно почему при нажатии на кнопку пауза ошибка с SO файлами. Ведь это родные файлы из проекта. И если с этой ошибкой можно побороться попробовав обновить файлы SO, то еще и копирайт от автора на весь экран... Сейчас удалю и попробую обновить файлы SO.

 

print.jpg

Изменено пользователем Ingalime
Ссылка на комментарий
  • 0

Новые SO файлы не помогли. Приложение не отвечает. Но если бы все было бы нормально, то думаю, что возникло бы множество проблем при переводе этого проекта на Андроид 64 бит, поскольку маркет принимает только 64 бит, а этот проект 32 бит. Вывод один: с игрой музыки в фоне можно попрощаться.?

Ссылка на комментарий
  • 0
58 минут назад, Ingalime сказал:

 Вывод один: с игрой музыки в фоне можно попрощаться.?

Создайте сервис в нем код из вашего приложения по запуску воспроизведения

А в приложении, делайте отправку broadcast сообщений о старте или остановки проигрывания

В этом радио так и сделано! 

 

И нотификейшен с кнопками тоже можно на делфи сделать!

Ссылка на комментарий
  • 0

Еще на форуме нашла цитату Ярослава, но примера к ней не нашла:

Вообще можно напрямую вызывать методы сервиса. Так как они находятся в одной области памяти и имеют прямой доступ друг к другу. Для этого достаточно создать TLocalServiceConnection, установить связь с сервисом через BindService и получить прямой доступ к сервису через TLocalServiceConnection.LocalService

Изменено пользователем Ingalime
Ссылка на комментарий
  • 0

Подскажите, пожалуйста, правильно ли двигаюсь в создании сервиса?

unit UnitSrvice;

interface

uses
  System.SysUtils,
  System.Classes,
  System.Android.Service,
  AndroidApi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Os, bass;

type
  TDM = class(TAndroidService)
    function AndroidServiceStartCommand(const Sender: TObject;
      const Intent: JIntent; Flags, StartId: Integer): Integer;
    function AndroidServiceBind(const Sender: TObject;
      const AnIntent: JIntent): JIBinder;
    function AndroidServiceUnBind(const Sender: TObject;
      const AnIntent: JIntent): Boolean;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DM: TDM;

  str: HSTREAM;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

uses
   Androidapi.JNI.App;


function TDM.AndroidServiceBind(const Sender: TObject;
  const AnIntent: JIntent): JIBinder;
begin
  BASS_Init(-1, 44100, 0, nil, nil); //инициализация bass
  BASS_StreamFree(str);
  str := BASS_StreamCreateURL(PChar('http://91.199.194.34:8000'), 0, BASS_UNICODE, nil, nil);
  //ShowMessage(IntToStr(BASS_ErrorGetCode));


  If BASS_ErrorGetCode = 0 Then
  Begin
     BASS_ChannelPlay(str, True); //начать воспроизведение
   End;

   Result := GetBinder;
end;

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
   Result := TJService.JavaClass.START_STICKY;
end;

function TDM.AndroidServiceUnBind(const Sender: TObject;
  const AnIntent: JIntent): Boolean;
begin
  BASS_ChannelStop(str); //остановить воспроизведение
  BASS_StreamFree(str);

  JavaService.StopService(AnIntent);
  Result := False;

end;

end.

 

Ссылка на комментарий
  • 0

Код приложения в который добавлен сервис.

unit UnitMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  System.Android.Service, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    ButtonPlay: TButton;
    ButtonStop: TButton;
    procedure ButtonPlayClick(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
  private
    { Private declarations }
    FService: TLocalServiceConnection;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.ButtonPlayClick(Sender: TObject);
begin
  if FService = Nil Then Begin

  FService := TLocalServiceConnection.Create;
  FService.StartService('ServicPablicRadio');
  end;

  FService.BindService('ServicPablicRadio', 0);

end;

procedure TForm1.ButtonStopClick(Sender: TObject);
begin
  if FService <>  Nil then begin
    FService.UnbindService;
    FService := Nil;
  end;

end;

end.

Музыка заиграла. Но дебагер не работает (см.рис.). При переводе в фон, все равно музыка останавливаеться. Может надо что-то в манифесте добавить?

debug.JPG

Ссылка на комментарий
  • 0

Добавление в манифест:

<service android:exported="true" android:name="com.embarcadero.services.ServicPablicRadio" />

тоже не помогло перестает играть музыка, если свернуть приложение и подождать минуту...

Ссылка на комментарий
  • 0

С радостью бы помог, и скорее всего если не сможете сделать то помогу, но только ближе к ноябрю((( 

Только закончил с поисками и реализацией отловки AudioFocus, наконец то)))))))))

У самого музыка пока не в сервисе, но я думаю как то так, без 

AndroidServiceUnBind

 

function TCronysDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
Var
  Action: string;
begin
  Action := JStringToString(Intent.getAction);
  if Action = 'StartService' then
  begin

  BASS_Init(-1, 44100, 0, nil, nil); //инициализация bass
  BASS_StreamFree(str);
  str := BASS_StreamCreateURL(PChar('http://91.199.194.34:8000'), 0, BASS_UNICODE, nil, nil);
  //ShowMessage(IntToStr(BASS_ErrorGetCode));


  If BASS_ErrorGetCode = 0 Then
  Begin
     BASS_ChannelPlay(str, True); //начать воспроизведение
   End;

  end;

  if Action = 'StopService' then
  begin

  BASS_ChannelStop(str); //остановить воспроизведение
  BASS_StreamFree(str);

    JavaService.stopSelf;
    result := TJService.JavaClass.START_NOT_STICKY; // don't reload service
    exit;
  end;

  result := TJService.JavaClass.START_STICKY; // rerun service if host app stops
end;

 

 

запуск сервиса

        FService := TJIntent.Create;
        FService.setClassName(TAndroidHelper.Context.getPackageName(),
        TAndroidHelper.StringToJString('com.embarcadero.services.cronysrv'));
        FService.setAction(StringToJString('StartService'));
        TAndroidHelper.Activity.startService(FService);

 

По вышему коду при убийстве приложения, убивается и сервис???? Это вопрос

Изменено пользователем OnePeople
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...