2

Matt Gallagher による AudioStreamer クラスを使用して音楽をストリーミングするアプリがあります。これは、ストリームが終了したら次の曲にスキップできるようにしたいことを除いて、バックグラウンド プロセスとして正常に機能します。残念ながら、この部分は機能しません。最初はストリームを監視するタイマーがありましたが、アプリがバックグラウンドになると、このタイマーが実行されなくなることに気付きました。そこで、パケット読み取り関数にデリゲート コールバックを追加してみました。

void ASReadStreamCallBack(CFReadStreamRef aStream, CFStreamEventType eventType, void* inClientInfo)
{
   AudioStreamer* streamer = (AudioStreamer *)inClientInfo;
   double percent = [streamer progress]/[streamer duration];
   if(percent>=0.98 || (percent>=0.95 && [streamer isIdle])){
     if([streamer.delegate respondsToSelector:@selector(didFinishPlayingStream:)] ){
         [streamer.delegate didFinishPlayingStream:streamer];
         streamer.delegate = nil;
     }
   }


   [streamer handleReadFromStream:aStream eventType:eventType];
}

これは、アプリがフォアグラウンドにある場合は正常に機能しますが、アプリがバックグラウンドの場合は機能しなくなります。デリゲート メソッドは基本的に、次の曲のストリーム URL を取得するためのリクエストを送信し、取得すると新しい AudioStreamer クラスを作成します。

4

2 に答える 2

1

MattGallagherのAudioStreamerに一部触発されたAudioPlayer/streamerクラスを https://code.google.com/p/audjustableにアップロードしました。

クールな機能の1つは、ギャップレス再生のサポートです。これは、AudioQueueがギャップ間で閉じられることがないことを意味します。iOSがアプリを一時停止しないようにします。

を呼び出すことにより、実装AudioPlayerDelegate:didFinishBufferingSourceWithQueueItemIdAudioPlayerDelegate:didFinishPlayingQueueItemIdて次のトラックをキューに入れることができますAudioPlayer:queueDataSource

それを使用するのに助けが必要な場合は私に知らせてください。

于 2012-06-03T12:27:48.280 に答える
1

アプリがバックグラウンドにある間、さまざまなリモート コントロールの状態を処理するデリゲートを実装できます。

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { 
switch (receivedEvent.subtype) {
    case UIEventSubtypeRemoteControlTogglePlayPause:
        if (player.isPlaying) {
            [player pause];
        } else {
            [player start];
        }
        break;

    case UIEventSubtypeRemoteControlPreviousTrack:
        break;

    case UIEventSubtypeRemoteControlNextTrack:
        [self skipSong:nil];
        break;

    default:
        break;
} }

このようなものは私にとってはうまくいきます。

于 2012-05-15T09:14:31.340 に答える