iOS SDK: проигрывание музыки на фоне и переключение режимов просмотра - PullRequest
4 голосов
/ 12 декабря 2011

Я пытаюсь воспроизвести музыку в своем приложении. Музыка работает нормально, но после переключения viewControllers и возврата в главное меню моя музыка воспроизводится снова! Это означает, что несколько одинаковых звуков играют вместе! Как я могу решить это? Вот мой код:

- (void)viewDidLoad {

    NSString *music = [[NSBundle mainBundle] pathForResource:@"1music" ofType:@"mp3"];
    myMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:music] error:NULL];
    myMusic.delegate = self;
    myMusic.numberOfLoops = -1; 
    [myMusic play];
}


- (IBAction) scoreView {

    ScoreViewController *scoreView = [[ScoreViewController alloc] initWithNibName:@"ScoreViewController" bundle:nil];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
    [self.view addSubview: scoreView.view];
    [UIView commitAnimations];
}

РЕДАКТИРОВАННЫЙ КОД:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
        if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {

            NSString * musicSonati = [[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"];
            myMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:musicSonati] error:NULL];
            myMusic.delegate = self;
            myMusic.numberOfLoops = -1;
            [myMusic play];

        }
        return self;
    }

//toggle button
- (IBAction)MusicPlaying:(id)sender {

    if ((isPlay = !isPlay))
    {

        UIImage *buttonImageNormal = [UIImage imageNamed:@"play.png"]; 
        UIImage *stretchableButtonImageNormal = [buttonImageNormal  stretchableImageWithLeftCapWidth:0 topCapHeight:0]; 
        [MusicButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 
        [myMusic pause];



    }else {

        UIImage *buttonImageNormal = [UIImage imageNamed:@"pause.png"]; 
        UIImage *stretchableButtonImageNormal = [buttonImageNormal  stretchableImageWithLeftCapWidth:0 topCapHeight:0]; 
        [MusicButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 
        NSLog(@"Music play");
        [myMusic play];

    } 

}

Ответы [ 5 ]

5 голосов
/ 26 декабря 2011

Если у вас есть звук для воспроизведения в нескольких местах, то одним из простых способов добиться этого является объявление экземпляра AVAudioPlayer в делегате со свойством синтезированной. Если вы хотите воспроизвести это где-либо, сделайте следующее: -

MyAppDelegate *app_delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];


if(app_delegate.audioPlayer)
{
    [app_delegate.audioPlayer release];
    app_delegate.audioPlayer = nil;
}
app_delegate.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];     

иесли вы хотите остановить звук, сделайте следующее: -

if(app_delegate.audioPlayer)
{
    if([app_delegate.audioPlayer isPlaying])
    {
        [app_delegate.audioPlayer stop];
        [app_delegate.audioPlayer setCurrentTime:0];
    }
}

и воспроизведите новый выпуск звукового файла и ноль того же проигрывателя, если он уже выделен, или назначьте его снова с новым URL звукового файла.

4 голосов
/ 29 декабря 2011

Убедитесь, что myMusic правильно объявлен как сохраняемое свойство и синтезирован, затем попробуйте что-то вроде этого:

-(void) commonInit {
    NSString * musicSonati = [[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"];
    self.myMusic = [[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:musicSonati] error:NULL] autorelease];
    self.myMusic.delegate = self;
    self.myMusic.numberOfLoops = -1;
//You probably don't want to play music on init, rather defer to viewDidLoad.
//        [self.myMusic play];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (id)init {
    self = [super init];
    if (self) {
        [self commonInit];
    }
    return self;
}

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

Тогда попробуйте это в своем viewDidLoad:

- (void)viewDidLoad {
    ...
    if (!self.myMusic.playing) {
        [self.myMusic play];
    }
    ...
}

Также не забудьте выпустить своего игрока в dealloc!

1 голос
/ 27 декабря 2011

Инициализируйте плеер в файле делегата приложения и воспроизведите фоновую музыку.Устанавливайте только одну переменную в делегате приложения, которая проверяет, воспроизводится ли музыка как true или false ... и наслаждайтесь вашим приложением без перезапуска музыки ......

В вашем коде вы инициализируете свой плеер в представлении загрузил и метод init... вот почему вы перезагружаете музыку ..... просто вызывайте ее только один раз в приложении делегировать метод applicationdidfinshLaunching () ....

1 голос
/ 26 декабря 2011

Похоже, вы разрабатываете игру (из названия вашей функции After viewLoad (ScoreView).;))

Ну, по моему мнению, AvAudioplayer не является хорошим вариантом, если вы хотите реализовать его с помощью Game.

Используйте cocosdenshion, загрузите последнюю папку cocos2d, найдите эти 9 файлов, поместите ее в папку ресурсов,

И все готово ... !!!

#import "SimpleAudioEngine.h" // wherever you want to call in head part of the file.

Короткий файл вызова Step1.!

[[SimpleAudioEngine sharedEngine] playEffect:@"blast.mp3"];

step2 цикл фонового вызова.

[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"background.mp3" loop:YES];

ПРИМЕЧАНИЕ: есть список доступных функций http://www.cocos2d -iphone.org / api-ref / 0.99.5 / interface_simple_audio_engine.html , это очень просто и просто!

Вся реализация займет не более 20 минут!

1 голос
/ 12 декабря 2011

Во-первых, viewDidLoad, вероятно, не подходит для инициализации AVAudioPlayer, поскольку системе может потребоваться выгрузить некоторые из ваших компонентов для восстановления памяти (в viewDidUnload). Возможно, вам следует создать AVAudioPlayer в вашем init методе или аналогичном.

Итак, в итоге вы создаете вторую AVAudioPlayer, когда фокус возвращается на ваше приложение, и вы фактически теряете ссылку на первое. (Таким образом, также утечка памяти. )

Если вы хотите начать воспроизведение музыки при загрузке представления, вам следует дополнительно проверить ее состояние, прежде чем сделать это:

- (void)viewDidLoad {
    ...
    if (!myMusic.playing) {
        [myMusic play];
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...