iOS AVPlayerを利用したネットワーク音楽再生方法教程
9487 ワード
前言
今は百度の音楽や豆板ラジオのようなオンライン音楽アプリを作るつもりですが、どうしますか?
まずオーディオ再生の実現レベルを理解してください。
(1)オフライン再生:ここでは、アプリケーションがネットワークに接続されていないということではなく、ローカルオーディオファイルを再生し、先にダウンロードしてオーディオファイルを完成してから再生する場合を含み、AVFoundation内のAVAudioPlayerを使用して満足できます。
(2)オンライン再生:AVFoundationを使ったAVPlayerが満足できる。
(3)オンライン再生と同時にファイルを保存する:Audio FileStreamer+AudioQueを使って満足できる。
(4)オンラインで再生し、サウンド処理がある:AudioFileStreamer+AudioQue+サウンドモジュール(システムは自分で持ちますか?それとも自分で開発します)を使って満足します。
本論文では主に第二段階について、AVPlayerを使ってネットワーク音楽の再生方法を紹介します。
AVPlayerとは
AVPlayerはAVFoundationに存在していますが、それを使って音楽を再生するのは大丈夫です。もちろん音楽を再生するのにインタフェースが必要ではないので、そのインタフェースを実現する必要はありません。
AVPlayerと連絡が深い名詞:
Aset:AVAsssetは抽象類であり、直接使用できない。そのサブクラスのAVURLAssetは、URLからメディア情報を含むAsetオブジェクトを生成することができる。
AVPlayerItem:メディアリソースと対応関係があり、メディアリソースの情報と状態を管理しています。
機能ニーズ
通常音楽を再生し、画面に表示するために必要な機能は以下の通りです。
1、(コア)プレーヤーは一つのネットワークリンクを通して音楽を再生する。
2、(基本)プレーヤーの常用操作:一時停止、再生、前首、次首など
3、(基本的に)音楽の再生進捗を監督し、音楽の総時間、現在の再生時間を取得する。
4、(基本)モニターはプレーヤーの状態を変える:
メディア負荷状態
(2)データバッファ状態
(3)再生完了状態
5、(オプション)Remote Controlは音楽の再生を制御します。
6、(オプション)Now Playing Centerは、再生中の音楽を展示します。
機能の実現
1、一つのネットリンクを通して音楽を再生する。
再生:
一時停止:
ここでは、次の曲を自分でコントロールするitemと、現在再生されているitemに置き換える方法が二つあります。
(1)方法は、CMTime構造体に導入され、一定時間ごとに1回、再生開始と終了を含むように調整される。
(2)blockの中の操作に時間がかかりすぎると、次回は必ず返事が来るとは限りませんので、できるだけblockの操作時間を減らすようにします。
(3)方法は観察者の対象に戻ります。再生が終わったらこの観察者を削除する必要があります。
観測者を追加:
(1)メディアローディング状態
再生が完了したら、観察者を削除する必要があります。
再生が完了したら、観察者を削除する必要があります。
AVPlayer再生完了のお知らせを傍受します。
次の曲を再生する前に、このアイテムを削除する観察者を忘れないでください。
Remote Controlは、APPを開けないで、その再生をコントロールできます。最も一般的なのはロック画面に現れ、スクリーンの底から引っ張り出し、イヤホンの線制御の3種類で、ユーザー体験を高める効果があります。
私たちはAppDelegateにRemote Controlを設置します。
(1)Remote Controlイベントの受信を宣言する
Now Playing Centerは、ロック画面で音楽の情報を展示することができ、ユーザー体験を強化する役割を果たしています。
Now Playingセンターはいつ設置すればいいですか?ネット音楽を再生するには、現在再生されている曲の変化(次の曲に切り替わるような場合)、現在の曲の情報が変化した場合(例えば、UnknownからReadyToPlayまで)、現在の曲がドラッグして進行している場合があります。
Baiduの音楽を使って曲を聴いている読者がいると、ロック歌詞が付いていることが分かりますが、「歌詞とカバーを合成した新しい画像をNow Playing Centerの表紙+歌詞が躍進したときにNow Playing Centerを更新する」という設定で実現したので、興味のある方は検討してみてください。
全体の再生ロジックについて
音楽プレーヤーの再生ロジックをまとめます。
(1)プレイ画面を初期化する
(2)インタフェースからプレイリストを取得し、最初の曲を現在の再生曲として選択する。
(3)現在の曲初期化プレーヤー、同期曲情報に基づいて、再生画面に(この時、再生画面は歌曲情報を示すべきですが、再生ボタンは利用できなくて、loadingなどのヒントがあります。曲をロードしていることを表します。)、同期曲情報はNow Playing Centerになります。
(4)プレーヤーのstatusがReadyToPlayに変更されると、歌曲の再生、同期再生情報が再生画面(再生時間、総時間、プログレスバーなど)、同期再生情報がNow Playing Centerに流れる。
(5)ユーザーが一時停止操作を行った場合、再生画面を更新する。
(6)ユーザが次の曲、前の曲を操作すると、またはある曲の再生が完了すると、対応する曲を現在の再生曲に設定し、3-5のステップを繰り返す。
(7)ネットワークの状況が良くないため、プレーヤーが自動的に再生を停止する場合、再生画面を更新しなければならない。
(8)ネットワークの状況が良くないため、プレーヤーが再生状態に入らない場合は、処理するべきです。
後記
本論文では、基本的な機能を実現するという観点からAVPlayerがネットワーク音楽を再生することを紹介しました。実際にAVPlayerの機能はこれだけではなく、興味のある学生はAVFoundationを深く勉強することができます。
はい、以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてほしいです。もし疑問があれば、メッセージを残して交流してください。ありがとうございます。
今は百度の音楽や豆板ラジオのようなオンライン音楽アプリを作るつもりですが、どうしますか?
まずオーディオ再生の実現レベルを理解してください。
(1)オフライン再生:ここでは、アプリケーションがネットワークに接続されていないということではなく、ローカルオーディオファイルを再生し、先にダウンロードしてオーディオファイルを完成してから再生する場合を含み、AVFoundation内のAVAudioPlayerを使用して満足できます。
(2)オンライン再生:AVFoundationを使ったAVPlayerが満足できる。
(3)オンライン再生と同時にファイルを保存する:Audio FileStreamer+AudioQueを使って満足できる。
(4)オンラインで再生し、サウンド処理がある:AudioFileStreamer+AudioQue+サウンドモジュール(システムは自分で持ちますか?それとも自分で開発します)を使って満足します。
本論文では主に第二段階について、AVPlayerを使ってネットワーク音楽の再生方法を紹介します。
AVPlayerとは
AVPlayerはAVFoundationに存在していますが、それを使って音楽を再生するのは大丈夫です。もちろん音楽を再生するのにインタフェースが必要ではないので、そのインタフェースを実現する必要はありません。
AVPlayerと連絡が深い名詞:
Aset:AVAsssetは抽象類であり、直接使用できない。そのサブクラスのAVURLAssetは、URLからメディア情報を含むAsetオブジェクトを生成することができる。
AVPlayerItem:メディアリソースと対応関係があり、メディアリソースの情報と状態を管理しています。
機能ニーズ
通常音楽を再生し、画面に表示するために必要な機能は以下の通りです。
1、(コア)プレーヤーは一つのネットワークリンクを通して音楽を再生する。
2、(基本)プレーヤーの常用操作:一時停止、再生、前首、次首など
3、(基本的に)音楽の再生進捗を監督し、音楽の総時間、現在の再生時間を取得する。
4、(基本)モニターはプレーヤーの状態を変える:
メディア負荷状態
(2)データバッファ状態
(3)再生完了状態
5、(オプション)Remote Controlは音楽の再生を制御します。
6、(オプション)Now Playing Centerは、再生中の音楽を展示します。
機能の実現
1、一つのネットリンクを通して音楽を再生する。
NSURL * url = [NSURL URLWithString:self.currentSong.url];
AVPlayerItem * songItem = [[AVPlayerItem alloc]initWithURL:url];
AVPlayer * player = [[AVPlayer alloc]initWithPlayerItem:songItem];
ここは一つのクラスでプレーヤを初期化します。もちろんあなたも直接URLで初期化できます。
AVPlayer * player = [[AVPlayer alloc] initWithURL:url];
現在再生されているアイテムを取得するには、このようにして取得できます。
AVPlayerItem * songItem = player.currentItem;
2、プレーヤーの常用操作再生:
[player play];
初期化が完了したらすぐに再生が始まるとは限らないので、Playerの状態がReadyToPlayになるまで待つ必要があります。一時停止:
[player pause];
前の曲、次の曲:ここでは、次の曲を自分でコントロールするitemと、現在再生されているitemに置き換える方法が二つあります。
[player replaceCurrentItemWithPlayerItem:songItem];
もう一つは、AVPlayerのサブクラスAVQueueue Playerを使って複数のアイテムを再生し、advance ToNextItemを呼び出して次の音楽を再生します。
NSArray * items = @[item1, item2, item3 ....];
AVQueuePlayer * queuePlayer = [[AVQueuePlayer alloc]initWithItems:items];
3、放送の進捗を監督するaddPeriodicTimeObserverForInterval:queue:usingBlock:
を使用してプレーヤーの進捗を監督する。(1)方法は、CMTime構造体に導入され、一定時間ごとに1回、再生開始と終了を含むように調整される。
(2)blockの中の操作に時間がかかりすぎると、次回は必ず返事が来るとは限りませんので、できるだけblockの操作時間を減らすようにします。
(3)方法は観察者の対象に戻ります。再生が終わったらこの観察者を削除する必要があります。
観測者を追加:
id timeObserve = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
float current = CMTimeGetSeconds(time);
float total = CMTimeGetSeconds(songItem.duration);
if (current) {
weakSelf.progress = current / total;
weakSelf.playTime = [NSString stringWithFormat:@"%.f",current];
weakSelf.playDuration = [NSString stringWithFormat:@"%.2f",total]; }
}];
観測者を削除:
if (timeObserve) {
[player removeTimeObserver:_timeObserve];
timeObserve = nil;
}
4、モニターをプレーヤーの状態に変更する(1)メディアローディング状態
[songItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
その後、KVO方法でそのstatusの変更を取得することができる。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if ([keyPath isEqualToString:@"status"]) {
switch (self.player.status) {
case AVPlayerStatusUnknown:
BASE_INFO_FUN(@"KVO: , ");
break;
case AVPlayerStatusReadyToPlay:
self.status = SUPlayStatusReadyToPlay;
BASE_INFO_FUN(@"KVO: , ");
break;
case AVPlayerStatusFailed:
BASE_INFO_FUN(@"KVO: , ");
break;
default:
break;
}
}
}
一般的にPlayerを初期化してから再生するまではUnknownからReadyToPlayまでの過程がありますが、ネットワークの状況が良い時はUnknown状態のヒントがないかもしれません。再生が完了したら、観察者を削除する必要があります。
[songItem removeObserver:self forKeyPath:@"status"];
(2)データバッファ状態
[songItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
その後、KVO方法でそのstatusの変更を取得することができる。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
AVPlayerItem * songItem = object;
if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
NSArray * array = songItem.loadedTimeRanges;
CMTimeRange timeRange = [array.firstObject CMTimeRangeValue]; //
NSTimeInterval totalBuffer = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration); //
SuLog(@" %.2f",totalBuffer);
}
}
プログレスバーでバッファの進捗を示す必要があるなら、この観察者を増やすことができます。再生が完了したら、観察者を削除する必要があります。
[songItem removeObserver:self forKeyPath:@" loadedTimeRanges"];
(3)再生完了状態AVPlayer再生完了のお知らせを傍受します。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:songItem];
- (void)playbackFinished:(NSNotification *)notice {
BASE_INFO_FUN(@" ");
[self playNext];
}
放送が終わったら、次の曲を再生する操作が行われます。次の曲を再生する前に、このアイテムを削除する観察者を忘れないでください。
[[NSNotificationCenter defaultCenter] removeObserver:self];
5、Remote Control音楽の再生を制御するRemote Controlは、APPを開けないで、その再生をコントロールできます。最も一般的なのはロック画面に現れ、スクリーンの底から引っ張り出し、イヤホンの線制御の3種類で、ユーザー体験を高める効果があります。
私たちはAppDelegateにRemote Controlを設置します。
(1)Remote Controlイベントの受信を宣言する
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
(2)書き換え方法は、第一応答者となる。
- (BOOL)canBecomeFirstResponder {
return YES;
}
(3)事件を処理する
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
[self.player startPlay];
BASE_INFO_FUN(@“remote_ ");
break;
case UIEventSubtypeRemoteControlPause:
[self.player pausePlay];
BASE_INFO_FUN(@"remote_ ");
break;
case UIEventSubtypeRemoteControlNextTrack:
[self.player playNextSong];
BASE_INFO_FUN(@"remote_ ");
break;
case UIEventSubtypeRemoteControlTogglePlayPause:
self.player.isPlaying ? [self.player pausePlay] : [self.player startPlay];
BASE_INFO_FUN(@“remote_ / ");
break;
default:
break; }
}
6、Now PlayingセンターNow Playing Centerは、ロック画面で音楽の情報を展示することができ、ユーザー体験を強化する役割を果たしています。
- (void)configNowPlayingCenter { BASE_INFO_FUN(@" NowPlayingCenter");
NSMutableDictionary * info = [NSMutableDictionary dictionary];
//
[info setObject:_player.currentSong.title forKey:MPMediaItemPropertyTitle];
//
[info setObject:_player.currentSong.artist forKey:MPMediaItemPropertyArtist];
//
[info setObject:@(self.player.playTime.intValue) forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
//
[info setObject:@(1) forKey:MPNowPlayingInfoPropertyPlaybackRate];
//
[info setObject:@(self.player.playDuration.intValue) forKey:MPMediaItemPropertyPlaybackDuration];
//
MPMediaItemArtwork * artwork = [[MPMediaItemArtwork alloc] initWithImage:_player.coverImg];
[info setObject:artwork forKey:MPMediaItemPropertyArtwork];
//
[[MPNowPlayingInfoCenter defaultCenter]setNowPlayingInfo:info];
}
Now Playing Centerは一秒ごとに更新する必要はありません。設定したPlaybackRateによって、プログレスバーの展示の進捗を計算します。例えば、PlaybackRateの転送1は、1秒ごとに更新されたプログレス表示です。もちろん、一時停止しても自動的に停止されます。Now Playingセンターはいつ設置すればいいですか?ネット音楽を再生するには、現在再生されている曲の変化(次の曲に切り替わるような場合)、現在の曲の情報が変化した場合(例えば、UnknownからReadyToPlayまで)、現在の曲がドラッグして進行している場合があります。
Baiduの音楽を使って曲を聴いている読者がいると、ロック歌詞が付いていることが分かりますが、「歌詞とカバーを合成した新しい画像をNow Playing Centerの表紙+歌詞が躍進したときにNow Playing Centerを更新する」という設定で実現したので、興味のある方は検討してみてください。
全体の再生ロジックについて
音楽プレーヤーの再生ロジックをまとめます。
(1)プレイ画面を初期化する
(2)インタフェースからプレイリストを取得し、最初の曲を現在の再生曲として選択する。
(3)現在の曲初期化プレーヤー、同期曲情報に基づいて、再生画面に(この時、再生画面は歌曲情報を示すべきですが、再生ボタンは利用できなくて、loadingなどのヒントがあります。曲をロードしていることを表します。)、同期曲情報はNow Playing Centerになります。
(4)プレーヤーのstatusがReadyToPlayに変更されると、歌曲の再生、同期再生情報が再生画面(再生時間、総時間、プログレスバーなど)、同期再生情報がNow Playing Centerに流れる。
(5)ユーザーが一時停止操作を行った場合、再生画面を更新する。
(6)ユーザが次の曲、前の曲を操作すると、またはある曲の再生が完了すると、対応する曲を現在の再生曲に設定し、3-5のステップを繰り返す。
(7)ネットワークの状況が良くないため、プレーヤーが自動的に再生を停止する場合、再生画面を更新しなければならない。
(8)ネットワークの状況が良くないため、プレーヤーが再生状態に入らない場合は、処理するべきです。
後記
本論文では、基本的な機能を実現するという観点からAVPlayerがネットワーク音楽を再生することを紹介しました。実際にAVPlayerの機能はこれだけではなく、興味のある学生はAVFoundationを深く勉強することができます。
はい、以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてほしいです。もし疑問があれば、メッセージを残して交流してください。ありがとうございます。