0

シナリオ:

アプリは、ラジオ局から音楽をストリーミングするためのものです。これにはAVPlayerを使用しています。アプリはバックグラウンドで音楽を再生できます ( Required background modesplist で)。アプリはロックされた画面から再生/一時停止アクションを受け取ることができます ( AVAudioSessionDelegateandremoteControlReceivedWithEventメソッドを使用)。そして、この部分は大丈夫です。

問題

ユーザーがアプリを起動します。最初の画面がロードされたら、ユーザーは「再生」ボタンをタップします。これで、私のコードでは AVPlayer が初期化され、このタスクの準備が整うとすぐに音楽の再生が開始されます。ただし、このタスクは、高速 Wi-Fi でも 3 ~ 5 秒ほど続きます。

もちろん、ユーザーがホームボタンをタップできる 3 ~ 5 秒の間に、アプリはバックグラウンドになり、AVPlayer はオーディオの再生を開始しません。

どうすればこれを処理できますか? 駆け込んでみましたが、役に立ちませんでした[avplayer play]dispatch_asyncまた、AppDelegate で AVPlayer を初期化しようとしましたが、オーディオの読み込みが速くなりましたが、それでも、ユーザーはより速くなる可能性があります... この問題を解決するには、どのようなアプローチが適切ですか?

更新 - プレーヤーを初期化するためのコード

ヘッダー ファイル (MainViewController) 内: //MyPlayer は AVPlayer のサブクラスです

@property (nonatomic, strong) MyPlayer *playerBrain;

実装ファイル:

//lazy instantiation
- (MyPlayer*)playerBrain
{
    if (_playerBrain == nil) _playerBrain = [[MyPlayer alloc] initWithURL:[NSURL URLWithString:@"correct_URL_To_MP3_File"]];
    return _playerBrain;
}

- (IBAction)onOffSwitch:(UISwitch *)sender
{
    if (sender.isOn)
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSLog(@"inside block!");
            [self.playerBrain playRadio];
        });
    }
    else
    {
        [self.playerBrain pause];
    }
}

// MyPlayer 実装内

- (void)playRadio
{
     [self play]; //this is method from parent, AVPlayer
}
4

1 に答える 1

0

これが機能するかどうかはわかりませんが、テストしていませんが、オーディオがロードされるまで、ローカルに保存された 1 秒間の無音をループで再生できますか? その後、アプリは引き続きバックグラウンドで実行されているはずであり、ロードが完了したら実際のオーディオに切り替えることができます。

于 2013-06-08T10:20:51.770 に答える