9

わかりました、ユーザーが iPod ライブラリから曲を選択して聴けるようにしようとしていますが、アプリでリモコン通知 (ヘッドフォン、ロック画面の OSD など) を受け取りたいので、追加の操作を行うことができます。これまでのところ、iPod の音楽を再生するか、ヘッドフォンのイベントを取得できますが、両方を同時に取得することはできません。

これが私がこれまでに知っていることです...

  1. MPMusicPlayer を使用すると、音楽ライブラリ全体にプログラムで簡単にアクセスできます。ただし、アプリケーションではなく、applicationMusicPlayer を使用するか ipodMusicPlayer を使用するかに関係なく、リモート通知を受け取ります。

  2. AVAudioPlayer (アプリのほとんどのサウンドに Apple が推奨するプレーヤー) を使用すると、リモート通知を簡単に取得できますが、iPod ライブラリにネイティブにアクセスすることはできません。

  3. AVAudioPlayer はアセット URL で初期化でき、iPod ライブラリ (MPMediaItem 型) のトラックには NSURL インスタンスを返す URL プロパティがあります。これは、ドキュメントでは AVAsset オブジェクトで使用することを明示的に示していますが、それを使用して AVAudioPlayer を初期化しようとすると、 NSURL、失敗します。(MP3 である iPod で「現在再生中」のトラックを使用し、有効な NSURL オブジェクトを返しましたが、初期化に失敗しました。さらに悪いことに、それが Audible.com ファイルの場合、NSURL プロパティのフラットアウトは nil を返しました。)

  4. AVAudioPlayer のインスタンスを使用してリモート イベントを取得し (たとえば、空のサウンド ファイルを使用)、同時に MPMusicPlayer クラスを使用して iPod の音楽を再生しようとすると、実際に iPod の再生を開始するまでリモート コントロール アクセスが可能であり、その時点で失われます。オーディオ セッションが非アクティブになり、システム オーディオ セッションがアクティブになるためです。

  5. #4 と同じことを試して、代わりにオーディオ セッションのカテゴリをミックス可能なバリアントに設定すると、セッションは非アクティブになりませんが、iPod が再生を開始すると、リモート コントロール機能は失われます。

要するに、MPMusicPlayer が再生されているときはいつでもリモート イベントを取得できないようで、MPMusicPlayer を使用する以外に iPod のライブラリからコンテンツを再生する方法を知りません。

これを回避する方法についての提案は大歓迎ですクリエイティブまたはフラットアウトクレイジー。それが機能する限り、気にしないでください。

誰?誰?ビューラー?ビューラー?

M

4

4 に答える 4

16

はっ!解決しました!私はそれが可能であることを知っていました!( Async-games.com のサポートに感謝します!)

アプリで iPod の音楽を再生し、バックグラウンドでサポートし、アプリがリモコン通知を受信する方法を次に示します。

ライブラリ ピッカー (または MPMusicPlayerController またはその他の場所の現在のアイテム) から取得した MPMediaItem のアセット URL で初期化された AVPlayer (ただし、AVAudioPlayer ではありません。その理由はわかりません!) を使用する必要があります。次に、オーディオ セッションのカテゴリを Playable に設定します。 (ミキシング オーバーライドを有効にしないでください。そうしないと、リモート イベントが失われます!)、適切なキーを info.plist ファイルに追加して、アプリがバックグラウンド オーディオをサポートする必要があることを OS に伝えます。

やった!

これにより、バックグラウンドで iPod ライブラリ (何らかの理由で Audible.com ファイルを除く) からアイテムを再生し、リモート イベントを取得できます。確かに、これは iPod アプリとは別のオーディオ プレーヤーであり、iPod アプリを中断するため、さらに多くの作業を行う必要がありますが、それは休憩です!

くそー、でも... Audible.comファイルで動作することを望みました。(興味のある方は、可聴ファイルのアセット URL が nil を返さないことが理由です。悪臭を放ちます!しかし、どうすればよいでしょうか!)

于 2010-07-09T06:44:24.037 に答える
2

これはおそらくOPにはもう役に立たないでしょうが、グーグルでこのページを見つけた人のためかもしれないので、とにかく投稿します.

音楽のリモコンイベントだけに興味があり、audible.comファイルを再生できるようにしたい場合の代替の(しかしかなり醜い)アプローチ...

MPMusicPlayer を使い続けて、その通知を追跡するだけです (再生中と状態の変化)。これらの通知をバックグラウンドで受信し続けるには、さまざまな場所で説明されている「バックグラウンド スレッド マジック」を実行して、アプリが中断されないようにすることができます。リモコンを直接受け取ることはありませんが (iPod プレーヤーが受け取っているため)、「現在再生中」の変化を追跡することで、ControlPreviousTrack イベントと ControlNextTrack イベントを推測できます。また、playbackState を追跡することで、TogglePlayPause を推測できます。指図。

欠点は、アプリが正当な理由もなく常に実行されていることです (ただし、iOS が正しくプログラムされている場合、何もしないバックグラウンド スレッドはほとんどバッテリーを消費しないはずです)。

別の方法: MPMoviePlayer を使用しますか? バックグラウンドで正常に動作し、リモート コントロール イベントも受信する必要があることを確認しました。MPMediaItem をネイティブに再生できるので、うまくいけば Audible.com ファイルも再生できます...

于 2012-01-18T11:41:39.377 に答える
0

MPMediaItemPropertyAssetURL について気づいたことの 1 つは、返されるオブジェクトは NSURL にありますが、absoluteString は次のようなものであるということです。

ipod-library://item/item.mp3?id=580807975475997900

これは AVAudioPlayer が望んでいるものではありません。AVAudioPlayer が必要とするのは、有効なファイル パスを持つファイルから作成された NSURL オブジェクトです。

MPMediaItem からファイル パスを取得する方法がわかりません。したがって、MPMusicPlayer を使用せずに iPod のトラックを再生したい場合は、AVPlayer が適していると思います。

于 2010-11-15T12:00:32.930 に答える
0

これを回避する方法はありません。ユーザーの iPod アプリが iPod セレクションを再生している場合、すべてのリモート イベントはアプリではなく iPod に送信されます。

于 2010-07-07T03:46:57.190 に答える