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], ¤tTime);
[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), вы, вероятно, не должны этого использовать.