有没有简单的方法从cocoa加载、播放和控制mp3文件?我已经尝试过在谷歌上搜索,但是像所有苹果产品一样,我得到了混乱的结果,并且不知道从哪里开始。据我所知,有一个NSSound,但它有很多限制,然后还有CoreAudio,但它非常难用。所以,有人能指点我一下吗?谢谢。
有没有简单的方法从cocoa加载、播放和控制mp3文件?我已经尝试过在谷歌上搜索,但是像所有苹果产品一样,我得到了混乱的结果,并且不知道从哪里开始。据我所知,有一个NSSound,但它有很多限制,然后还有CoreAudio,但它非常难用。所以,有人能指点我一下吗?谢谢。
使用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- 播放您的精彩音频文件!
if ([audioPlayer isPlaying]) {
[audioPlayer pause];
} else {
[audioPlayer play];
}
最后,应该感谢这位。
[audioPlayer play]
。 - MazyodURLWithString
总是返回空值。
使用[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"mp3"]];
代替解决了这个问题。 - gebirgsbärbel#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
NSSound
,你也可以考虑使用 QTMovieView
。听起来有些奇怪,但是你可以在窗口中隐藏一个 QTMovieView
并使用它来播放 MP3。QTMovieView
已被弃用。因此,除非你需要支持 10.7 之前的 OS 版本(当 AVFoundation 进入 Mac 时),否则你应该不使用它。setCurrentTime:
等QTMovie方法。 - JWWalkerimport 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.
}
}
}