2010-07-18 13 views
13

Gibt es eine einfache Möglichkeit, eine MP3-Datei von Kakao zu laden, zu spielen und zu kontrollieren? Ich habe versucht, es zu googeln, aber wie alle Dinge Apple, bekomme ich chaotische Ergebnisse und habe keine Ahnung, wo ich anfangen soll. Wie ich verstehe, gibt es und NSSound, aber es hat viele Einschränkungen und dann gibt es CoreAudio, aber es ist sehr schwierig. Kann mir also jemand eine richtige Richtung geben? Vielen Dank.Kakao ein mp3 spielen

+0

Entschuldigung, entwickeln Sie für iOS oder Mac? – shosti

+1

Ja, tut mir leid, habe vergessen zu klären: AVAudioPlayer funktioniert nicht: Ich entwickle für OSX – Marius

+1

Ab Mac OS X 10.7 Lion (möglicherweise sogar 10.6.8?) Funktioniert AVFoundation! Also, AVAudioPlayer .. Siehe Antwort unten .. – Mazyod

Antwort

39

AUFERSTEHUNG IN PROGRESS:

Warum diese Frage wieder aufleben lassen? weil Googeln "Kakao mp3 spielen" bringt mich hier, und es gibt keine tolle 2012 Antwort. Also, hier ist die tolle 2012 Antwort;)

Verwenden AVFoundation! Laut Apple wurde es mit Mac OS X Lion integriert (denke ich), also .. Hier ist, wie man mp3 schmerzlos spielt:

1- Link das AVFoundation Framework.

2- Import es überall dort, wo Sie Ihre ehrfürchtig mp3

#import <AVFoundation/AVFoundation.h> 

3- Fügen Sie eine Audioplayer Instanzvariable spielen wollen um den Ton zu spielen (Das ist, wie ich es tun, zumindest)

@interface WCMainWindow : ... { 
    ... 
    AVAudioPlayer* audioPlayer; 
} 

4- In Sie init, stellen Sie sicher, dass Sie Ihre Audioplayer initialisieren:

NSString* path = [[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"mp3"]; 
NSURL* file = [NSURL fileURLWithPath:path]; 
// thanks @gebirgsbaerbel 

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:nil]; 
[audioPlayer prepareToPlay]; 

5- Spielen Sie Ihre ehrfürchtige Mp3 !!

if ([audioPlayer isPlaying]) { 
    [audioPlayer pause]; 
} else { 
    [audioPlayer play]; 
} 

Schließlich geht Kredit this guy.

+0

Wie testen Sie, ob Sie das verwenden können? – Mark

+0

Was meinst du? Gehen Sie die beschriebenen Schritte durch und stellen Sie sicher, dass Sie Ihren Ressourcen eine MP3-Datei hinzufügen. Fügen Sie dann eine Schaltfläche (Aktion) hinzu, die '[audioPlayer play]' ' – Mazyod

+2

aufruft. Die Methode URLWithString gab immer nil für mich zurück. Mit '[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: @" myFile "vonTyp: @" mp3 "]];' wurde das Problem behoben. –

5

Ich habe einen Rahmen in C++ geschrieben, die helfen können: http://github.com/sbooth/SFBAudioEngine

Es unterstützt mehrere Audioformate und hat eine ziemlich gutartige API und kommt mit einer Kakao-Probe.

Wenn Sie nicht an Frameworks von Drittanbietern interessiert sind, würden Sie wahrscheinlich eine AudioQueue verwenden, um sich um die Wiedergabe zu kümmern. Um dies zu tun, würden Sie wahrscheinlich AudioFile verwenden, um die MP3- und AudioQueue für die Wiedergabe zu dekodieren. Apple hat ein Beispiel unter http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Introduction/Intro.html

0

Neben NSSound können Sie QTMovieView betrachten. Es klingt seltsam, aber Sie können ein verstecktes QTMovieView in Ihrem Fenster haben und es benutzen, um einen MP3 zu spielen.

Hinzugefügt: QTMovieView ist veraltet ab OS 10.9. Wenn Sie also keine OS-Versionen vor 10.7 (wenn AVFoundation auf den Mac kam) unterstützen müssen, sollten Sie dies wahrscheinlich nicht verwenden.

+0

Ich habe auch Beispiele mit QTKit ohne Ansichten gesehen, aber ich bin mir nicht sicher, ob dies eine gute Möglichkeit ist, es zu tun, da ich nicht gefunden habe, wie man eine Datei sucht oder vielleicht fügen Sie später sogar einige Effekte hinzu. – Marius

+0

Ich bin mir nicht sicher, was du mit "suche eine Datei" meinst. – JWWalker

+0

Nun, in einfacheren Worten, gehen Sie zu einer bestimmten Position und spielen von dort weiter. – Marius

1

Verwenden Sie NSSound.

Sie haben nicht angegeben, was Sie mit "vielen Einschränkungen" meinen, also weiß ich nicht, warum das nicht für Sie funktioniert. Beachten Sie, dass es seit Leopard wesentlich weniger Einschränkungen gibt. Sie können jetzt beispielsweise auf jedem Gerät spielen.

1
#import <Cocoa/Cocoa.h> 
#import <QTKit/QTKit.h> 

@interface SoundPlayer : NSObject { 
    NSSound *sound; 
    IBOutlet NSWindow *window; 
    IBOutlet NSSlider *progress; 
    BOOL loop; 
} 
- (IBAction)open: (id)sender; 
- (IBAction)setLoop: (id)sender; 
- (IBAction)play: (id)sender; 
- (IBAction)stop: (id)sender; 
- (IBAction)takeCurrentTimeFrom: (id)sender; 
@end 

#import "SoundPlayer.h" 

@implementation SoundPlayer 
- (IBAction)open: (id)sender 
{ 
    NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
    [openPanel runModalForTypes: [NSArray arrayWithObjects: @"aiff", @"mp3", @"m4a", nil]]; 
    [sound release]; 
    sound = [[QTMovie movieWithFile: [openPanel filename] 
           error: NULL] retain]; 
    [sound setAttribute: [NSNumber numberWithBool: loop] 
       forKey: QTMovieLoopsAttribute]; 
    [window setTitle: [[openPanel filename] lastPathComponent]]; 
} 
- (IBAction)setLoop: (id)sender 
{ 
    loop = ([sender state] == NSOnState); 
    [sound setAttribute: [NSNumber numberWithBool: loop] 
       forKey: QTMovieLoopsAttribute]; 
} 
- (IBAction)play: (id)sender 
{ 
    NSTimeInterval duration; 
    QTGetTimeInterval([sound duration], &duration); 
    [progress setMaxValue: duration]; 
    [NSTimer scheduledTimerWithTimeInterval: 0.1 
            target: self 
            selector: @selector(updateIndicator:) 
            userInfo: sound 
            repeats: YES]; 
    [sound play]; 
} 
- (void)updateIndicator: (NSTimer*)aTimer 
{ 
    QTMovie *playingSound = [aTimer userInfo]; 
    if (!(sound == playingSound && ([sound rate] != 0))) 
    { 
     [aTimer invalidate]; 
     return; 
    } 
    NSTimeInterval currentTime; 
    QTGetTimeInterval([sound currentTime], &currentTime); 
    [progress setDoubleValue: currentTime]; 
} 
- (IBAction)stop: (id)sender 
{ 
    [sound stop]; 
} 
- (IBAction)takeCurrentTimeFrom: (id)sender 
{ 
    [sound setCurrentTime: QTMakeTimeWithTimeInterval([sender doubleValue])]; 
} 
@end