有没有一种从cocoa加载,播放和控制mp3文件的简单方法?尝试谷歌搜索它,但是,因为所有东西苹果,我得到凌乱的结果,不知道从哪里开始。据我所知,有和NSSound,但它有很多限制,然后有CoreAudio,但它是非常困难的。那么有人能指出我正确的方向吗?感谢。
答案 0 :(得分:40)
进展中的重新开始:
为什么要复活这个问题?因为谷歌搜索“可可玩MP3”带我到这里,并没有真棒的2012年答案。所以,这是2012年的绝佳答案;)
使用AVFoundation!根据苹果的说法,它已经与Mac OS X Lion集成(我想),所以..这里是如何轻松地播放mp3:
1-链接AVFoundation框架。
2-将它导入任何你想要播放你真棒mp3的地方
#import <AVFoundation/AVFoundation.h>
3-添加一个audioPlayer实例变量来播放声音(至少我喜欢这样做)
@interface WCMainWindow : ... {
...
AVAudioPlayer* audioPlayer;
}
4-在初始化时,请确保初始化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-玩你真棒的Mp3 !!
if ([audioPlayer isPlaying]) {
[audioPlayer pause];
} else {
[audioPlayer play];
}
最后,信用转到this guy。
答案 1 :(得分:5)
我用C ++编写了一个可能有用的框架:http://github.com/sbooth/SFBAudioEngine
它支持多种音频格式,并且具有相当良性的API,并附带Cocoa样本。
如果您对第三方框架不感兴趣,您的赌注可能是使用AudioQueue来处理播放。为此,您可能需要使用AudioFile解码MP3和AudioQueue以进行播放。 Apple在http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Introduction/Intro.html
有一个例子答案 2 :(得分:1)
使用NSSound。
你没有用“很多限制”来明确你的意思,所以我不知道为什么这对你不起作用。请注意,自Leopard以来它的限制要少得多;例如,您现在可以播放任何设备。
答案 3 :(得分: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], ¤tTime);
[progress setDoubleValue: currentTime];
}
- (IBAction)stop: (id)sender
{
[sound stop];
}
- (IBAction)takeCurrentTimeFrom: (id)sender
{
[sound setCurrentTime: QTMakeTimeWithTimeInterval([sender doubleValue])];
}
@end
答案 4 :(得分:0)
除了NSSound
,您可以考虑QTMovieView
。这听起来很奇怪,但你可以在你的窗口中隐藏QTMovieView
并用它来播放MP3。
已添加:自OS 10.9起,不推荐使用QTMovieView
。因此,除非你需要在10.7之前支持操作系统版本(当AVFoundation进入Mac时),你可能不应该使用它。
答案 5 :(得分:0)
import Cocoa
import AVFoundation
class ViewController: NSViewController {
var audio = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
let play = Bundle.main.path(forResource: "A" , ofType: "mb3")
do{
audio = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: play!))
}
catch{
print(error)
}
}
@IBAction func button(_ sender: Any)
{
audio.play()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}