2016-03-24 18 views
0

Firemonkey kullanarak bir android uygulaması yazıyorum.Yürütme .wav dosyasından kaynak

Bu nedenle, yalnızca Windows işletim sistemi olduğundan kaynak dosyadan oynatmak için MMSSystem işlevinin sndPlaySound işlevini kullanamıyorum.

Medya yürütücüsü işleri ve kaynakları Firemonkey altında desteklenir. Ancak medya oynatıcı kaynak dosyalarını doğrudan kullanamaz.

Kaynaktan TMediaPlayer kullanarak nasıl ses çalarım? Bir dosyada değil

+2

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

+0

Bu işe yaramıyor. Örneğin bu sınıfla ilgili tonlarca hata alıyorum. – danshat

+0

"Tonlarca hata alıyorum", devam etmemiz için çok şey vermiyor. Bunu sıralamak için iyi şanslar. –

cevap

3

To quote Remy Lebeau (TeamB):

Çalma medya

TMediaPlayer doğal olmayan herhangi bir dosya sistemi veri kaynaklarını uygulamıyor

, böylece kendi özel codec'i uygulamak zorunda kalacak/ortam Ancak, kaynak verilerini (ve oynat) kaynak olarak kullanabilirsiniz. TMediaPlayer'ın kendi DosyaAdı bir dosya sistemi üzerinde mevcut olup olmadığını umurumda değil . Sadece TMediaCodecManager sınıfına erişmek için uygun bir TMedia nesnesini geri almak ve DosyaName'nin hangi kaynaktan geldiği kaynağından veri çalmasını ister.

FMX.Media.TMedia'dan türetilen özel bir sınıf oluşturun ve gerektiğinde soyut yöntemlerini uygulayın (DoPlay(), DoStop(), GetDuration(), vb.). Bu sınıfı, gerçek medya verilerine erişir ve oynatır, böylece istediğiniz DosyaAdı'nı geçirebilir ve gerektiğinde kaynak akışınızı yükleyebilir/erişebilir. Örnekler için varsayılan TMedia uygulamalarında 'a bakın (FMX.Media.Win.TWindowsMedia, FMX.Media.Mac.TQTMedia, vb.).

FMX.Media.TCustomMediaCodec türetilmiş bir özel sınıf oluşturun ve özel TMedia sınıfının bir örneğini döndürmek için onun soyut CreateFromFile() yöntemini uygulamak. Daha sonra bu sınıfı program başlangıcında FMX.Media.TMediaCodecManager.RegisterMediaCodecClass() kullanarak kaydedebilirsiniz. Bu hile, 'un bir dosya uzantısını kullanarak sınıfa kayıt olmanız gerektiğinden, gerçek bir dosya için benzersiz ve karıştırılamayacak bir şey olan bir şey seçin. Örneğin

:

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); 

Sonra bunu yapabilirsiniz:

MediaPlayer1.FileName := 'MyResourceName.myres'; 
MediaPlayer1.Play; 
end; 

-

Ya da sadece bir dosyaya kaynak kaydedebilirsiniz
ise Bir şekilde kaynağı bir dosyaya kaydedebilir ve o zaman her şey çok daha kolay. Sadece TMediaPlayer ürününü kullanabilirsiniz.
Oynatmayı bitirdiğinizde dosyayı silmeyi unutmayın, aksi takdirde diski doldurursunuz.

+1

Kendim daha iyi diyemezdim :-) –

İlgili konular