2011-11-12 72 views
9

Tôi có 5 bài hát trong ứng dụng của mình mà tôi muốn phát một bài hát cho người khác bằng AVAudioPlayer.Cách phát nhiều tệp âm thanh liên tiếp bằng AVAudioPlayer?

Có ví dụ nào về điều này không? Làm thế nào tôi có thể thực hiện điều này?

Bất kỳ mã ví dụ nào sẽ được đánh giá rất nhiều!

Cảm ơn!

+0

Rất khó để tìm thấy bất kỳ thông tin nào về việc này ... – dot

Trả lời

1

Đối với mỗi bài hát bạn muốn tạo thành AVPlayer.

NSURL *url = [NSURL URLWithString:pathToYourFile];
AVPlayer *audioPlayer = [[AVPlayer alloc] initWithURL:url];
[audioPlayer play];

Bạn có thể nhận được một thông báo khi người chơi kết thúc. Kiểm tra AVPlayerItemDidPlayToEndTimeNotification khi thiết lập trình phát:

audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(playerItemDidReachEnd:) 
               name:AVPlayerItemDidPlayToEndTimeNotification 
              object:[audioPlayer currentItem]]; 

điều này sẽ ngăn người chơi tạm dừng ở cuối.

trong thông báo:

- (void)playerItemDidReachEnd:(NSNotification *)notification 
{ 
    // start your next song here 
} 

Bạn có thể bắt đầu bài hát tiếp theo của bạn ngay sau khi bạn nhận được thông báo rằng bài hát chơi hiện nay được thực hiện. Duy trì một số bộ đếm liên tục qua các cuộc gọi chọn. Bằng cách đó, sử dụng counter % [songs count] sẽ cung cấp cho bạn danh sách phát lặp vô hạn :)

Đừng quên hủy đăng ký thông báo khi phát hành trình phát.

+0

tôi làm gì đặt trong playerItemDidReachEnd? audioPlayer2 phát? nếu tôi có 5 bài hát thì sao? – dot

+0

vâng, bạn có thể làm điều đó. Mã tôi đặt ở trên là lý thuyết. Nó có thể nhưng không được bảo đảm. Nhưng ý tưởng có vẻ khả thi ... –

1

Thật không may, AVAudioPlayer chỉ có thể phát một tệp. Để phát hai tệp, bạn phải hủy phiên bản đầu tiên của AVAudioPlayer và tạo lại nó lần thứ hai (có thể bắt đầu bằng cách sử dụng - (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError). Vấn đề với phương pháp này là có một sự chậm trễ nhỏ giữa khi tệp đầu tiên kết thúc phát và khi tệp thứ hai bắt đầu phát. Nếu bạn muốn thoát khỏi sự chậm trễ này, bạn phải đào sâu vào Core Audio và đưa ra một giải pháp phức tạp hơn nhiều.

+0

tôi nghĩ rằng có một cách. kiểm tra câu trả lời của tôi. 'AVPlayer' có bộ chọn thông báo cho chúng ta biết khi nào bài hát đang phát kết thúc. Bằng cách đó, chúng tôi có thể chơi bài hát tiếp theo ngay sau khi hoàn thành. Điều đó có thể hiệu quả. –

+0

Tôi thực sự đã tạo một ứng dụng radio cho iPhone và iPad. Tôi biết như của iOS 4.2 vẫn còn một sự chậm trễ khi cố gắng chơi hai tập tin liên tiếp bằng cách sử dụng AVAudioPlayer. Tôi thậm chí đã cố gắng chuẩn bị một AVAudioPlayer riêng biệt bằng cách sử dụng phương thức 'preparToPlay' và có một phương thức thứ hai bắt đầu chơi ngay sau khi phương án đầu tiên được thực hiện, nhưng vẫn còn một chút chậm trễ. Nếu bạn không nhớ một chút chậm trễ giữa các âm thanh thì không có vấn đề gì lớn, nhưng nếu bạn muốn phát lại liên tục hoàn toàn giữa hai tập tin, tôi không nghĩ rằng AVAudioPlayer là con đường để đi. –

+0

không thể tưởng tượng có một khoảng cách đáng chú ý khi cố gắng sử dụng thông báo trừ khi các tập tin âm thanh chính nó có tiếng ồn trắng hoặc một số tiếng ồn trống ở cuối. Bằng cách đó, 'AVAudioPlayer' vẫn sẽ phát nhưng người dùng nghĩ rằng có khoảng cách. Vẫn còn tò mò muốn biết lý do tại sao điều này là như vậy ... –

13

AVQueuePlayer hoạt động cho tình huống này.

AVQueuePlayer là lớp con của AVPlayer bạn sử dụng để phát một số mục theo thứ tự.

+0

độc đáo trả lời .. Đây là những gì tôi muốn .. –

9

Thay vì AVAudioPlayer, bạn có thể sử dụng AVQueuePlayer phù hợp với trường hợp sử dụng này tốt hơn theo đề xuất của Ken. Dưới đây là một chút mã bạn có thể sử dụng:

@interface AVSound : NSObject 

@property (nonatomic, retain) AVQueuePlayer* queuePlayer; 

- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType; 
- (void)playQueue; 

@end 

@implementation AVSound 
- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType 
{ 
    // Path to the audio file 
    NSString *path = [[NSBundle mainBundle] pathForResource:pathForResource ofType:ofType]; 

    // If we can access the file... 
    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) 
    { 

     AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]]; 

     if (_queuePlayer == nil) { 
      _queuePlayer = [[AVQueuePlayer alloc] initWithPlayerItem:item]; 
     }else{ 
      [_queuePlayer insertItem:item afterItem:nil]; 
     } 
    } 

} 


- (void)playQueue 
{ 
    [_queuePlayer play]; 
} 
@end 

Sau đó, để sử dụng nó: Trong tập tin giao diện của bạn:

@property (strong, nonatomic) AVSound *pageSound; 

Trong tập tin thực thi của bạn:

- (void)addAudio:(Book*)book pageNum:(int)pageNum 
{ 

    NSString *soundFileEven = [NSString stringWithFormat:@"%02d", pageNum-1]; 
    NSString *soundPathEven = [NSString stringWithFormat:@"%@_%@", book.productId,  soundFileEven]; 
    NSString *soundFileOdd = [NSString stringWithFormat:@"%02d", pageNum]; 
    NSString *soundPathOdd = [NSString stringWithFormat:@"%@_%@", book.productId, soundFileOdd]; 

    if (_pageSound == nil) { 
     _pageSound = [[AVSound alloc]init]; 
     _pageSound.player.volume = 0.5; 
    } 

    [_pageSound clearQueue]; 

    [_pageSound addToPlaylist:soundPathEven ofType:@"mp3"]; 
    [_pageSound addToPlaylist:soundPathOdd ofType:@"mp3"]; 
    [_pageSound playQueue]; 
} 

HTH

Các vấn đề liên quan