Cocoa игра mp3

Есть ли простой способ загрузить, воспроизвести и управлять mp3 файлом с cocoa? Пробовал погулять по нему, но, как все яблоко, я получаю грязные результаты и понятия не имею, с чего начать. Как я понимаю, там и NSSound, но у него много ограничений, а затем CoreAudio, но это очень сложно. Так может кто-то указать мне в правильном направлении? Спасибо.

Ответы

Ответ 1

ВОСКРЕСЕНИЕ В ПРОГРЕССЕ:

Зачем воскресить этот вопрос? потому что Googling "cocoa играет mp3". Принимает меня здесь, и нет замечательного ответа 2012 года. Итак, вот замечательный ответ 2012 года;)

Используйте AVFoundation! По словам Apple, он был интегрирован с Mac OS X Lion (я думаю), так.. Вот как играть mp3 безболезненно:

1- связать структуру AVFoundation.

2- импортируйте его везде, где вы хотите сыграть в свой удивительный mp3

#import <AVFoundation/AVFoundation.h>

3- Добавьте переменную экземпляра audioPlayer, чтобы воспроизвести звук (как мне нравится это делать, по крайней мере)

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

4- В процессе инициализации убедитесь, что вы инициализируете свой аудиоплеер:

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- Воспроизведите свой потрясающий Mp3!!

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

Наконец, кредит идет этот парень.

Ответ 2

Я написал фреймворк на С++, который мог бы помочь: http://github.com/sbooth/SFBAudioEngine

Он поддерживает несколько аудиоформатов и имеет довольно мягкий API и поставляется с образцом Cocoa.

Если вас не интересуют сторонние рамки, ваша ставка, вероятно, будет заключаться в использовании AudioQueue для ухода за воспроизведением. Для этого вы, вероятно, будете использовать AudioFile для декодирования MP3 и AudioQueue для воспроизведения. У Apple есть пример в http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Introduction/Intro.html

Ответ 3

Используйте NSSound.

Вы не указали, что вы подразумеваете под "множеством ограничений", поэтому я не знаю, почему это не сработает для вас. Обратите внимание, что у него намного меньше ограничений с Leopard; теперь вы можете играть на любом устройстве, например.

Ответ 4

#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

Ответ 5

Кроме NSSound, вы можете рассмотреть QTMovieView. Это звучит странно, но вы можете иметь скрытый QTMovieView в своем окне и использовать его для воспроизведения MP3.

Добавлено: QTMovieView устарел с OS 10.9. Поэтому, если вам не нужно поддерживать версии ОС до 10.7 (когда AVFoundation пришла на Mac), вы, вероятно, не должны этого использовать.