TResourceStream odtwarzanie (MPEG,MP3)

0

Witam,

Tworzę pewną aplikację w której chciałbym wykorzystać podkład muzyczny oraz jakies intro (Plik wiedo w formacie MPEG). Mój problem polega na tym iż chciałbym wszystkie pliki mp3 jak i mpeg umieścić w zasobach programu i z zasobów je odtwarzac. Niestety nie znalazłem żadnych komponentów które umożliwiały by tego typu możliwość (komponenty bez dodatkowych bibliotek dll) Sam za bardzo nie wiem w jaki sposób się za to zabrać od zera a dla przykładu standardowy TMediaPlayer posiada wyłącznie możliwość odtwarzania po nazwie pliku. Jeżeli ktoś ma jakiś pomysł lub tworzył tego typu aplikację proszę o jakies sugestie.

Dziękuję i Pozdrawiam.

0
Młody napisał(a)

GOOGLE NIE BOLI :/

http://delphi.about.com/od/objectpascalide/a/embed_resources.htm

Czytanie ze zrozumieniem również. Zapewne gdybyś przejrzał link który podałeś wiedziałbyś że nie jest to odpowiedź na moje pytanie.

http://delphi.about.com/od/objectpascalide/a/embed_resources.htm napisał(a)

begin
{this part extracts the mp3 from exe}

Wypakowanie pliku z zasobów na dysk po czym odtworzenie go za pomocą TMediaPlayer to niestety nie to samo co odtwarzanie "prosto" z zasobów.

Pozdrawiam

0

Do odtworzenia mp3 lub modułu z zasobów wykorzystaj poniższy kod. To unit zawierający najprostsze
funkcje do odtworzenia plików wav/mp3/ogg lub modułu mod/s3m/it/xm z dysku lub z zasobów. Jeżeli
odtwarzasz plik z zasobów to musi on być dołączony oczywiście do źródla, a wcześniej stworzony przy
użyciu brcc2.exe z podkatalogu bin. A plik rc musi wyglądać na przykład tak jak tutaj poniżej pokazuje:

nazwa_zasobu    rcdata   "DANE\plik.mp3"

I teraz jeżeli funkcja InicjujBibliotekeBass zwróci True to odtwarzasz mp3 lub wav z zasobów używając
do tego procedury OdtwarzajDzwiekZasoby. Oczywiście moduł nie korzysta ze wszystkich możliwości w
jakie wyposażono bass.dll. Więcej przykładów także w Delphi i samą bibliotekę, znajdziesz na stronie:
http://un4seen.com/download.php?bass24 a jeżeli chodzi o odtarzanie bez użycia biblioteki to nie za
bardzo wiem, nie mam też pomysłu jak odtworzyć filmik z zasobów, lecz pewnie i do tego są biblioteki.

unit bassfile;

interface

uses
  Forms, Windows, Dialogs, SysUtils;

const
  Sound_Dll_Nazwa = 'bass.dll';
  BASS_SAMPLE_LOOP = 4;
  BASS_MUSIC_RAMPS = $400;
  BASS_STREAM_PRESCAN = $20000;
  BASS_MUSIC_PRESCAN = BASS_STREAM_PRESCAN;

type
  HMUSIC = DWORD;
  HSTREAM = DWORD;
  BOOL = LongBool;
{$WARNINGS OFF}
var
  Chn : DWord;
  Dll_H : THandle;
  MyResource : HRSRC;
  MyGlobal : HGLOBAL;
  PResource : Pointer;
  ResSize : Integer;
  BASS_Init : function(device : Integer; freq, flags : DWORD; win : HWND; clsid : PGUID) : BOOL; stdcall;
  BASS_MusicLoad : function(mem : BOOL; f : Pointer; offset, length, flags, freq : DWORD) : HMUSIC; stdcall;
  BASS_StreamCreateFile : function(mem : BOOL; f : Pointer; offset, length, flags : DWORD) : HSTREAM; stdcall;
  BASS_ChannelPlay : function(handle : DWORD; restart : BOOL) : BOOL; stdcall;
  BASS_ChannelStop : function(handle : DWORD) : BOOL; stdcall;
  BASS_Free : function : BOOL; stdcall;
function InicjujBibliotekeBass : boolean;
procedure ZwolnijBibliotekeBass;
procedure OdtwarzajDzwiekPlik(NazwaPliku : PChar; CzyLoop : boolean);
procedure OdtwarzajModulPlik(NazwaPliku : PChar; CzyLoop : boolean);
procedure OdtwarzajDzwiekZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
procedure OdtwarzajModulZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
procedure ZatrzymajOdtwarzanie;

implementation

