Audiodatei abspielen Platformübergreifend

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Audiodatei abspielen Platformübergreifend

Beitrag von DL3AD »

Hallo,

ich möchte eine Art Daemon bauen der bei einem bestimmten UDP Paket eine Audiodatei im Hintergrund abspielt ohne einen sichtbaren Player.
Wie kann ich eine Audiodatei .ogg oder mp3 platformübergreifend im Hintergrund abspielen ?

Gruß
Frank

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Audiodatei abspielen Platformübergreifend

Beitrag von mse »


DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Audiodatei abspielen Platformübergreifend

Beitrag von DL3AD »

... hmmm da sind jede menge Dateien :shock:
soll das ein Paket sein das installiert werden muss ?

Wie spiele ich denn nun eine Sounddatei ab ?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Audiodatei abspielen Platformübergreifend

Beitrag von mse »

Im "examples" Verzeichnis sind viele Beispiele, z.B.

Code: Alles auswählen

 
program consoleplay;
 
///WARNING : if FPC version < 2.7.1 => Do not forget to uncoment {$DEFINE consoleapp} in define.inc !
 
{$mode objfpc}{$H+}
   {$DEFINE UseCThreads}
uses
{$IFDEF UNIX}
  cthreads,
  cwstring, {$ENDIF}
  Classes,
  SysUtils,
  CustApp,
  uos_flat;
 
type
 
  { TUOSConsole }
 
  TuosConsole = class(TCustomApplication)
  private
    procedure ConsolePlay;
  protected
    procedure doRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
  end;
 
var
  res: integer;
  ordir, opath, SoundFilename, PA_FileName, SF_FileName, MP_FileName: string;
  PlayerIndex1, InputIndex1, OutputIndex1 : integer;
 
  { TuosConsole }
 
  procedure TuosConsole.ConsolePlay;
  begin
    ordir := IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)));
 
 {$IFDEF Windows}
     {$if defined(cpu64)}
    PA_FileName := ordir + 'lib\Windows\64bit\LibPortaudio-64.dll';
    SF_FileName := ordir + 'lib\Windows\64bit\LibSndFile-64.dll';
     {$else}
    PA_FileName := ordir + 'lib\Windows\32bit\LibPortaudio-32.dll';
    SF_FileName := ordir + 'lib\Windows\32bit\LibSndFile-32.dll';
     {$endif}
    SoundFilename := ordir + 'sound\test.ogg';
 {$ENDIF}
 
     {$if defined(cpu64) and defined(linux) }
    PA_FileName := ordir + 'lib/Linux/64bit/LibPortaudio-64.so';
    SF_FileName := ordir + 'lib/Linux/64bit/LibSndFile-64.so';
    SoundFilename := ordir + 'sound/test.ogg';
   {$ENDIF}
 
   {$if defined(cpu86) and defined(linux)}
    PA_FileName := ordir + 'lib/Linux/32bit/LibPortaudio-32.so';
    SF_FileName := ordir + 'lib/Linux/32bit/LibSndFile-32.so';
   SoundFilename := ordir + 'sound/test.ogg';
 {$ENDIF}
 
  {$if defined(linux) and defined(cpuarm)}
    PA_FileName := ordir + 'lib/Linux/arm_raspberrypi/libportaudio-arm.so';
    SF_FileName := ordir + ordir + 'lib/Linux/arm_raspberrypi/libsndfile-arm.so';
      SoundFilename := ordir + 'sound/test.ogg';
 {$ENDIF}
 
 {$IFDEF freebsd}
    {$if defined(cpu64)}
    PA_FileName := ordir + 'lib/FreeBSD/64bit/libportaudio-64.so';
    SF_FileName := ordir + 'lib/FreeBSD/64bit/libsndfile-64.so';
    {$else}
    PA_FileName := ordir + 'lib/FreeBSD/32bit/libportaudio-32.so';
    SF_FileName := ordir + 'lib/FreeBSD/32bit/libsndfile-32.so';
    {$endif}
    SoundFilename := ordir + 'sound/test.ogg';
 {$ENDIF}
 
 {$IFDEF Darwin}
    opath := ordir;
    opath := copy(opath, 1, Pos('/UOS', opath) - 1);
    PA_FileName := opath + '/lib/Mac/32bit/LibPortaudio-32.dylib';
    SF_FileName := opath + '/lib/Mac/32bit/LibSndFile-32.dylib';
    SoundFilename := opath + '/sound/test.ogg';
 {$ENDIF}
 
    // Load the libraries
   // function uos_loadlib(PortAudioFileName, SndFileFileName, Mpg123FileName, Mp4ffFileName, FaadFileName,  opusfilefilename: PChar) : LongInt;
 
   res := uos_LoadLib(Pchar(PA_FileName), Pchar(SF_FileName), nil, nil, nil, nil) ;
 
    writeln;
    if res = 0 then
     writeln('Libraries are loaded.')
     else
    writeln('Libraries did not load.');
 
   if res = 0 then begin
 
    //// Create the player.
    //// PlayerIndex : from 0 to what your computer can do !
    //// If PlayerIndex exists already, it will be overwriten...
 
  PlayerIndex1 := 0;
 
  if uos_CreatePlayer(PlayerIndex1) then
 
  begin
 
    //// add a Input from audio-file with default parameters
    //////////// PlayerIndex : Index of a existing Player
    ////////// FileName : filename of audio file
    //  result : -1 nothing created, otherwise Input Index in array
 
    InputIndex1 := uos_AddFromFile(PlayerIndex1,(pchar(SoundFilename)));
    if InputIndex1 > -1 then
 
    //// add a Output into device with default parameters
    //////////// PlayerIndex : Index of a existing Player
    //  result : -1 nothing created, otherwise Output Index in array
 
    {$if defined(cpuarm)}  // need a lower latency
        OutputIndex1 := uos_AddIntoDevOut(PlayerIndex1, -1, 0.3, -1, -1, -1, -1) ;
       {$else}
       OutputIndex1 := uos_AddIntoDevOut(PlayerIndex1);
       {$endif}
 
    if OutputIndex1 > -1 then
    begin
 
    /////// everything is ready, here we are, lets play it...
    uos_Play(PlayerIndex1);
    sleep(1000);
    writeln;   
    writeln('Title: ' + uos_InputGetTagTitle(PlayerIndex1, InputIndex1));
    sleep(1500);
    writeln;
    writeln('Artist: ' + uos_InputGetTagArtist(PlayerIndex1, InputIndex1));
    writeln; 
 
    sleep(3000);
   end;
 end;
