2010-07-18 38 views
13

Có cách nào dễ dàng tải, phát và điều khiển tệp mp3 từ ca cao không? Cố gắng googling nó, nhưng, như tất cả mọi thứ táo, tôi nhận được kết quả lộn xộn và không có ý tưởng bắt đầu từ đâu. Theo tôi hiểu, có và NSSound, nhưng nó có rất nhiều hạn chế và sau đó có CoreAudio, nhưng nó rất khó khăn. Vì vậy, ai đó có thể chỉ cho tôi một hướng đúng với điều này? Cảm ơn.ca cao phát mp3

+0

Xin lỗi, bạn đang phát triển cho iOS hay Mac? – shosti

+1

Có, xin lỗi, quên làm rõ: AVAudioPlayer sẽ không hoạt động: Tôi đang phát triển cho OSX – Marius

+1

Kể từ Mac OS X 10.7 Lion (thậm chí có thể 10.6.8?) AVFoundation hoạt động! Do đó, AVAudioPlayer .. Xem trả lời dưới đây .. – Mazyod

Trả lời

39

SỐNG LẠI TRÊN TIẾN ĐỘ:

Tại sao hồi sinh câu hỏi này? bởi vì Googling "ca cao chơi mp3" Đưa tôi đến đây và không có câu trả lời tuyệt vời nào năm 2012. Vì vậy, đây là câu trả lời tuyệt vời năm 2012;)

Sử dụng AVFoundation! Theo táo, nó đã được tích hợp với Mac OS X Lion (tôi nghĩ), vì vậy .. Đây là cách để chơi mp3 không đau đớn:

1- liên kết khung AVFoundation.

2- nhập khẩu nó bất cứ nơi nào bạn muốn chơi bạn tuyệt vời mp3

#import <AVFoundation/AVFoundation.h> 

3- Thêm một biến Ví dụ Audioplayer để chơi âm thanh (Đó là cách tôi muốn làm điều đó, ít nhất)

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

4 Trong bạn init, chắc chắn bạn khởi Audioplayer của bạn:

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- Chơi Mp3 tuyệt vời của bạn !!

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

Cuối cùng, tín dụng đi đến this guy.

+0

Làm thế nào để bạn kiểm tra để biết nếu bạn có thể sử dụng điều này? – Mark

+0

Ý của bạn là gì? Thực hiện các bước được giải thích và đảm bảo bạn thêm tệp MP3 vào tài nguyên của mình. Sau đó, thêm một nút (hành động) sẽ gọi '[audioPlayer play]' – Mazyod

+2

Phương thức URLWithString luôn trả về nil cho tôi. Sử dụng '[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: @" myFile "ofType: @" mp3 "]];' thay vào đó đã khắc phục được sự cố. –

5

Tôi đã viết một khuôn khổ trong C++ có thể giúp: http://github.com/sbooth/SFBAudioEngine

Nó hỗ trợ nhiều định dạng âm thanh và có một API khá lành tính và đi kèm với một mẫu Cocoa.

Nếu bạn không quan tâm đến khung bên thứ ba, đặt cược của bạn có thể sẽ sử dụng AudioQueue để xử lý phát lại. Để làm điều này, bạn có thể sử dụng AudioFile để giải mã MP3 và AudioQueue để phát lại. Apple có ví dụ tại http://developer.apple.com/mac/library/samplecode/AudioQueueTools/Introduction/Intro.html

0

Bên cạnh NSSound, bạn có thể xem xét QTMovieView. Nghe có vẻ lạ, nhưng bạn có thể có một số QTMovieView ẩn trong cửa sổ của bạn và sử dụng nó để phát một MP3.

Đã thêm: QTMovieView không được chấp nhận với hệ điều hành 10.9. Vì vậy, trừ khi bạn cần hỗ trợ các phiên bản hệ điều hành trước 10.7 (khi AVFoundation đến Mac), bạn có lẽ không nên sử dụng nó.

+0

Tôi cũng đã nhìn thấy ví dụ với QTKit mà không có bất kỳ quan điểm, nhưng tôi không chắc chắn nếu đây là một cách tốt để làm điều đó, vì tôi đã không tìm thấy làm thế nào để tìm kiếm một tập tin hoặc thậm chí có thể thêm một số hiệu ứng sau này. – Marius

+0

Tôi không chắc chắn những gì bạn có nghĩa là "tìm kiếm một tập tin". – JWWalker

+0

Vâng, trong điều kiện đơn giản, hãy đi đến một số vị trí cụ thể và tiếp tục chơi từ đó. – Marius

1

Sử dụng NSSound.

Bạn không chỉ định ý nghĩa của “rất nhiều giới hạn”, vì vậy tôi không biết tại sao điều này không hiệu quả với bạn. Lưu ý rằng nó có rất ít hạn chế hơn kể từ Leopard; bây giờ bạn có thể chơi với bất kỳ thiết bị nào.

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