Zapisywanie do pliku

0

Witam. Zna ktoś może sposób aby ten wycięty kawałek piosenki zapisać do osobnego pliku na dysk? Tutaj jest cały kod.

unit knif;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, MPlayer, ExtCtrls, Math;
 
type
  TForm1 = class(TForm)
    prezentacja: TEdit;
    PLAY: TButton;
    STOP: TButton;
    PAUSE: TButton;
    OPEN: TButton;
    SAVE: TButton;
    CLIPINFORMATION: TGroupBox;
    beginposition: TEdit;
    endposition: TEdit;
    lenght: TEdit;
    SS: TButton;
    SE: TButton;
    TrackBar1: TTrackBar;
    CURRENTTIME: TGroupBox;
    currenttim: TEdit;
    OpenDialog1: TOpenDialog;
    muza: TMediaPlayer;
    Label1: TLabel;
    Timer1: TTimer;
    SaveDialog1: TSaveDialog;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure OPENClick(Sender: TObject);
    procedure PLAYClick(Sender: TObject);
    procedure STOPClick(Sender: TObject);
    procedure PAUSEClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure muzaClick(Sender: TObject; Button: TMPBtnType;
      var DoDefault: Boolean);
    procedure SAVEClick(Sender: TObject);
    procedure SSClick(Sender: TObject);
    procedure SEClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  x :real;
  y : real;
  koniec : real;
  poczatek : real;
  z : string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.OPENClick(Sender: TObject);
begin
try
if Opendialog1.Execute then begin
PLAY.Enabled := true;
STOP.Enabled := true;
PAUSE.Enabled := true;
 
 
 
end;
except
end;
 
end;
procedure TForm1.PLAYClick(Sender: TObject);
begin
muza.FileName := OpenDialog1.FileName;
muza.open;
TrackBar1.Max := muza.Length;
muza.play;
SS.Enabled := true;
SE.Enabled := true;
end;
 
procedure TForm1.STOPClick(Sender: TObject);
begin
muza.FileName := OpenDialog1.FileName;
muza.open;
TrackBar1.Max := muza.Length;
muza.Stop;
end;
 
procedure TForm1.PAUSEClick(Sender: TObject);
begin
muza.FileName := OpenDialog1.FileName;
muza.open;
TrackBar1.Max := muza.Length;
muza.Pause;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
PLAY.Enabled := false;
STOP.Enabled := false;
PAUSE.Enabled := false;
SS.Enabled := false;
SE.Enabled := false;
SAVE.Enabled := false;
end;
 
 
 
procedure TForm1.muzaClick(Sender: TObject; Button: TMPBtnType;
  var DoDefault: Boolean);
begin
muza.FileName := OpenDialog1.FileName;
muza.open;
end;
 
procedure TForm1.SAVEClick(Sender: TObject);
begin
x := koniec-poczatek;
z := FloatToStr(x);
SaveDialog1.execute;
 
 
 
end;
 
procedure TForm1.SSClick(Sender: TObject);
 
 
begin
  poczatek := muza.Position/1000;
  Label2.Caption := FloatToStr(RoundTo(poczatek,0));
  if StrToFloat(Label4.Caption) > 0 then SAVE.Enabled := true;
end;
 
procedure TForm1.SEClick(Sender: TObject);
begin
  koniec := muza.Position/1000;
  Label3.Caption := FloatToStr(RoundTo(koniec,0));
  Label4.Caption := FloatToStr(RoundTo(koniec-poczatek,0));
  if StrToFloat(Label4.Caption) > 0 then SAVE.Enabled := true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
 
begin
y := muza.Position/1000;
TrackBar1.Position := muza.Position;
Label1.Caption := FloatToStr(RoundTo(y,0));
 
 
end;
 
end.
 
0

W swoim i tak beznadziejnie sformatownym kodzie nigdzie nie wykonujesz żadnej kopii fragmentu pliku. Najprościej było by jakoś, ale nie bardzo wiem jak bo nie korzystam z TMediaPlayer, wyliczyć na podstawie position - ilośc bajtów wczytanego pliku, a następnie przy użyciu funkcji WinAPI, takich jak CreateFile, ReadFile, WriteFileoraz na końcu CloseHandle, a przede wszystkim FileSeek - opisanej tutaj: FileSeek wyodrębnić kawałek utworu. Jednak nie testowałem tego rozwiązania i nie wiem czy na przykład taki plik mp3 wycięty binarnie będzie się nadawal później do prawidłowego odtworzenia w programach typu playery mp3. Funkcje masz opisane dokładniej na MSDNie, a poza tym w google znajdziesz mnóstwo przykładów ich użycia także w Delphi. Poza tym dodam, że takie wycinanie zadziała chyba tylko z mp3 i może wav, a do tego celów polecam bibliotekę BASS z www.un4seen.com - posiada ona funkcje BASS_ChannelGetPosition oraz ewentualnie BASS_ChannelBytes2Seconds. Pliki modułów trackerowych tak nie wytniesz - wiadomo, ale z mp3 i wav możesz spróbować. Poza tym ta biblioteka znacznie bardziej nadaj się do odtwarzania mp3ek i wave'ów niż zawdony MediaPlayer, który na przykład na starym Windowsie XP przez jakieś namieszanie w systemie nie widział urządzeń MCI i mógl odtwarzać tylko wave'y, bo z mp3kami oraz płytami audio już był problem. A do biblioteki bass masz dołaczone dema również w Delphi jak i dokumentacje, także powinieneś ogarnąc. Powodzenia.

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