end;
 
end;
 
  procedure TuosConsole.doRun;
  begin
    ConsolePlay;
    writeln('Press a key to exit...');
    readln;
    Terminate;
    uos_free(); // Do not forget this !
  end;
 
constructor TuosConsole.Create(TheOwner: TComponent);
  begin
    inherited Create(TheOwner);
    StopOnException := True;
  end;
 
var
  Application: TUOSConsole;
begin
  Application := TUOSConsole.Create(nil);
  Application.Title := 'Console Player';
  Application.Run;
  Application.Free;
end.
 

In Funktion sieht man UOS auch in diesem Projekt:
viewtopic.php?f=53&t=11100

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Audiodatei abspielen Platformübergreifend

Beitrag von wp_xyz »

Je nachdem, wie weit deine Anforderung nach Plattformunabhängigkeit reicht, könnte auch das sehr einfache playsoundpackage auf ccr (https://sourceforge.net/p/lazarus-ccr/s ... ndpackage/) in Frage kommen. Funktioniert auf Windows und Linux; bei letzterem werden einfach die im System vorhandenen Wiedergabemöglichkeiten gesucht und als sekundärer Prozess gestartet. Letzendlich braucht man nur die knapp 300 Zeilen lange Unit.

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Audiodatei abspielen Platformübergreifend

Beitrag von DL3AD »

DANKE - ich wußte doch, dass so etwas simples, nicht so kompliziert sein kann. :mrgreen:

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Audiodatei abspielen Platformübergreifend

Beitrag von pluto »

Ich habe mit der vlclib gute Erfahrung machen können. Ich meine sogar eine Version liegt Lazarus sogar schon bei.
MFG
Michael Springwald

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Audiodatei abspielen Platformübergreifend

Beitrag von DL3AD »

DANKE pluto - werde ich auch mal testen.
Mit dem playsoundpackage funktioniert es jedenfalls schon mal 1A 8)

Gruß Frank

Antworten