| Autor |
Beitrag |
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 09.05.06 17:08
hi,
ich habe eine .mp3 Datei folgendermaßen aufgesplittet:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.Button1Click(Sender: TObject); var datei,neueDatei:string; stream,neu:tfilestream; i,x:integer; begin
datei:=extractfilepath(application.ExeName)+'test.mp3'; stream:=tfilestream.Create(datei,0);
neu:=tfilestream.Create(datei+'.tmp',fmCreate or fmShareExclusive); neu.CopyFrom(stream,stream.Size);
stream.Free;
i:= neu.Size div (1024 * 128); neu.Seek(0,0);
for x := 1 to i do begin neueDatei:=extractfilepath(application.ExeName)+'part_'+inttostr(x)+'.mp3'; stream:=tfilestream.Create(neueDatei,fmCreate or fmShareExclusive);
stream.CopyFrom(neu,1024 * 128);
stream.Free;
neu.Seek(1024 * (128 * x),0); end;
neu.Free; end; |
Nun habe ich einige .mp3 Dateien in meinem Ordner liegen.
Meine Frage nun: wie kann ich diese nahtlos wieder abspielen lassen?
Sicher ich könnte die .mp3 wieder so zusammensetzten, wie ich sie getrennt habe, aber dann könnte ich je gleich die ganze .mp3 abspielen.
Ich lade zb. die erste .mp3 in den Mediaplayer:
Delphi-Quelltext 1: 2: 3:
| mdeiaplayer1.filename:='part_1.mp3'; mediaplayer1.open; mediaplayer1.play; |
Wie könnte ich jetzt die part_2.mp3 nahtlos anfügen, sodass man den übergang der beiden einzelen Dateien nicht merkt?
Kann ich die part_2.mp3 während einer wiedergabe hinten anfügen?
thx hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Di 09.05.06 17:52
Es dürfte seehr schwer werden, wenn du sie so splittest, da du auch die MPG-Blöcke zerhackst. An deiner Stelle würde ich die im ganzem abspielen (wo liegt da das Problem, dass du es nicht willst?). Oder du kannst natürlich auch die MPG per Hand auseinander nehmen und an das System zum abschicken spielen (Aufwand=Nutzten geht gegen Unendlich  ). Wenn du eine gescheite Trennung hinbekommst, reicht es 2 Medienplayer zu nehmen, und sobald der eine fertig ist den anderen einsetzten lassen (am besten mit übergängen, da du nicht ms-genau arbeiten kannst --> würde zu Stockungen kommen  ).
mfg
Heiko
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 09.05.06 17:56
Also ich kann jedes einzelne Teil abspielen, zb. in Winamp.
Auch in Delphi mit dem Mediaplayer kann ich jede Datei abspielen.
Heiko hat folgendes geschrieben: | [...] reicht es 2 Medienplayer zu nehmen, und sobald der eine fertig ist den anderen einsetzten lassen (am besten mit übergängen, da du nicht ms-genau arbeiten kannst --> würde zu Stockungen kommen ).
mfg
Heiko |
genau das is mein Problem. Deswegen frage ich ja, ob es ne Möglichkeit gibt ein Teil abzuspielen und während dessen den nächsten Teil gleich anzuhängen, sozusagen, dass der Player eine Datei mit unbekannter Länge abspielt...
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Di 09.05.06 18:01
Das dürfte nicht gehen. Zu mindestens ist mir da nix bekannt, was das anfügen erlaubt. Die einzigste Möglichkeit die ich kenne, sind Übergänge (kannste ja auf 50 ms stellen oder so).
@WMP & WinAMP: auch die nachfolgenden gesplitteten Teile? Die ersten dürften kein Problem sein, da dort der MPG-Header noch dranklebt  .
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 09.05.06 18:08
Mp3s kann man beliebig zerhacken, ohne dass die Abspielbarkeit darunter leidet. Das liegt daran, dass es in einer mp3-Datei nicht "einen Header" gibt, sondern für jeden der paar tausend MPEG-Frames einen eigenen. Da auch nicht feststeht, wo der erste Frame beginnt (Stichwort ID3-Tags), muss ein Abspielprogramm sich den ersten Header selber suchen.
Wenn also durch das zerhacken ein MPEG-Frame zerstört wurde, macht das gar nichts - der nächster Header kommt bestimmt
Verlieren tut man dabei maximal je einen Frame. Das nahtlose zusammensetzen von Frame-genau-getrennten Mp3s wäre einen Versuch wert. Wichtig ist, dass der nächste Teil bereits im Speicher liegt, wenn der erste zuende ist. Das sollte mit Threads machbar sein.
Bei Bedarf kann ich mal was Code zusammensuchen - ich hab mal ein Programm geschrieben, was die einzelnen Frames durcheinanderwürfelt, und zur Wiederherstellung die Permutation in den id3v2Tag schreibt. Man hört nur Unsinn, aber die Originaldatei lässt sich wiederherstellen 
_________________ We are, we were and will not be.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 09.05.06 18:39
hi,
klingt interessant, vielleicht bringt mich das n stückchen weiter
es besteht gnadenloser bedarf
[Edit]Ist es evtl. auch möglich mit der bass.dll diese einzelnen Teile direkt hintereinander wiederzugeben?[/edit]
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 09.05.06 19:13
Mit bass sollte das kein Problem sein...erstes Stück in einem Handle abspielen, und das nächste in einem weiteren bereithalten. Ist das erste zuende, das nächste abspielen (dürfte dann keine Verzögerung geben) und das nächste Stück ins nächste Handle laden.
Den Code muss ich mal suchen. Ist wahrscheinlich gnadenlos veraltet und unkommentiert
Edit: Ich fürchte, ich hab den Quellcode verloren. Evtl. hab ich den noch auf irgendeiner Backup-CD. Das Programm gibts noch.
Ansonsten: Schau mal in den Code zu meinen [URL= www.delphi-forum.de/...ml]MP3FileUtils[URL] rein. Damit lässt sich der erste Mpeg-Frame finden, und die Funktion GetFrameLength (oder so ähnlich) liefert die Größe eines Frames in Bytes. Dann muss man sich nur in einer Schleife durch die Datei von Frame zu Frame hangeln und jeden Frame in ein Object TFrame kopieren (wobei TFrame ein Array of Byte ist), und dann je 100 (1000?) Frames in eine separate Datei schreiben. Ist kein grundlegendes Problem.
_________________ We are, we were and will not be.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 09.05.06 20:01
guti, werde ich mir mal gleich anschauen. Dann müsste ich nur noch das zusammenfügen der einzelen abschnitte wieder hinbekommen, hast du da evtl. auch noch n tipp?
danke hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 09.05.06 20:23
Die einzelnen Frames einfach hintereinander in einen Filestream schreiben. Die einzelnen DateiStücke können ebenso einfach Stück für Stück aneinander gereiht werden.
Das einzige, womit man aufpassen muss, ist der ID3v2-Tag, der manchmal am Anfang der Datei steht, und den anderen möglichen Tags, die es da sonst noch gibt. Am einfachsten ist es, wenn man den Anfang der Datei (also alles bis zum ersten Frame) irgendwo speichert, und den Rest der Datei ebenso, wenn man beim frameweise durchhangeln einen ungültigen Frame entdeckt.
_________________ We are, we were and will not be.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 09.05.06 20:32
Hai (wo?  ),
nunja, das mit dem zusammensetzen is so ne sache, da nicht immer alle Teile der datei vorhanden sind (es kommen immer wieder welche nach...), das heißt ich könnte zwar, sagen wir 5 Teile zusammensetzten und diese wieder abspielen, aber währenddessen kommen neue Teile hinzu. Diese müsste ich dann anhängen undzwar so, dass es keine Unterbrechung gibt.
Also müsste ich eine Endloslange Datei abspielen. Wie kann ich das aber machen? Kann ich einen Stream abspielen und diesen gleichzeitig verändern? Wenn ja wäre das das wonach ich suche, müsste dann halt nur noch wiessen, wie ich das machen muss...
thx hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 09.05.06 20:46
NUn, du hast ja eben schon bass.dll angesprochen. Damit sollte das gehen.
Also. Jedes Teil für sich ist ja abspielbar. Wenn man die Originaldatei vernünftig aufgesplittet ist (also an den framegrenzen), dann sollte man nichts hören bei den Übergängen (wenn diese vernünftig gepuffert sind). [Anmerkung am Rande: Ganz wasserdicht ist das nicht, da beim kodieren sich "komplizierte Frames" Speciherplatz in den benachbarten "leichteren Frames" (was halt die Komplexität der Musik angeht) ausborgen können, so dass evtl. beim Abspielen an den Stellen ein kleiner Qualitätsverlust da ist, der beim zusammenfügen zur Originaldatei aber wieder weg sein sollte.]
Meine Idee ist so: Angenommen, du hast schon eine Datei "mymp3_part1.mp3" die aus so einem Aufsplitten hervorgegangen ist. Diese spielst du mit bass ab. Während der Wiedergabe, kann man ja überprüfen, ob eine Datei "mymp3_part2.mp3" angekommen ist. Wenn das so ist, dann lädt man diese auch schon mit bass, während die Wiedergabe noch läuft. Ist Teil1 zu Ende, dann gibt man an Teil2 das Kommando "Play" und hält Auschau nach einem "mymp3_part3.mp3" usw. Diese Teile sollten natürlich nicht zu klein sein, 10-20 Sekunden sollte das Minimum sein...
Wenn du die Teile Frameweise erhälst, sollte man ggf. die Teile Part1, Part2, etc. von oben Stück für Stück zusammensetzen, und wenn man genug für so eine Datei hat, diese in die Datei schreiben, sodass der Abspiel-Thread sich diesen Teil schnappen und abspielen kann.
Aber was genau hast du denn vor?
_________________ We are, we were and will not be.
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 09.05.06 21:11
Hi,
also ich spiele zZt. die MP3 über den TBassdllPlayer ab. Dieser Player verwendet soweit ich weiß die bass.dll. ABer mit diesem Player habe ich nicht die Möglichkeit mein Vorhaben zu verwirklichen.
Mit der reinen bass.dll habe ich es leider noch nicht geschafft eine .mp3 abzuspielen bzw. eine MP3 vorzuladen
Könntest du mir da nochmal weiterhelfen, wäre super nett.
danke.
hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
|