2016-03-24 4 views
0

Ich schreibe eine Android-App mit Firemonkey.Wiedergabe von .wav-Datei von Ressource

Aus diesem Grund kann ich MMSystem Funktion sndPlaySound nicht aus der Ressource-Datei spielen, weil das nur Windows ist.

Der Mediaplayer funktioniert und Ressourcen werden unter Firemonkey unterstützt. Der Media Player kann jedoch Ressourcendateien nicht direkt verwenden.

Wie kann ich mit TMediaPlayer einen Ton von einer Ressource wiedergeben?

+2

http://codeverge.com/embarcadero.delphi.firemonkey/tmediaplayer-and-resource-files/1059748 –

+0

Dies funktioniert nicht. Ich bekomme Tonnen von Fehlern im Zusammenhang mit dieser Klasse im Beispiel. – danshat

+0

"Ich bekomme Tonnen von Fehlern" gibt uns nicht viel weiter. Viel Glück beim Aussortieren. –

Antwort

3

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.

+1

Ich hätte es nicht besser sagen können :-) –