delphi 裁剪mp3_用delphi编写mp3播放器

这篇博客介绍了如何使用Delphi编程语言创建一个MP3播放器,包括读取和编辑ID3标签信息。作者提供了一个示例代码,展示了如何填充和更改MP3文件的ID3元数据,如标题、艺术家、专辑、年份和评论。此外,还涵盖了文件夹选择和播放列表功能。
摘要由CSDN通过智能技术生成

发信人: pp_vivi(simon)

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons, MPlayer, ComCtrls, ExtCtrls;

type

TForm1 = class(TForm)

mp3player: TMediaPlayer;

mp3List: TListBox;

btnOpenFolder: TBitBtn;

GroupBox1: TGroupBox;

edTitle: TEdit;

edArtist: TEdit;

edAlbum: TEdit;

edYear: TEdit;

edGenre: TEdit;

edComment: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

txtFolder: TStaticText;

Progress: TProgressBar;

ProgresTimer: TTimer;

procedure btnOpenFolderClick(Sender: TObject);

procedure mp3ListClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure ProgresTimerTimer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

type

TID3Rec = packed record

Tag     : array[0..2] of Char;

Title,

Artist,

Comment,

Album   : array[0..29] of Char;

Year    : array[0..3] of Char;

Genre   : Byte;

end;

const

MaxID3Genre=147;

ID3Genre: array[0..MaxID3Genre] of string = (

'Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge',

'Hip-Hop', 'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop', 'R&B',

'Rap', 'Reggae', 'Rock', 'Techno', 'Industrial', 'Alternative', 'Ska',

'Death Metal', 'Pranks', 'Soundtrack', 'Euro-Techno', 'Ambient',

'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance', 'Classical',

'Instrumental', 'Acid', 'House', 'Game', 'Sound Clip', 'Gospel',

'Noise', 'AlternRock', 'Bass', 'Soul', 'Punk', 'Space', 'Meditative',

'Instrumental Pop', 'Instrumental Rock', 'Ethnic', 'Gothic',

'Darkwave', 'Techno-Industrial', 'Electronic', 'Pop-Folk',

'Eurodance', 'Dream', 'Southern Rock', 'Comedy', 'Cult', 'Gangsta',

'Top 40', 'Christian Rap', 'Pop/Funk', 'Jungle', 'Native American',

'Cabaret', 'New Wave', 'Psychadelic', 'Rave', 'Showtunes', 'Trailer',

'Lo-Fi', 'Tribal', 'Acid Punk', 'Acid Jazz', 'Polka', 'Retro',

'Musical', 'Rock & Roll', 'Hard Rock', 'Folk', 'Folk-Rock',

'National Folk', 'Swing', 'Fast Fusion', 'Bebob', 'Latin', 'Revival',

'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock',

'Psychedelic Rock', 'Symphonic Rock', 'Slow Rock', 'Big Band',

'Chorus', 'Easy Listening', 'Acoustic', 'Humour', 'Speech', 'Chanson',

'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass', 'Primus',

'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba',

'Folklore', 'Ballad', 'Power Ballad', 'Rhythmic Soul', 'Freestyle',

'Duet', 'Punk Rock', 'Drum Solo', 'Acapella', 'Euro-House', 'Dance Hall',

'Goa', 'Drum & Bass', 'Club-House', 'Hardcore', 'Terror', 'Indie',

'BritPop', 'Negerpunk', 'Polsk Punk', 'Beat', 'Christian Gangsta Rap',

'Heavy Metal', 'Black Metal', 'Crossover', 'Contemporary Christian',

'Christian Rock', 'Merengue', 'Salsa', 'Trash Metal', 'Anime', 'Jpop',

'Synthpop'  {and probably more to come}

);

implementation

uses ShellAPI, ShlObj;  // needed for the BrowseForFolder function

{$R *.DFM}

procedure FillID3TagInformation(mp3File:string; Title,Artist,Album,Year,Genre,Comment:TEdit);

var //fMP3: file of Byte;

ID3 : TID3Rec;

fmp3: TFileStream;

begin

fmp3:=TFileStream.Create(mp3File, fmOpenRead);

try

fmp3.position:=fmp3.size-128;

fmp3.Read(ID3,SizeOf(ID3));

finally

fmp3.free;

end;

