Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TMediaplayer jagt Arbeitsspeicher in die Höhe (https://www.delphipraxis.net/192553-tmediaplayer-jagt-arbeitsspeicher-die-hoehe.html)

ZYLAGON 30. Apr 2017 18:14

TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Hallo liebe Community,

ich habe ein sehr einfaches Testprogamm geschrieben, welches als einzige Aufgabe einen Sound abspielen soll, wenn ein Button gedrückt wird.
Bei jedem Drücken des Buttons wird der Arbeitsspeicher merklich aufgezehrt (sagt mir der Taskmanager).
Hier der gesamte Code zum Nachvollziehen:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MediaPlayer1.FileName:=ExtractFilePath(ParamStr(0))+'SXPLODE1.WAV';
  MediaPlayer1.Volume:=0.6;
  MediaPlayer1.Play;
end;

end.
Auch der Versuch bei jedem Drücken des Buttons den Mediaplayer zur Laufzeit zu erzeugen und dann wieder freizugeben, ändert nichts.
Die Firemonkey-Anwendung wurde mit Delphi 10 Seattle erstellt.
Was läuft hier schief?

ZYL

EWeiss 30. Apr 2017 18:24

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Du wirst die Wavedatei im Speicher wieder frei geben müssen.
Oder sie wird ständig zum speicher erneut addiert.

Pack die doch in eine Ressource..

bsp.
Delphi-Quellcode:
      if SoundActive then
      begin
        Res := TResourceStream.Create(hInstance, 'BLUP', 'WAV');
        try
          Res.Position := 0;
          SndPlaySound(Res.Memory, SND_MEMORY or SND_ASYNC);
        finally
          Res.Free;
        end;
      end;
gruss

ZYLAGON 30. Apr 2017 19:17

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Danke EWeiss, funktioniert.

Wie es aussieht kann ich aber mehrere WAV-Dateien mit SndPlaySound oder PlaySound nicht gleichzeitig abspielen.
Aber muss ja auch mit dem TMediaplayer funktionieren.
Ich google mich mal durch.

ZYL

EWeiss 30. Apr 2017 19:37

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Zitat:

Wie es aussieht kann ich aber mehrere WAV-Dateien mit SndPlaySound oder PlaySound nicht gleichzeitig abspielen.
Kannst du mit dem MediaPlayer auch nicht.
Nur jeweils immer eine.

Wenn du also mehrere Wav Dateien im Programm benötigst musst du diese natürlich zu der WAV Ressource addieren.

Wenn du jedoch, diese von der Festplatte, also x-beliebige Dateien abspielen willst geht das so natürlich nicht.

gruss

nahpets 30. Apr 2017 19:46

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Vielleicht versuchst Du es ja mal, nachdem die Datei abgespielt wurde, mit
Delphi-Quellcode:
If MediaPlayer1.Mode = mpPlaying Then MediaPlayer1.Stop;
If MediaPlayer1.Mode = mpOpen Then MediaPlayer1.Close;

ZYLAGON 30. Apr 2017 21:40

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Zunächst einmal kann ich jetzt eine Ressource mit dem Mediaplayer abspielen.
Habe mich hieran orientiert:
http://www.delphipraxis.net/191801-a...edergeben.html

Allerdings kann ich nur genau 1x den Sound spielen, dann bekomme ich die Meldung, dass der Filestream nicht erstellt werden kann, da bereits von einem anderen Prozess verwendet wird.
Das kann ich bisher nicht lösen.

@nahpets: Die Eigenschaft 'Mode' kennt mein Mediaplayer nicht.
Die erste Zeile konnte ich noch umformen:
Delphi-Quellcode:
If MediaPlayer1.State = TMediastate.Playing Then MediaPlayer1.Stop;
ZYL

blawen 1. Mai 2017 01:20

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Zitat:

Zitat von ZYLAGON (Beitrag 1369541)
Allerdings kann ich nur genau 1x den Sound spielen, dann bekomme ich die Meldung, dass der Filestream nicht erstellt werden kann, da bereits von einem anderen Prozess verwendet wird.

Und wenn Du wieder zum Anfang des Liedes zurückgehst?
Delphi-Quellcode:
  MediaPlayer1.CurrentTime := 0;

t.roller 1. Mai 2017 07:29

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Warum bringt ihr alle TWindowsMediaPlayer aus WMPLib_TLB.pas und TMediaPlayer aus DELPHI durcheinander?
Der TE hat nicht WMPLib_TLB in der Uses-Liste - also verwendet er TMediaPlayer aus DELPHI, auch wenn er sich an einem falschen Link http://www.delphipraxis.net/191801-a...edergeben.html orientiert.

ZYLAGON 1. Mai 2017 08:04

AW: TMediaplayer jagt Arbeitsspeicher in die Höhe
 
Klasse, funktioniert jetzt wie gewünscht.
Wie von blawen vorgeschlagen, einfach nur CurrentTime auf 0 setzen für wiederholtes Abspielen:
Delphi-Quellcode:
MediaPlayer1.CurrentTime:=0;
MediaPlayer1.Play;
Vielen Dank an alle, die mir hier weitergeholfen haben.

ZYL


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz