2011-11-12 24 views

cevap

1

Tek bir AVPlayer yapmak istediğiniz her şarkı için.

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

oyuncu sona erdiğinde Bir Bildirimi alabilirsiniz

. çaları kurarken AVPlayerItemDidPlayToEndTimeNotification kontrol edin: Bu uçta duraklatmak oyuncu engeller

audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

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

. Bildirimde

:

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

geçerli oyun şarkı yapılır kişiye bir bildirim biter bitmez bir sonraki şarkıyı başlayabilirsiniz. Seçici aramalarda kalıcı olan bazı sayaçları koruyun. counter % [songs count] kullanarak bu şekilde sonsuz bir döngü çalma listesi verilecektir :)

Müzikçaları serbest bırakırken bildirimin kaydını silme.

+0

ne yaparım playerItemDidReachEnd koymak? audioPlayer2 oyun? 5 şarkım varsa ne olur? – dot

+0

evet bunu yapabilirsin. Yukarıda belirttiğim kod teorik. Bu garantili olabilir ama garanti edilemez. Ama fikir işe yarıyor gibi görünüyor ... –

1

Ne yazık ki, AVAudioPlayer sadece bir dosya çalabilir. İki dosyayı oynatmak için, AVAudioPlayer'ın ilk örneğini öldürmeniz ve onu ikinci kez yeniden oluşturmanız gerekir (- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError kullanılarak başlatılabilir). Bu yaklaşımdaki problem, ilk dosyanın ne zaman çalınması ile ikinci dosya oynatılmaya başlaması arasında ufak bir gecikme olmasıdır. Bu gecikmeden kurtulmak istiyorsanız, Core Audio'a girmeniz ve çok daha karmaşık bir çözüm bulmanız gerekiyor. Bu durum için AVQueuePlayer çalışması

+0

Sanırım bir yolu var. Cevabımı kontrol et. 'AVPlayer', şu anda çalınan bir şarkı bittiğinde bize bildiren bir bildirim seçicisine sahiptir. Böylece, bir sonraki şarkıyı akım biter bitmez oynayabiliriz. Işe yarayabilir. –

+0

iPhone ve iPad için aslında bir radyo uygulaması yaptım. IOS 4.2'den itibaren biliyorum, AVAudioPlayer kullanarak bir satırda iki dosya çalmaya çalışırken hala bir gecikme oldu. Hatta "prepareToPlay" yöntemini kullanarak ayrı bir AVAudioPlayer hazırlamaya çalıştım ve ikincisinin ilk yapıldığı anda oynamaya başlamasına rağmen, hala biraz gecikme oldu. Eğer sesler arasında hafif bir gecikme yoksa, büyük bir anlaşma değil, ama iki dosya arasında tamamen sürekli oynatma istiyorsanız, AVAudioPlayer'ın gitmenin yolu olduğunu sanmıyorum. –

+0

, ses dosyasının kendisinde beyaz gürültü veya sonunda boş bir ses olmadıkça, bildirimi kullanmaya çalışırken fark edilir bir boşluğa sahip olduğunu hayal edemez. Bu şekilde 'AVAudioPlayer' hala çalıyor ancak kullanıcı boşluğun olduğunu düşünüyor. Hala bu kadar neden olduğunu bilmek merak ediyor ... –

13

.

AVQueuePlayer, sırayla bir dizi öğeyi oynatmak için kullandığınız bir AVPlayer alt sınıftır.

+0

güzelce cevap ses dosyalarını çalmak geliyor geliyor .. Bu ne istediğini .. –

9

AVAudioPlayer yerine, bu kullanım örneğine uyan AVQueuePlayer'ı Ken tarafından önerilen şekilde daha iyi kullanabilirsiniz.

@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 

Sonra kullanmak için: Arayüz dosyasında:

- (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

: En uygulama dosyasında

@property (strong, nonatomic) AVSound *pageSound; 

İşte kod biraz kullanabilirsiniz olduğu

İlgili konular