{ or the non Stream approach - as in ChangeID3Tag procedure

try

AssignFile(fMP3, mp3File);

Reset(fMP3);

try

Seek(fMP3, FileSize(fMP3) - 128);

BlockRead(fMP3, ID3, SizeOf(ID3));

finally

end;

finally

CloseFile(fMP3);

end;

}

if ID3.Tag <> 'TAG' then begin

Title.Text:='Wrong or no ID3 tag information';

Artist.Text:='Wrong or no ID3 tag information';

Album.Text:='Wrong or no ID3 tag information';

Year.Text:='Wrong or no ID3 tag information';

Genre.Text:='Wrong or no ID3 tag information';

Comment.Text:='Wrong or no ID3 tag information';

end else begin

Title.Text:=ID3.Title;

Artist.Text:=ID3.Artist;

Album.Text:=ID3.Album;

Year.Text:=ID3.Year;

if ID3.Genre in [0..MaxID3Genre] then

Genre.Text:=ID3Genre[ID3.Genre]

else

Genre.Text:=IntToStr(ID3.Genre);

Comment.Text:=ID3.Comment

end;

end;

procedure ChangeID3Tag(NewID3: TID3Rec; mp3FileName: string);

var

fMP3: file of Byte;

OldID3 : TID3Rec;

begin

try

AssignFile(fMP3, mp3FileName);

Reset(fMP3);

try

Seek(fMP3, FileSize(fMP3) - 128);

BlockRead(fMP3, OldID3, SizeOf(OldID3));

if OldID3.Tag = 'TAG' then

{ Replace old tag }

Seek(fMP3, FileSize(fMP3) - 128)

else

{ Append tag to file because it doesn't exist }

Seek(fMP3, FileSize(fMP3));

BlockWrite(fMP3, NewID3, SizeOf(NewID3));

finally

end;

finally

CloseFile(fMP3);

end;

end;

procedure FillMP3FileList(Folder: string; sl: TStrings);

var Rec : TSearchRec;

begin

sl.Clear;

if SysUtils.FindFirst(Folder + '*.mp3', faAnyFile, Rec) = 0 then

try

repeat

sl.Add(Rec.Name);

until SysUtils.FindNext(Rec) <> 0;

finally

SysUtils.FindClose(Rec);

end;

end;

function BrowseDialog(const Title: string; const Flag: integer): string;

var

lpItemID : PItemIDList;

BrowseInfo : TBrowseInfo;

DisplayName : array[0..MAX_PATH] of char;

TempPath : array[0..MAX_PATH] of char;

begin

Result:='';

FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);

with BrowseInfo do begin

hwndOwner := Application.Handle;

pszDisplayName := @DisplayName;

lpszTitle := PChar(Title);

ulFlags := Flag;

end;

lpItemID := SHBrowseForFolder(BrowseInfo);

if lpItemId <> nil then begin

SHGetPathFromIDList(lpItemID, TempPath);

Result := IncludeTrailingBackslash(TempPath);

GlobalFreePtr(lpItemID);

end;

end;

procedure TForm1.btnOpenFolderClick(Sender: TObject);

var mp3Folder : string;

begin

mp3Folder := BrowseDialog('Choose a folder with mp3 files', BIF_RETURNONLYFSDIRS);

if mp3Folder = '' then Exit;

txtFolder.Caption := mp3Folder;

FillMP3FileList(mp3Folder, mp3List.Items);

end;

procedure TForm1.mp3ListClick(Sender: TObject);

var mp3File: string;

begin

if mp3List.Items.Count=0 then exit;

mp3File := Concat(txtFolder.Caption, mp3List.Items.Strings[mp3List.ItemIndex]);

if not FileExists(mp3File) then begin

ShowMessage('MP3 file '+#13#10+ mp3File +#13#10+'does not exist!');

exit;

end;

FillID3TagInformation(mp3File, edTitle, edArtist, edAlbum, edYear, edGenre, edComment);

Progress.Max:=0;

mp3player.Close;

mp3player.FileName:=mp3File;

mp3player.Open;

Progress.Max := mp3player.Length;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

txtFolder.Caption := ExtractFilePath(Application.ExeName);

FillMP3FileList(txtFolder.Caption, mp3List.Items);

Progress.Max:=0;

end;

procedure TForm1.ProgresTimerTimer(Sender: TObject);

begin

if Progress.Max<>0 then

Progress.Position := mp3player.Position;

end;

end.

{

********************************************

Zarko Gajic

[原文转载 北京社区精华区]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值