Programm zum Repitchen von Mp3-Dateien

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Programm zum Repitchen von Mp3-Dateien

    hey,
    versuch gerade ein programm zum repitchen von mp3-dateien zu schreiben. konkret geht es darum ein mp3-file zu laden und es mit veränderter geschwindigkeit( wobei hier echtes repitchen gemeint ist, also die tonhöhe verändert sich auch) neu zu speichern.

    mein versuch war das problem mit QTMovie zu lösen, ich schaff es nur nicht, das Video mit der neuen Rate zu exportieren.

    MyController.h

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. #import <QTKit/QTKit.h>
    3. @interface MyController : NSObject {
    4. NSDictionary *exportAttributes;
    5. NSURL *trackURL;
    6. QTMovie *theMovie;
    7. IBOutlet NSTextField *trackName;
    8. }
    9. - (void)awakeFromNib;
    10. - (IBAction) openPanel: sender;
    11. - (IBAction) savePanel: sender;
    12. @property (retain) NSDictionary *exportAttributes;
    13. @property (retain) NSURL *trackURL;
    14. @property (retain) QTMovie *theMovie;
    15. @end
    Alles anzeigen


    MyController.m

    Quellcode

    1. #import "MyController.h"
    2. @implementation MyController
    3. - (void)awakeFromNib
    4. {
    5. self.exportAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
    6. [NSNumber numberWithBool:YES], QTMovieExport,
    7. [NSNumber numberWithLong:kQTFileTypeWave], QTMovieExportType, [NSNumber numberWithFloat:4],QTMoviePreferredRateAttribute,nil];
    8. }
    9. - (IBAction) openPanel:(id)sender
    10. {
    11. NSOpenPanel *myOpenPanel = [NSOpenPanel openPanel];
    12. if ([myOpenPanel runModal] == NSOKButton){
    13. self.trackURL = [myOpenPanel URL];
    14. [trackName setStringValue: [trackURL relativeString]];
    15. self.theMovie = [QTMovie movieWithURL: trackURL error:nil];
    16. }
    17. }
    18. - (IBAction) savePanel:(id)sender
    19. {
    20. NSSavePanel *mySavePanel = [NSSavePanel savePanel];
    21. if([mySavePanel runModal] == NSOKButton){
    22. NSString *newFileName = [NSString stringWithString:[mySavePanel filename]];
    23. [theMovie writeToFile:newFileName withAttributes:exportAttributes error:nil];
    24. }
    25. }
    26. @synthesize exportAttributes,trackURL,theMovie;
    27. @end
    Alles anzeigen


    hab ich irgndwas übersehen oder ist es nicht möglich für diesen Zweck QTMovie zu verwenden? Denn Core Audio und ähnliches würd ich mir gern ersparen; allein das Zurechtkommen mit Xcode, Properties, Speichermanagement, Dokumentation und allgemein OOP ist schon genug fürs erste Programm...

    danke
  • Ich würde es ganz anders lösen. Eigentlich ist ja eine MP3 nur ein digitales Signal. Wie wärs denn, wenn du einfach das Signal änderst. Das ist vielleicht aufwendiger aber (wenn mans einmal geschafft hat) bestimmt einfacher. Wenn du hier einfach ein paar Bytes rausschmeißt, müsstest du eigentlich ein schnelleres Lied haben. Leider ist das Lied dann nict höher und schlechter in der Qualität wenn du das übertreibst. ich weiß jetzt leider nicht, was für die Tonhöhe zuständig ist. Vielleicht die Frequenz? Aber wie verändert man die digital?
  • ok, nach einer ausgedehnten google-suchaktion gibts jetzt neue zentrale Fragen:

    1) nur noch mal zur abklärung: gibt es wirklich keine möglichkeit qtmovies mit cocoa so zu exportieren, dass die abspielsettings direkt in die datei geschrieben werden?

    2) wie könnte man das sample herauslöschen lösen?
    hab mir mal den aufbau von mp3-dateien angeschaut:

    a) einerseits wirds wohl mit der interpolation probleme geben, wenn ich einfach werte rauslösch (sprich die qualität wird sich stark verschlechtern):
    stark vereinfachtes Bsp: Dreieckswellenform: ursprüngliche Annäherung: 1,3,5,3,1,3,5... lösch ich jetzt jeden dritten ergibt sich 1,3,3,1,5,3,3,5,1,3,3,5... was ja wohl eine sehr schlechte annäherung ist..
    gegenüberlegung: wenn die auflösung stark genug ist, könnte der unterschied ev. nicht ins gewicht fallen...

    b) andrerseits ist das herauslöschen von einzelnen samplen aus dem bytecode doch ein unglaublicher programmieraufwand...

    vl sollte man das ganze einfach sein lassen.. ?(
  • bg890 schrieb:

    1) nur noch mal zur abklärung: gibt es wirklich keine möglichkeit qtmovies mit cocoa so zu exportieren, dass die abspielsettings direkt in die datei geschrieben werden?

    Keine Ahnung, aber ich denke nicht. MP3 sieht mE nichts dergleichen vor. Du kannst natürlich die Sample-Rate auf 22kHz herabsetzen, dann ist es halb so schnell und halb so hoch. Auf 88kHz wirst Du es aber wahrscheinlich nicht heraufsetzen können, üblicherweise ist bei spätenstens 48kHz schluss, höchsten im Profi-Bereich arbeitet man mit höheren Abtastraten.

    bg890 schrieb:

    2) wie könnte man das sample herauslöschen lösen?
    hab mir mal den aufbau von mp3-dateien angeschaut:

    Nimm die mpg123 lib und decodier das mp3 in ein Buffer, lösch dann jedes N-te Sample und encode es wieder mit LAME. Das ist ein Aufwand von einer Stunde, wenn man weniger geübt ist...

    bg890 schrieb:

    a) einerseits wirds wohl mit der interpolation probleme geben, wenn ich einfach werte rauslösch (sprich die qualität wird sich stark verschlechtern):
    stark vereinfachtes Bsp: Dreieckswellenform: ursprüngliche Annäherung: 1,3,5,3,1,3,5... lösch ich jetzt jeden dritten ergibt sich 1,3,3,1,5,3,3,5,1,3,3,5... was ja wohl eine sehr schlechte annäherung ist..
    gegenüberlegung: wenn die auflösung stark genug ist, könnte der unterschied ev. nicht ins gewicht fallen...

    Herrjeh.
    Üblicherweise hast Du eine Abtastrate von 44kHz. Das Shannon/Nyquist Abtasttheorem besagt ja, dass die Abtastrate immer das doppelte der maximalen Frequenz sein muss, hier also 22kHz. Das hören ohnehin nur noch wenige. Wenn Du das einfach halbierst, bekommst Du also kaum Probleme, weil ohnehin kaum wahrnehmbare Frequenzen so weit oben liegen.
    Wenn Du aber wert drauf legst, kannst Du natürlich die neuen Werte einfach inter/extrapolieren, bzw. zum löschen heisst glaube ich die beste Technik "Integral Sampling", müsste ich nochmal genau nachschauen.
    C++
  • zerm schrieb:

    Herrjeh.
    Üblicherweise hast Du eine Abtastrate von 44kHz. Das Shannon/Nyquist Abtasttheorem besagt ja, dass die Abtastrate immer das doppelte der maximalen Frequenz sein muss, hier also 22kHz. Das hören ohnehin nur noch wenige. Wenn Du das einfach halbierst, bekommst Du also kaum Probleme, weil ohnehin kaum wahrnehmbare Frequenzen so weit oben liegen.

    Das Problem ist, dass bei Verstoß gegen das Abtasttheorem Aliasing mit Frequenzen außerhalb des fraglichen Bereiches entstehen kann - die minimale Samplingrate bezieht sich nicht auf die gewünschte maximal abgebildete Frequenz, sondern auf die maximale Frequenz im Ursprungssignal. Mit anderen Worten: Bei Reduzierung der Samplingrate ist ein Tiefpass notwendig. Ist aber nicht sonderlich kompliziert, z.B. bei Halbierung nicht jedes zweites Sample wegwerfen, sondern zwei Samples per Mittelwert zusammenfassen. Für andere Faktoren eine passende Tiefpass-Convolution - von Box über sinc bis Gauss.

    Ich würde das allerdings nicht händisch machen. Für solche Zwecke bietet Core Audio fertige, qualitativ hochwertige Filter: AUVarispeed für einfaches Resampling (also das Gewünschte ohne Pitchkompensation), AUTimePitch für getrennte Kontrolle von Pitch und Geschwindingkeit. Sowohl als Echtzeit- als auch als Offline-Version. Die klingen sehr gut - um händisch vergleichbare Ergebnisse zu bekommen müsste man schon einigen Aufwand reinstecken. Formatkonvertierung gibt es eh gratis. ExtAudioFile erledigt das Decodieren und Codieren.
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    Das Problem ist, dass bei Verstoß gegen das Abtasttheorem Aliasing mit Frequenzen außerhalb des fraglichen Bereiches entstehen kann - die minimale Samplingrate bezieht sich nicht auf die gewünschte maximal abgebildete Frequenz, sondern auf die maximale Frequenz im Ursprungssignal.

    Jo. Ich glaube aber, dass man eventuelles Aliasing in den Frequenzbereichen kaum (wenn überhaupt) Wahrnimmt. Klingt ja ohnehin "verzerrt" ;)

    mattik schrieb:

    Mit anderen Worten: Bei Reduzierung der Samplingrate ist ein Tiefpass notwendig. Ist aber nicht sonderlich kompliziert, z.B. bei Halbierung nicht jedes zweites Sample wegwerfen, sondern zwei Samples per Mittelwert zusammenfassen. Für andere Faktoren eine passende Tiefpass-Convolution - von Box über sinc bis Gauss.

    Das Mittel-wert Ding war, wenn ich mich recht erinnere, das, was ich mit "integral sampling" gemeint hatte :)
    C++