2010-07-18 35 views
13

¿Hay alguna manera fácil de cargar, reproducir y controlar un archivo mp3 de cocoa? Intenté buscar en Google, pero, como todo lo demás, obtengo resultados desordenados y no tengo idea de dónde empezar. Según tengo entendido, hay y NSSound, pero tiene muchas limitaciones y luego está CoreAudio, pero es muy difícil. Entonces, ¿alguien puede señalarme en la dirección correcta con esto? Gracias.cacao jugando un mp3

+0

Lo sentimos, ¿está desarrollando para iOS o Mac? – shosti

+1

Sí, lo siento, se olvidó de aclarar: AVAudioPlayer no funcionará: estoy desarrollando para OSX – Marius

+1

A partir de Mac OS X 10.7 Lion (posiblemente incluso 10.6.8) ¡AVFoundation funciona! Por lo tanto, AVAudioPlayer ... Ver la respuesta a continuación .. – Mazyod

Respuesta

39

RESURRECCIÓN EN CURSO:

Por qué resucitar a esta pregunta? porque googlear "cocoa play mp3" me lleva aquí, y no hay una respuesta impresionante de 2012. Entonces, aquí está la impresionante respuesta de 2012;)

¡Use AVFoundation! Según Apple, se ha integrado con Mac OS X Lion (creo), así que ... Aquí está cómo reproducir mp3 sin problemas:

1- enlace AVFoundation Framework.

2- importación siempre que lo desee para reproducir su impresionante mp3

#import <AVFoundation/AVFoundation.h> 

3- Agregar una variable de instancia audioplayer para reproducir el sonido (Así es como me gusta hacerlo, por lo menos)

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

4- En que init, asegúrese de que usted hace funcionar su 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- reproducir archivos en MP3 increíble !!

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

Finalmente, el crédito va al this guy.

+0

¿Cómo se prueba para saber si puede usar esto? – Mark

+0

¿Qué quieres decir? Siga los pasos explicados y asegúrese de agregar un archivo MP3 a sus recursos. Luego, agregue un botón (acción) que llame a '[audioPlayer play]' – Mazyod

+2

El método URLWithString siempre devuelve nil para mí. Usando '[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: @" myFile "ofType: @" mp3 "]];' en su lugar solucionó el problema. –

5

He escrito un marco en C++ que podría ayudar: http://github.com/sbooth/SFBAudioEngine

Es compatible con múltiples formatos de audio y tiene una API bastante benigno y viene con una muestra de cacao.

Si no está interesado en frameworks de terceros, su apuesta probablemente sea utilizar AudioQueue para encargarse de la reproducción. Para hacer esto, probablemente use AudioFile para decodificar el MP3 y AudioQueue para la reproducción. Apple tiene un ejemplo en http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Introduction/Intro.html

0

Además de NSSound, puede considerar QTMovieView. Suena extraño, pero puede tener un QTMovieView oculto en su ventana y usarlo para reproducir un MP3.

Agregado: QTMovieView está en desuso a partir de OS 10.9. Entonces, a menos que necesites soportar versiones de sistema operativo antes de 10.7 (cuando AVFoundation llegó a la Mac), probablemente no deberías usar esto.

+0

También he visto ejemplos con QTKit sin ningún punto de vista, pero no estoy seguro de si esta es una buena manera de hacerlo, ya que no he encontrado cómo buscar un archivo o tal vez incluso agregar algunos efectos más tarde. – Marius

+0

No estoy seguro de lo que quiere decir con "buscar un archivo". – JWWalker

+0

Bueno, en términos más simples, vaya a una posición específica y continúe jugando desde allí. – Marius

1

Use NSSound.

No especificó a qué se refiere con "muchas limitaciones", por lo que no sé por qué esto no funcionará para usted. Tenga en cuenta que tiene muchas menos limitaciones desde Leopard; ahora puede jugar en cualquier dispositivo, por ejemplo.

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