To quote Remy Lebeau (TeamB):
Medien wiedergeben, die nicht in einer Datei ist
TMediaPlayer nicht nativ keine Nicht-Dateisystem-Datenquellen implementieren, so müssen Sie Ihre eigenen Codec/Medien implementieren Klassen für den Zugriff auf (und spielen) die Ressource Daten, wie Sie wollen. TMediaPlayer selbst tut egal, ob sein Dateiname in einem Dateisystem existiert oder nicht. Es fordert einfach die TMediaCodecManager-Klasse auf, ein geeignetes TMedia-Objekt für den Zugriff zurückzurufen, und spielt die Daten aus der Quelle ab, auf die sich der Dateiname bezieht.
Erstellen Sie eine benutzerdefinierte Klasse, die von FMX.Media.TMedia abgeleitet ist, und implementieren Sie die abstrakten Methoden (DoPlay(), DoStop(), GetDuration() usw.). Diese Klasse greift auf die tatsächlichen Mediendaten zu und gibt sie wieder, so dass Sie den gewünschten FileName an ihn übergeben können und ihn je nach Bedarf auf Ihren Ressourcenstream laden/zugreifen lassen können. Suchen Sie bei den Standard-TMedia-Implementierungen nach Beispielen (FMX.Media.Win.TWindowsMedia, FMX.Media.Mac.TQTMedia usw.).
eine benutzerdefinierte Klasse erstellen, die von FMX.Media.TCustomMediaCodec ableitet und seiner abstrakten CreateFromFile() Methode implementieren, um eine Instanz des benutzerdefinierten Tmedia Klasse zurückzukehren. Sie können diese Klasse dann beim Programmstart unter Verwendung von FMX.Media.TMediaCodecManager.RegisterMediaCodecClass() registrieren. Der Trick ist, dass Sie die Klasse mit einer Dateierweiterung registrieren müssen, also wählen Sie etwas , das eindeutig ist und nicht für eine echte Datei verwechselt werden kann.
Zum Beispiel:
unit PlayMediaFromResource;
uses
..., FMX.Media;
type
TMyResourceMedia = class(TMedia)
...
protected
function GetDuration: TMediaTime; override;
function GetCurrent: TMediaTime; override;
procedure SetCurrent(const Value: TMediaTime); override;
function GetVideoSize: TPointF; override;
function GetMediaState: TMediaState; override;
function GetVolume: Single; override;
procedure SetVolume(const Value: Single); override;
procedure UpdateMediaFromControl; override;
procedure DoPlay; override;
procedure DoStop; override;
public
constructor Create(const AFileName: string); override;
destructor Destroy; override;
end;
TMyResourceMediaCodec = class(TCustomMediaCodec)
public
function CreateFromFile(const AFileName: string): TMedia; override;
end;
function TMyResourceMediaCodec.CreateFromFile(const AFileName: string): TMedia;
begin
Result := TMyResourceMedia.Create(AFileName);
end;
constructor TMyResourceMedia.Create(const AFileName: string);
var
ResName: string;
begin
ResName := ChangeFileExt(AFileName, ''); // strip off '.myres' file extension
// load resource identified by ResName as needed...
end;
....
initialization
TMediaCodecManager.RegisterMediaCodecClass('.myres', 'My Resource Stream',
TMediaType.Audio, TMyResourceMediaCodec);
Dann können Sie dies tun:
MediaPlayer1.FileName := 'MyResourceName.myres';
MediaPlayer1.Play;
end;
-
Oder Sie können einfach die Ressource in einer Datei speichern
Wenn Sie können die Ressource irgendwie in einer Datei speichern und von dort aus abspielen Dann ist alles viel einfacher. Sie können einfach den serienmäßigen TMediaPlayer verwenden.
Vergessen Sie nicht, die Datei zu löschen, wenn Sie fertig sind, sonst füllen Sie die Diskette.
http://codeverge.com/embarcadero.delphi.firemonkey/tmediaplayer-and-resource-files/1059748 –
Dies funktioniert nicht. Ich bekomme Tonnen von Fehlern im Zusammenhang mit dieser Klasse im Beispiel. – danshat
"Ich bekomme Tonnen von Fehlern" gibt uns nicht viel weiter. Viel Glück beim Aussortieren. –