Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi mp3 schneiden? (https://www.delphipraxis.net/91974-mp3-schneiden.html)

gandime 12. Mai 2007 17:16


mp3 schneiden?
 
Hi,
ich würde gerne eine mp3-Datei schneiden.
Die Schnittstelle ist allerdings eine gewisse zeit im mp3 Titel!

wie geht das?

mfg
gandime

SirTwist 12. Mai 2007 23:22

Re: mp3 schneiden?
 
Hm, falls sich niemand anders meldet, der ein Programm hat, mit dem man wirklich MP3-Dateien bearbeiten kann, bleibt Dir wohl nichts anderes übrig, als die MP3s in WAVs umzuwandeln, dort zu behandeln und wieder zurückzuwandeln. Zum Hin- und herwandeln könntest Du CDEX benutzen, das ist Freeware. Zum Schneiden kenn ich keine Freeware, habe mal was von Audacity gehört.

Ich hoffe, das hilft dir weiter.

Phantom1 13. Mai 2007 00:08

Re: mp3 schneiden?
 
Schonmal MP3DirectCut ausprobiert? damit kann man mp3 schneiden ohne qualitätsverlust.

mfg

gandime 13. Mai 2007 01:04

Re: mp3 schneiden?
 
@Phantom1
ich möchte selber eins Schreiben!

@SirTwist
kann ich die wav Datei dann richtig schneiden sprich nach einner gewissen zeit des titels?

Delphi Star 13. Mai 2007 01:58

Re: mp3 schneiden?
 
Freeware zum Schneiden: http://audacity.sourceforge.net/
Wird zum Öffnen und Speichern von MP3s benötigt: http://lame.sourceforge.net/

Zitat:

Zitat von gandime
wie geht das?

Einfach Datei mit Audacity öffnen, gewünschte Stelle markieren und "Entf" drücken. Dann nur noch Speichern.

Matze 13. Mai 2007 07:55

Re: mp3 schneiden?
 
Hi,

da es in einer Delphi-Rubrik steht und gandime ausdrücklich geschrieben hat, dass es das gerne selbst programmieren möchte, sollte auch dementsprechend geantwortet werden. :?

Ich befürchte, dass es nicht einfach ist, MP3s direkt zu schneiden. Du könntest versuchen, die MP3 intern, wie oben angesprochen wurde, in eine WAV zu konvertieren und dann mit diesem Code zurechtschneiden. Lies dir hierzu auch den Folgebeitrag von dizzy durch.
Ob's klappt, weiß ich nicht, aber einen Versuch ist es wert.

bttb930 13. Mai 2007 10:35

Re: mp3 schneiden?
 
Wer ein wenig Ahnung hat, wird sich nicht damit begnügen, eine mp3 in eine Wav umzuwandeln, die zu schneiden und dann zurück zu wandeln. MP3 ist nunmal verlustbehaftet. Wer eine mp3 schneiden will, der will das hoffentlich ohne diesen umweg machen.

wie man das macht weiß ich leider auch nicht, aber mp3directcut kann das. vielleicht mal den autoren davon kontakten.

jedenfalls geht es offensichtlich...

Gausi 13. Mai 2007 11:04

Re: mp3 schneiden?
 
Ja, es geht. Eine mp3-Datei ist ja (abgesehen von ID3Tags) aus vielen MPEG-Frames aufgebaut. Jeder dieser MPEG-Frames besitzt einen 4 Byte großen Header, aus dem unter anderem die Bitrate, aber auch die Framelänge (in Bytes) hervorgeht. Jeder Frame hat afaik eine bestimmte Spieldauer (evtl abhängig von Bitrate/Samplerate etc, aber das weiß ich grade nicht auswendig).
Die einzelnen Frames sind (größtenteils) voneinander unabhängig, so dass man das mp3-File an den Framegrenzen (fast) verlustfrei schneiden kann. Die Einschränkungen deswegen, weil der MP3-Codec es durchaus vorsieht, dass sich Frames, in denen "viel passiert", Speicher von benachbarten Frames "ausborgen" können. Wie man da erkennt, weiß ich allerdings nicht.

Ich hatte mal ein Programm, was die einzelnen Frames einer MP3-Datei permutiert hat und wieder zurücksortieren konnte, aber da ist der Code verlorengegangen. In meinen MP3FileUtils ist aber eine MPEG-Klasse enthalten, mit deren Hilfe man mit ein bissel zusätzlicher Arbeit die Datei in seine Einzelframes aufbröseln kann. Die wichtigste Funktion dürfte "GetFrameLength" (oder so ähnlich) sein. Mit deren Hilfe kann man sich recht leicht durch die Datei hangeln und die einzelnen Frames in ein Array oder so packen. Dann nimmt man einfach soundsoviele dieser Einzelframes und schreibt diese in eine neue Datei.

Wishmaster 14. Mai 2007 04:49

Re: mp3 schneiden?
 
Hi

Entschuldigung feileicht liegt es an mir aber ich verstehe euch nicht. Es wurde schon so oft gesagt das ihr das mit der Bass.dll/FMod.dll machen könnt. Mixen, Schneiden, rippen
Abspielen… blablabla. Die dlls sind ziemlich klein und kosten frei. Ich arbeite schon seit langem mit der Bass.dll und das ding läuft ziemlich stabil.

Mit der bass.dll
Öffnet en Audio File (wav, mp3,ogg, mp4, …)
Setze die Start und end Position
Jagt das ganze durch en Encoder (enc_lame.dll oder lame.exe)

Einfacher geht es nicht mehr

WS1976 14. Mai 2007 06:23

Re: mp3 schneiden?
 
Hallo,
Zitat:

Einfacher geht es nicht mehr
Wenn das so einfach geht könntest du ja ein Stück Code beisteuern oder?

Grüsse

Gausi 14. Mai 2007 10:00

Re: mp3 schneiden?
 
Joah, das Problem dabei ist aber die Neukodierung der Musikdaten. Dabei geht grundsätzlich Qualität verloren.

Ich guck mal, ob ich die Tage versuche, meinen Code von damals zu rekonstruieren. Dürfte nicht allzuviel Aufwand sein. Ersten MPEG-Frame suchen, dessen Länge bestimmen, nächsten suchen usw. Dabei jeden Frame in eine Byte-Array einlesen, und so die ganze Datei in ein Array of Array of Byte aufteilen. Anschließend einen Teil der Frames in eine neue Datei schreiben. Das einzige, was ich gerade noch nicht weiß ist, wie ich von einer Zeitangabe auf die richtige Frame-Nr. komme, aber das dürfte auch kein größeres Problem sein.

Edit: Ich hab grade gemerkt, dass meine Idee nur für Dateien mit konstanter Bitrate so einfach ist. Bei VBR muss ggf. zusätzlich der Xing-Header geändert werden. Da muss die neue Frameanzahl rein, und das Sprungstellen-Array muss neu berechnet/geschrieben werden.

Gausi 14. Mai 2007 16:52

Re: mp3 schneiden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das hat mir keine Ruhe gelassen, und daher hab ich mich mal ein Stündchen hingesetzt, und meine MPEG-Klasse etwas erweitert. :stupid:

Das ganze ist eher ein Proof-Of-Concept, aber es sollte soweit funktionieren. Bei VBR gibts die Einschränkung, dass ein evtl. vorhandenes optionales Sprungstellen-Array gelöscht wird. Die Anzahl der Frames in diesem Xing-Header wird aber korrigiert. Das Array anzupassen dürfte auch kein prinzipielles Problem sein, allerdings verstehe ich nicht ganz, was da für Daten drin stehen.

Folgende Funktion bröselt eine MP3-Datei in die einzelnen Frames auf:
Delphi-Quellcode:
function TMpegInfo.ReadFrames(stream: TStream): Integer;
var c, i, bufpos: Integer;
    buffer: TBuffer;
    aMpegHeader: TMpegHeader;
begin
  LoadFromStream(stream);
  Setlength(fFrameArray, fFramesCount);

  setlength(buffer, stream.Size);
  Stream.Seek(0, soFromBeginning);
  c := Stream.Read(buffer[0], length(buffer));
  if c < Stream.Size then Setlength(Buffer, c);

  bufpos := fFirstHeaderPosition;
  fFramesread := 0;
  // besser wäre eigentlich: Die forschleife ersetzen durch eine,
  // die bis zum Dateiende läuft
  for i := 0 to fFramesCount-1 do
  begin
    aMpegHeader := GetValidatedHeader(buffer, bufpos);
    if aMpegHeader.valid then
    begin
      Setlength(fFrameArray[i], aMpegHeader.framelength);
      Move(buffer[bufpos], fFrameArray[i][0], aMpegHeader.framelength);
      bufpos := bufpos + aMpegHeader.framelength;
      inc(fFramesread);
    end else
    begin
      // d.h. es wurde kein gültiger Frame mehr gefunden
      // d.h. irgendwas ist falsch -einfach den Rest kopieren
      // mögliche Ursache, falls man den oben erwähnten besseren Weg wählt:
      // Ende der Musik, und Start von ID3v1-Tag oder Lyrics-Tag.
      // Das könnte man ggf. abfangen.
      Setlength(fFrameArray[i], length(buffer) - bufpos);
      Move(buffer[bufpos], fFrameArray[i][0], length(fFrameArray[i]));
      bufpos := bufpos + aMpegHeader.framelength;
      inc(fFramesread);
      result := fFramesread;
      exit;
    end;
  end;
  result := fFramesRead;
end;
...und diese schreibt einen Teil in einen (neuen) Stream. Erwartete start-ende-Werte sind in Millisekunden anzugeben.
Delphi-Quellcode:
// leicht gekürzt
function TMpegInfo.Cut(stream: TStream; start,ende: LongInt): Boolean;
var idxstart, minidx, idxend, i: integer;
begin
  result := False;

  if FirstFrameIsXing then
    minidx := 1
  else
    minidx := 0;
  //...
  // Aus den zeiten den Start- und EndIndex im Frame-Array berechnen
  // ein MPEGFrame ist 26ms lang
  idxstart := Round(start Div 26);
  idxend := Round(ende DIV 26);
  //...
  if vbr and CorrectXingHeader(idxend - idxstart + 1) then
    Stream.WriteBuffer(fFrameArray[0][0], length(fFrameArray[0]));

  for i := idxstart to idxend do
  begin
    Stream.WriteBuffer(fFrameArray[i][0], length(fFrameArray[i]));
  end;
 
  result := True;
end;

gandime 14. Mai 2007 18:27

Re: mp3 schneiden?
 
hey super sache blos jetzt habe ich nichts mehr zu tun :-D
aber trotzdem danke :-)

Wishmaster 14. Mai 2007 22:27

Re: mp3 schneiden?
 
Hi

Ich hatte hier schon en Code Schnipsel geschrieben!

Delphi-Quellcode:
Channel:= BASS_StreamCreateFile(FALSE, PChar(FSource), StartPos, EndPos, BASS_STREAM_DECODE or BASS_STREAM_AUTOFREE);
Oder benutze BASS_ChannelSetPosition(Channel, StartPos) Für die start position

Und den Rest wie im Code Schnipsel!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 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 by Thomas Breitkreuz