function InicjujBibliotekeBass : boolean;
begin
  Result := True;
  if not FileExists(Sound_Dll_Nazwa) then
  begin
    Result := False;
    MessageBox(Application.Handle,
      PChar('Nie można znaleźć pliku: ' + Sound_Dll_Nazwa + '!' + #13#10 +
      'Odtwarzanie dźwieków nie będzie możliwe.'),
      PChar(Application.Title), MB_OK + MB_ICONERROR);
    Exit;
  end;

  Dll_H := LoadLibrary(PChar(Sound_Dll_Nazwa));

  if Dll_H = 0 then
  begin
    Result := False;
    MessageBox(Application.Handle,
      PChar('Nie można załadować pliku: ' + Sound_Dll_Nazwa + '!' + #13#10 +
      'Odtwarzanie dźwieków nie będzie możliwe.'),
      PChar(Application.Title), MB_OK + MB_ICONERROR);
    Exit;
  end;

  BASS_Init := GetProcAddress(Dll_H, 'BASS_Init');
  BASS_MusicLoad := GetProcAddress(Dll_H, 'BASS_MusicLoad');
  BASS_StreamCreateFile := GetProcAddress(Dll_H, 'BASS_StreamCreateFile');
  BASS_ChannelPlay := GetProcAddress(Dll_H, 'BASS_ChannelPlay');
  BASS_ChannelStop := GetProcAddress(Dll_H, 'BASS_ChannelStop');
  BASS_Free := GetProcAddress(Dll_H, 'BASS_Free');

  if (@BASS_Init = nil)
    or (@BASS_MusicLoad = nil)
    or (@BASS_StreamCreateFile = nil)
    or (@BASS_ChannelPlay = nil)
    or (@BASS_ChannelStop = nil)
    or (@BASS_Free = nil) then
  begin
    Result := False;
    MessageBox(Application.Handle,
      PChar('Nieprawidłowa biblioteka: ' + Sound_Dll_Nazwa + '!' + #13#10 +
      'Odtwarzanie dźwieków nie będzie możliwe.'),
      PChar(Application.Title), MB_OK or MB_ICONERROR);
    Exit;
  end;

  if not BASS_Init(-1, 44100, 0, Application.Handle, nil) then
  begin
    Result := False;
    MessageBox(Application.Handle,
      'Błąd podczas inicjalizacji audio!',
      PChar(Application.Title), MB_OK + MB_ICONERROR);
    Exit;
  end;
end;

procedure ZwolnijBibliotekeBass;
begin
  BASS_Free;
  FreeLibrary(Dll_H);
end;

procedure OdtwarzajDzwiekPlik(NazwaPliku : PChar; CzyLoop : boolean);
var
  Loopowanie : integer;
  SoundFileName : PChar;
begin
  if (CzyLoop = True) then
  begin
    Loopowanie := BASS_SAMPLE_LOOP;
  end
  else
  begin
    Loopowanie := 0;
  end;

  SoundFileName := NazwaPliku;
  Chn := BASS_StreamCreateFile(False, SoundFileName, 0, 0, Loopowanie);
  BASS_ChannelPlay(Chn, False);
end;


procedure OdtwarzajModulPlik(NazwaPliku : PChar; CzyLoop : boolean);
var
  Loopowanie : integer;
  ModuleFileName : PChar;
begin
  if (CzyLoop = True) then
  begin
    Loopowanie := BASS_SAMPLE_LOOP;
  end
  else
  begin
    Loopowanie := 0;
  end;

  ModuleFileName := NazwaPliku;
  Chn := BASS_MusicLoad(False, ModuleFileName, 0, 0, Loopowanie, 0);
  BASS_ChannelPlay(Chn, False);
end;

procedure OdtwarzajDzwiekZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
var
  Loopowanie : integer;
  SoundResourceName : PChar;
begin
  if (CzyLoop = True) then
  begin
    Loopowanie := BASS_SAMPLE_LOOP;
  end
  else
  begin
    Loopowanie := 0;
  end;

  SoundResourceName := NazwaZasobu;
  MyResource := FindResource(HInstance, SoundResourceName, RT_RCDATA);
  if MyResource = 0 then
  begin
    MessageBox(Application.Handle,
      'Nie można znaleźć zasobu z dźwiękiem!',
      PChar(Application.Title), MB_OK + MB_ICONWARNING);
    Exit;
  end;

  MyGlobal := LoadResource(HInstance, MyResource);
  PResource := LockResource(MyGlobal);
  ResSize := SizeOfResource(HInstance, MyResource);
  Chn := BASS_StreamCreateFile(True, PResource, 0, ResSize, Loopowanie);
  BASS_ChannelPlay(Chn, False);
  FreeResource(MyGlobal);
end;

procedure OdtwarzajModulZasoby(NazwaZasobu : PChar; CzyLoop : boolean);
var
  Loopowanie : integer;
  ModuleResourceName : PChar;
begin
  if (CzyLoop = True) then
  begin
    Loopowanie := BASS_SAMPLE_LOOP;
  end
  else
  begin
    Loopowanie := 0;
  end;

  ModuleResourceName := NazwaZasobu;

  MyResource := FindResource(HInstance, ModuleResourceName, RT_RCDATA);
  if MyResource = 0 then
  begin
    MessageBox(Application.Handle,
      'Nie można znaleźć zasobu z modułem muzycznym!',
      PChar(Application.Title), MB_OK + MB_ICONWARNING);
    Exit;
  end;

  MyGlobal := LoadResource(HInstance, MyResource);
  PResource := LockResource(MyGlobal);
  ResSize := SizeOfResource(HInstance, MyResource);
  Chn := BASS_MusicLoad(True, PResource, 0, ResSize, Loopowanie, 0);
  BASS_ChannelPlay(Chn, False);
  FreeResource(MyGlobal);
end;

procedure ZatrzymajOdtwarzanie;
begin
  BASS_ChannelStop(Chn);
end;
{$WARNINGS ON}
end.
0

Dzięki za podany kod, jednak możliwości związane z odtwarzaniem plików z zasobów za pomocą zewnętrznych bibliotek znam (jeżeli chodzi o pliki MPEG można to zrobić za pomocą biblioteki MPEG2Lib http://www.logicnet.dk/lib/ ). Jednak myślałem że istnieje jakiś mniej skomplikowany sposób który pozwoli się bez nich obejść. Spróbuję pójść tym tropem i poszukać być może systemowych bibliotek które na to pozwalają, gdyż pisanie własnej obsługi kodeka [ http://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html ] (dekodera) jest raczej nie opłacalne.

Dzięki jeszcze raz za pomoc i poświęcenie czasu.

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1