2010-07-18 14 views
13

C'è un modo semplice per caricare, riprodurre e controllare un file mp3 dal cacao? Ho provato a cercarlo su google, ma, come tutte le cose, ho risultati disordinati e non ho idea di dove cominciare. Come ho capito, c'è e NSSound, ma ha un sacco di limitazioni e poi c'è CoreAudio, ma è molto difficile. Quindi qualcuno può indicarmi la giusta direzione con questo? Grazie.cacao che suona un mp3

+0

Mi spiace, stai sviluppando per iOS o Mac? – shosti

+1

Sì, mi dispiace, ho dimenticato di chiarire: AVAudioPlayer non funzionerà: sto sviluppando per OSX – Marius

+1

A partire da Mac OS X 10.7 Lion (possibilmente anche 10.6.8?) AVFoundation funziona! Quindi, AVAudioPlayer .. Vedi risposta sotto .. – Mazyod

risposta

39

RISURREZIONE IN CORSO:

Perché resuscitare questa domanda? perché Googling "cacao che suona mp3" Mi porta qui, e non c'è una fantastica risposta del 2012. Quindi, ecco la fantastica risposta del 2012;)

Utilizzare AVFoundation! Secondo Apple, è stato integrato con Mac OS X Lion (credo), quindi .. Ecco come riprodurre mp3 indolore:

1- collegare il framework AVFoundation.

2- importazione dove si vuole giocare il vostro mp3 impressionante

#import <AVFoundation/AVFoundation.h> 

3- Aggiungere una variabile di istanza Audioplayer per riprodurre il suono (che è come mi piace farlo, almeno)

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

4- In te init, assicurarsi di inizializzare il vostro Audioplayer:

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- Gioca il tuo Mp3 impressionante !!

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

Infine, il credito va a this guy.

+0

Come testate per sapere se siete in grado di usarlo? – Mark

+0

Cosa intendi? Segui i passaggi illustrati e assicurati di aggiungere un file MP3 alle tue risorse. Quindi, aggiungi un pulsante (azione) che chiamerà '[riproduzione audioPlayer]' – Mazyod

+2

Il metodo URLWithString ha sempre restituito zero per me. Utilizzo '[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: @" myFile "ofType: @" mp3 "]];' risolto invece il problema. –

5

Ho scritto un quadro in C++ che potrebbe aiutare: http://github.com/sbooth/SFBAudioEngine

Supporta diversi formati audio e dispone di un'API abbastanza benigna e viene fornito con un campione di cacao.

Se non sei interessato a framework di terze parti, la tua scommessa sarebbe probabilmente quella di utilizzare un AudioQueue per occuparti della riproduzione. Per fare ciò, probabilmente userò AudioFile per decodificare MP3 e AudioQueue per la riproduzione. Apple ha un esempio a http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Introduction/Intro.html

0

Oltre NSSound, è possibile considerare QTMovieView. Sembra strano, ma puoi avere un QTMovieView nascosto nella tua finestra e usarlo per riprodurre un MP3.

Aggiunto: QTMovieView obsoleto a partire da OS 10.9. Quindi, a meno che non sia necessario supportare le versioni del sistema operativo prima del 10.7 (quando AVFoundation è arrivato sul Mac), probabilmente non dovresti usarlo.

+0

Ho anche visto esempi con QTKit senza alcuna vista, ma non sono sicuro se questo è un buon modo per farlo, dal momento che non ho trovato come cercare un file o forse aggiungere alcuni effetti in seguito. – Marius

+0

Non sono sicuro di cosa intendi con "cerca un file". – JWWalker

+0

Bene, in termini più semplici, vai in una posizione specifica e continua a giocare da lì. – Marius

1

Utilizzare NSSound.

Non hai specificato cosa intendi per "molte limitazioni", quindi non so perché questo non funzioni per te. Nota che ha molte meno limitazioni da Leopard; puoi ora giocare a qualsiasi dispositivo, per esempio.

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