2013-06-24 2 views
0

Следующий код воспроизводит песню из музыкальной библиотеки пользователя. Прекрасно работает на устройствах под управлением iOS6, но я не получаю никакого звука на устройствах под управлением iOS5. Что я делаю не так? Поиск проблем с AVAudioPlayer на iOS5 не сильно повышается.AVAudioPlayer не работает на iOS5

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback error:nil]; 


self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.songUrl error:nil]; 
[self.audioPlayer setNumberOfLoops:-1]; 
[self.audioPlayer play]; 

self.songUrl действителен. (Айпод-библиотека: //item/item.m4a ID = 557492601628322780)

+0

Спасибо за нижний план. Очень полезно. – soleil

ответ

0

Это, как я реализовал в своих приложениях совместим с прошивкой 5.0 и прошивкой 6.0

In your *.h file 
#import <UIKit/UIKit.h> 
#import <MediaPlayer/MediaPlayer.h> 
#import <AVFoundation/AVFoundation.h> 
#import <AudioToolbox/AudioToolbox.h> 


@interface v1MusicPicController : UIViewController <MPMediaPickerControllerDelegate, AVAudioPlayerDelegate> 
{ 

    MPMusicPlayerController *musicPlayer; 
    MPMediaItemCollection *userMediaItemCollection; 

} 

@property (nonatomic, retain) MPMusicPlayerController *musicPlayer; 
@property (nonatomic, retain) MPMediaItemCollection *userMediaItemCollection; 

--------- In your *.m file 


@implementation v1MusicPicController 

@synthesize musicPlayer; 
@synthesize userMediaItemCollection; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    [self setMusicPlayer: [MPMusicPlayerController applicationMusicPlayer]]; 

    // By default, an application music player takes on the shuffle and repeat modes 
    //  of the built-in iPod app. Here they are both turned off. 
    [musicPlayer setShuffleMode: MPMusicShuffleModeOff]; 
    [musicPlayer setRepeatMode: MPMusicRepeatModeNone]; 

} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (IBAction) DoneButtonMusic:(id)sender 
{ 
     MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic]; 
     mediaPicker.delegate = self; 
     mediaPicker.allowsPickingMultipleItems = YES; // this is the default 
     [self presentModalViewController:mediaPicker animated:YES]; 


} 

// To learn about notifications, see "Notifications" in Cocoa Fundamentals Guide. 
- (void) registerForMediaPlayerNotifications { 

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter addObserver: self 
          selector: @selector (handle_NowPlayingItemChanged:) 
           name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
          object: musicPlayer]; 

    [notificationCenter addObserver: self 
          selector: @selector (handle_PlaybackStateChanged:) 
           name: MPMusicPlayerControllerPlaybackStateDidChangeNotification 
          object: musicPlayer]; 


    [musicPlayer beginGeneratingPlaybackNotifications]; 
} 

- (void) updatePlayerQueueWithMediaCollection: (MPMediaItemCollection *) mediaItemCollection 
{         


    if (userMediaItemCollection == nil) 
    { 

     //NSLog(@"Went here 4"); 

     // apply the new media item collection as a playback queue for the music player 
     [self setUserMediaItemCollection: mediaItemCollection]; 
     [musicPlayer setQueueWithItemCollection: userMediaItemCollection]; 
     [musicPlayer play]; 

    } 

} 


// Media picker delegate methods 
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection 
{ 

    //NSLog(@"Went here 2"); 

    // We need to dismiss the picker 
    [self dismissModalViewControllerAnimated:YES]; 

    // Apply the chosen songs to the music player's queue. 
    [self updatePlayerQueueWithMediaCollection: mediaItemCollection]; 

} 

- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker 
{ 
    // User did not select anything 
    // We need to dismiss the picker 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Вы уже знаете, это но я использую AVAudioPlayer для воспроизведения звуков, которые находятся в моем приложении.

@property (nonatomic, retain) AVAudioPlayer *myAudioPlayer1; 
@synthesize myAudioPlayer1; 

// ************************ 
     // PLAY AUDIO 
     // ************************ 
     [myAudioPlayer1 stop]; 

     NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"funny_sound" ofType: @"mp3"]; 
     NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];  
     myAudioPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; 
     [myAudioPlayer1 play]; 
0

Я наблюдаю то же поведение с URL-адресами библиотеки ipod. Более конкретно, initWithContentsOfURL задает код ошибки -43, который похож на ошибку, не найденную в файле. По-видимому, это было исправлено или добавлена ​​поддержка в iOS 6, но я не нашел никаких официальных объяснений.

Loading the audio into an NSData and using AVAudioPlayer initWithData также не удался для меня с аналогичной ошибкой (код NSData 256).

Лучшее решение, которое я нашел до сих пор, это use AVPlayer instead of AVAudioPlayer, но это займет некоторое доработку, потому что методы и свойства немного отличаются.

 Смежные вопросы

  • Нет связанных вопросов^_^