![]() |
WMA Tags lesen und SCHREIBEN
Hi,
kennt jemand eine Version der WMA-Unit der Audio Tools Library, welche die Tags auch speichern kann oder eine Methode Tags auszulesen und zu speichern ? |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Aber ich habe ne Unit welches beides kann, nicht von der Audio Tools Library. Zitat:
In verbindung mit wmvcore dürfte das nicht so schwer sein. Du benötigst die TGUIDS der Informationsheader die dazugehörigen Type Declarationen usw.. Ist aber alles im SDK beschrieben. Dein Problem ist lediglich den C++ code nach Delphi zu übersetzen. Glaube nicht das es von MS ne UNIT dafür gibt. gruß |
Re: WMA Tags lesen und SCHREIBEN
Ok, aber wo ist dann die Unit, die du ja in deinem Projekt benutzt hast ?
|
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Unterwegs. gruß |
Re: WMA Tags lesen und SCHREIBEN
Thx.
|
Re: WMA Tags lesen und SCHREIBEN
Hi EWeiss,
evtl. kannst Du die Unit ja hier anhängen, falls andere die gleichen Probleme haben. |
Re: WMA Tags lesen und SCHREIBEN
Liste der Anhänge anzeigen (Anzahl: 2)
Was du mir da geschickt hast kann nicht laufen.
Show PIC ... Jahr als Titel Genre als Titel So kann das nix werden. das muss einen Laufzeitfehler auslösen :wink: Test.jpg ist OK da ist nix mit komischen zeichen. gruß |
Re: WMA Tags lesen und SCHREIBEN
Wieso kann das nicht laufen ?
Ich verstehe dich nicht.
Delphi-Quellcode:
procedure TAudioFile.GetWMAInfo(filename:String);
var TagsData: PTagsData; begin New(TagsData); try OpenWMAFile(filename, TagsData); fArtist := TagsData.Author; fTitel := TagsData.Title; fAlbum := TagsData.Album; fGenre := TagsData.Genre; fYear := TagsData.Year; fTrack := TagsData.Track; fKommentar := TagsData.Comments; finally DisPose(TagsData); FPfad := filename; FOrdner := ExtractFileDir(filename); FDateiname := filename; end; end; procedure TAudioFile.SaveWMAInfo(filename,a,b,c,d,e,f,g: String); var TagsData: PTagsData; begin New(TagsData); try TagsData.Title := a; TagsData.Author := b; TagsData.Album := c; TagsData.Genre := d; TagsData.Year := e; TagsData.Track := f; TagsData.Comments := g; SaveWMAFile(TagsData); finally Dispose(TagsData); end; end; |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Du kannst bei Jahr keine Strings addieren und dann ins WMA Format schreiben. Das verursacht beim einladen einen AV. Jahr ist ein numerischer wert kein string. Das selbe gilt für Track gruß EDIT: Alle Dateien von Windows habe ich getestet (die sich im system befinden) Alle aber auch alle, funktionieren einwandfrei ohne Fehler. Kann es sein das du in die Datei schreibst während sie am laufen ist? |
Re: WMA Tags lesen und SCHREIBEN
Du meinst, ich soll aus Track und Year Integer machen ? Gerade das geht nicht....
|
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Wie du auf dem Bild sehen kannst steht an der stelle von Jahr 'asd' Da sollte schon ein reales Jahr in nummern stehen. (kann ruhig als string übergeben werden) Die Datei hat bei mir direkt ein AV verursacht. Ansonsten wie oben schon geschrieben unter EDIT: Alle Dateien von Windows habe ich getestet (die sich im system befinden) Alle aber auch alle, funktionieren einwandfrei ohne Fehler. Kann es sein das du in die Datei schreibst während sie am laufen ist? ;) gruß |
Re: WMA Tags lesen und SCHREIBEN
Und noch etwas!!
Manche WMA Dateien sind mit dem 'DRM' Digital Rights Management gegen Raubcopien geschützt. Versuchst du diese zu überschreiben wirst du kein glück haben. Auch das verursacht unweigerlich einen AV. Nur Private Dateien können mt dieser Unit beschrieben und auch zurückgelesen werden. Diese ist kein Hack für DRM geschützte Dateien. Gruß |
Re: WMA Tags lesen und SCHREIBEN
Liste der Anhänge anzeigen (Anzahl: 1)
Ob da ein reeles Datum steht oder nicht ist bei meinem Player nicht AV gefährdet.
Damit du es dir besser vorstellen kannst, hier ein Bild davon: |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Das ist dein Problem, hat aber nichts mit der WMA Unit zu tun. Den Titel bekommst du wenn du den WMATag einliest bevor du die Liste füllst. if WMA then read tag und addiere zur Playlist. Du mußt doch nur den Titel von fTitel an die Playliste übergeben. Kann nicht sehen was da in deinen Code vorgeht. gruß |
Re: WMA Tags lesen und SCHREIBEN
Delphi-Quellcode:
Da kann nichts schief laufen.
procedure TfrmMain.UpdateListBox;
var i : integer; begin lbList.Clear; lbList.Items.BeginUpdate; for i := 0 to length(fFiles) - 1 do begin if lbList.Items.Add(fFiles[i].Artist + ' - ' + fFiles[i].Titel + ' [' + trim(DurationMinSec(IntToStr(GetSongLength))) + ']'); end; lbList.Items.EndUpdate; end; Nachtrag:
Delphi-Quellcode:
TAudioFile = class
private FPfad: string; FDateiname: string; FOrdner: string; FDateiGroesse: Integer; //WMA-Tags FWMATrack : Integer; FWMAYear : Integer; //OggVorbis-Tags FOggTrack: Word; // aus den ID3-Tags (oder andere Meta-Tags) FArtist: string; FTitel: string; FAlbum: string; FTrack: WideString; FYear: string; FGenre: string; FKommentar: string; FLyrics: string; // aus den MPEG-Infos FDauer: Integer; FBitrate: word; Fvbr: boolean; FChannelMode: String; FSamplerate:Integer; FEndung: String; procedure SetNA(filename: String); procedure GetMP3Info(filename:string); procedure GetWMAInfo(filename:string); procedure GetWAVInfo(filename:string); procedure GetAIFFInfo(filename:string); procedure GetOGGInfo(filename:string); public property pfad: string read FDateiname; property Dateiname: string read FDateiname; property Ordner: string read FOrdner; property DateiGroesse: Integer read FDateiGroesse; // OGG-Tags property OGGTrack: word read FOggTrack; // aus den ID3-Tags (oder andere Meta-Tags) property Artist: string read FArtist; property Titel: string read FTitel; property Album: string read FAlbum; property Track: widestring read FTrack; property Year: string read FYear; // Ja, ein String! property Genre: string read FGenre; property Kommentar: string read FKommentar; property Lyrics: string read FLyrics; // aus den MPEG-Infos property Dauer: Integer read FDauer; property Bitrate: word read FBitrate; property vbr: boolean read Fvbr; property ChannelMode: String read FChannelMode; property Samplerate:Integer read FSamplerate; property Endung : string read FEndung write FEndung; constructor create; destructor destroy; override; procedure GetAudioData(filename:string); procedure SaveMP3Info(filename,titel,artist,album,track,year,comment,genre:string); procedure SaveWMAInfo(filename,a,b,c,d,e,f,g: String); end; |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Hoffe doch das du das array von fFiles als public declariert hast. Vergleich die zeile doch mal mit dieser welche den Lauftext ausgibt. gruß |
Re: WMA Tags lesen und SCHREIBEN
WatchList:
Delphi-Quellcode:
fFiles[i].Titel: 'Test 3 wmaf'#0#$16#0#1
|
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Stehe jetzt auch auf den schlauch warum sich der Titel dann nicht in deine Liste addiert. hat aber definitiv nix mit der WMA Unit zu tun. :) gruß |
Re: WMA Tags lesen und SCHREIBEN
Hm, bei der ATL-Unit lief das einwandfrei. Warum da Zeichen im Lauftext sind ist klar, denn man beachte
#0#$16#0#1. Wie bekomm ich wenigstens erstmal das raus. |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
wert hinter den Namen in nil zu konvertieren. Keine ahnung obs sowas ähnliches in Delphi auch gibt. gruß |
Re: WMA Tags lesen und SCHREIBEN
Ich denke es liegt an den Pointern. Pointer machen nie, was man will. Das nur Artist in de rListbox steht ist kein Wunder, denn der String wird durch #0 terminiert. Es gibt da den Copy-Befehl, aber die Zeichenfolge nach dem String wird vlt. von WMA zu WMA unterschiedlich sein und somit könnte das schwer werden.
|
Re: WMA Tags lesen und SCHREIBEN
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Die zeichenfolge nach dem string ist abhängig vom Titel. Dürfte aber uninteressant sein. Du mußt den String spliten mit dem Delemiter "'" und alles wegschneiden was hinter dem 2 "'" zeichen steht. Dann bleibt nur noch 'ads' übrig. NE andere Idee habe ich da auch nicht. |
Re: WMA Tags lesen und SCHREIBEN
Warum funktioniert es bei dir, aber nicht bei mir :shock: ?
In der Tagform wird alles korrekt angezeigt, aber nicht in der Playlist und im Lauftext. |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Properties TEDIT von meinen Sample. Möglich das dort das problem liegt. Gruß |
Re: WMA Tags lesen und SCHREIBEN
Hm? Die Tags sind in deiner Demo genauso, wie bei mir, nur in der Playlist und im Lauftext nicht.
|
Re: WMA Tags lesen und SCHREIBEN
Zitat:
gruß |
Re: WMA Tags lesen und SCHREIBEN
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
[ironie]Und noch was: Warum lädt immer jeder alles runter, obwohl ihn wahrscheinlich nur der Code interessiert...oh was ist denn das lad es mir mal runter.[/ironie] Eine ähnliche Unit kriegt ihr übrigens kostenlos im DF....
fFiles : Array of TAudioFile;
Hier mal die Unit, in der TAudioFile steht: |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Nur zum testen .. leg mal ein TEdit in deiner form an. und weise den einen index 0 zu. So das dieses als array angesprochen wird. Dann lade die TEDIT dynamisch zur laufzeit.. und weise diesen den Titel zu. Übergeben den Titel von TEDIT(1) oder was auch immer an die Playlist und schau was passiert. gruß |
Re: WMA Tags lesen und SCHREIBEN
Ich habe es so gemacht:
Delphi-Quellcode:
Das Ergebniss:
//Lauftext
PlayFile(playindex); with fFiles[playindex] do begin s := Artist + ' - ' + Titel + ' [' + trim(DurationMinSec(IntToStr(GetSongLength))) + ']'; lLauftext.Text := s; lLauftext.Active := True; lLauftext.Transparent := True; Application.Title := s; Memo1.Lines.Add(s); end;
Delphi-Quellcode:
Der String wird terminiert. Das mit dem Copy wird auch mit deinem Prinzip sehr schwer, da sich die Zeichenfolge in der einen Datei z.B. 5 Zeichen lang ist und in der Anderen z.B. 7. Wir sollten dem Fehler auf den Grund gehen, anders geht es nicht, selbst wenn ist es sehr schlecht und fehleranfällig.
PaulE
|
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Hätte auch eine Lösung anzubieten. Simple :)
Delphi-Quellcode:
Bei mir wird beim Debuggen alles einwandfrei ohne zusätze angezeigt.
Var
RTitle: Shortstring; RArtist: Shortstring; procedure TForm1.OpenPBClick(Sender: TObject); var TagsData: PTagsData; begin if not opendialog1.Execute then exit; ClearAll; lblFileName.Caption := opendialog1.FileName; SavePB.Enabled := true; New(TagsData); try OpenWMAFile(opendialog1.FileName, TagsData); fFilesize.Text := inttostr(TagsData.FileSize) + ' bytes'; fDuration.Text := DurationToStr(TagsData.Duration, true) + ' sec '; fBitRate.Text := inttostr(TagsData.BitRate div 1000) + ' kbit'; fVBR.Text := booltostr(Tagsdata.VBR, true); fEncoder.Text := TagsData.Version; fGenre.Text := TagsData.Genre; fArtist.Text := TagsData.Author; fComposer.Text := TagsData.Composer; fTitle.Text := TagsData.Title; fAlbum.Text := TagsData.Album; fYear.Text := TagsData.Year; fTrack.Text := TagsData.Track; fURL.Text := TagsData.Url; fCopyRight.Text := TagsData.CopyRight; fComments.Text := TagsData.Comments; fLyrics.Text := TagsData.Lyrics; finally DisPose(TagsData); end; // Schau hier das wars! RTitle := fTitle.Text; RArtist := fArtis.Text; s := RArtist + ' - ' + RTitle + ' [' + trim(DurationMinSec(IntToStr(GetSongLength))) + ']'; end; EDIT: Könnte reichen wenn du deine Strings mal nach ShortString ändern würdest! Gruß |
Re: WMA Tags lesen und SCHREIBEN
Hm so leicht geht das garnicht, denn WMAFile.Read liegt schließlich in der Unit tags. Ich weise es vorher auch auf kein Edit zu. Was müsste ich dann noch am eben genanntem Lösungsweg ändern. Shortstring ändert übrigens nichts.
|
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Werde ihn vernichten wenn das problem gelößt ist. Hat so keinen sinn.. ich hab Delphi 2006 und du die 7 Version. KA ob die compiler im verhalten gleich sind. Nur ne simple Unit nutzt mir da nix gruß |
Re: WMA Tags lesen und SCHREIBEN
Liste der Anhänge anzeigen (Anzahl: 1)
So!
Neuer Versuch.. Habe jetzt mal die Funktion Split aus VB nach Delphi umgesetzt. Verstehe nicht das so eine einfache Funktion in Delphi nicht zur verfügung steht. Nun gut dann teste es einfach mal.
Delphi-Quellcode:
Type
TSplitStrArray = array of String; end; function Split(const Source, Delimiter: String): TSplitStrArray; var spCount: Integer; spPos: Integer; spLength: Integer; sTemp: String; aSplit: TSplitStrArray; begin sTemp := Source; spCount := 0; spLength := Length(Delimiter) - 1; repeat spPos := Pos(Delimiter, sTemp); if spPos = 0 then break else begin Inc(spCount); SetLength(aSplit, spCount); aSplit[spCount - 1] := Copy(sTemp, 1, spPos - 1); Delete(sTemp, 1, spPos + spLength); end; until False; if Length(sTemp) > 0 then begin Inc(spCount); SetLength(aSplit, spCount); aSplit[spCount - 1] := sTemp; end; Result := aSplit; end; Aufrufen mit !
Delphi-Quellcode:
Bei mir funktioniert es hundert pro
var
spSource: TSplitStrArray; spDest: string; Begin spSource := Split(TagsData.Author, #0); spDest := Trim(spSource[0]); end; Geht bestimmt besser habe aber auf die schnelle nichts besseres umsetzen können. Habs getestet Trim geht nicht erst dann wenn du die Daten durch die Split funktion gejagt hast. gruß |
Re: WMA Tags lesen und SCHREIBEN
Zitat:
Hmm zu schnell geklickt .. Entschuldigung!! |
Re: WMA Tags lesen und SCHREIBEN
Danke, jetzt funktioniert es.
|
Re: WMA Tags lesen und SCHREIBEN
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Hier mal mein Player .. gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz