web-dev-qa-db-ja.com

AVAudioplayerを使用してバックグラウンドで音楽を再生する

アプリがバックグラウンドになったとしても音楽を再生したい。すべてのstackoverflowリンクをチェックしましたが、どれも機能しませんでした。今日それをする必要があるのを手伝ってください。

私は次のコードを使用していました:-

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Day At The Beach"  ofType: @"mp3"];

NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];

NSError *error;
playerTemp = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
playerTemp.numberOfLoops = 0;
AudioSessionSetActive(true);
[playerTemp play];
38
leena

Mehulの答えにメモを追加したかっただけです。この行:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

実際には非常に重要です。他のチュートリアルを使用して、AVAudioPlayerを起動して実行しました。アプリがバックグラウンドにある場合、私のオーディオが起動しないことを除いて、すべてが正常に機能しました。明確にするために、アプリがバックグラウンドになったときに既に再生されていた場合、私のオーディオは問題ありませんでしたが、アプリが既にバックグラウンドにあった場合は起動しませんでした。

上記のコード行を追加すると、アプリがバックグラウンドにある場合でも音声が開始されるようになりました。

32
ghostatron

Info.plistでUIBackgroundModesの1つとして「オーディオ」を設定する必要があります。 Apple has 問題に関するドキュメント

6
Alastair Stuart

この行をバックグラウンド実行用のplistに書き込みます...

<key>UIBackgroundModes</key>
      <array>
              <string>audio</string>
      </array>

使用したい場所にこのコードを書く

AVAudioPlayer*  audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.urlForConevW error:&error];
audioPlayer.delegate = self;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
audioPlayer.numberOfLoops =  1;       
[audioPlayer play];
4
sankalp

MPMusicPlayerControllerを使用している場合は、ここでも重要です:使用する必要があります:

[MPMusicPlayerController iPodMusicPlayer] 

そしてない

[MPMusicPlayerController applicationMusicPlayer] 

また、アプリにstop musicアプリの起動時に再生していたものは、こちらをご覧ください: AVAudioPlayerはiPodをオフにします-回避策は?

3
Andy Weinstein

MPMoviePlayerControllerを使用して、ソロのオーディオムービーを再生することもできます。よろしければ、この詳細なApple Library Technical Q&A:

iOS開発者ライブラリテクニカルQ&A QA1668

3
viggio24

PlistでUIBackgroundModesの1つとしてオーディオを設定した後でも、バックグラウンドに移行するときにオーディオが停止する場合は、setting your application's audio sessionからmedia playback

関連リファレンスは次のとおりです。 https://developer.Apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html

コードは次のようになります。

NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];

NSError*setCategoryError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
2
Zaky German

以下のコードを使用します。それは私のために働き、オーディオプレーヤーインスタンスメソッドのボタンクリックで呼び出します。

NSError *error; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]]; 
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
[[AVAudioSession sharedInstance] setActive:YES error: &error]; 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self.player prepareToPlay];
2
user2168844

すべての回答から、ユーザーがデバイスを起動しているときにプレーヤーを制御するためのこのコードが欠落しています。

- (BOOL)canBecomeFirstResponder {
        return YES;
    }

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    switch (event.subtype) {

        case UIEventSubtypeRemoteControlPlay:

            [_audioPlayer play];
            break;

        case UIEventSubtypeRemoteControlPause:

            [_audioPlayer pause];
            break;

        default:
            break;
    }
}

そして、これらすべてのオプションがあります:

UIEventSubtypeRemoteControlPlay                 = 100,
UIEventSubtypeRemoteControlPause                = 101,
UIEventSubtypeRemoteControlStop                 = 102,
UIEventSubtypeRemoteControlTogglePlayPause      = 103,
UIEventSubtypeRemoteControlNextTrack            = 104,
UIEventSubtypeRemoteControlPreviousTrack        = 105,
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward   = 107,
UIEventSubtypeRemoteControlBeginSeekingForward  = 108,
UIEventSubtypeRemoteControlEndSeekingForward    = 109,
2
Winston

バックグラウンドでオーディオを再生するには

ステップ1:info.plistを追加して配列を作成します enter image description here

ステップ2 :

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    __block UIBackgroundTaskIdentifier task = 0;
    task=[application beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
        [application endBackgroundTask:task];
        task=UIBackgroundTaskInvalid;
    }];
}

ステップ3:

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"iNamokar" ofType:@"mp3"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];

    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[player prepareToPlay];
[self.player play];
1
Kanhaiya Sharma

Appleのサンプルコードから:オーディオミキサー(MixerHost)

// If using a nonmixable audio session category, as this app does, you must activate reception of 
//    remote-control events to allow reactivation of the audio session when running in the background.
//    Also, to receive remote-control events, the app must be eligible to become the first responder.
- (void) viewDidAppear: (BOOL) animated {

    [super viewDidAppear: animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}

次の場合、リモートコントロールイベントは必要ないと思います。

AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers,
                        sizeof(value), &value);
0
Gamma-Point