2010-07-07 12 views
9

好吧,我試圖讓用戶選擇從他們的iPod庫中的歌曲來聽,但我還是想在我的應用程序接收遠程控制的通知(耳機,鎖屏OSD等),所以我可以做一些額外的的東西。到目前爲止,我可以播放iPod音樂或耳機事件,但不能同時播放。如何從iPod應用程序播放音樂,同時仍然在應用程序中接收遠程控制事件?

這是我知道的那麼遠,

  1. 如果使用MPMusicPlayer,就可以輕鬆擁有對整個音樂庫進行編程訪問。但是,無論您使用applicationMusicPlayer還是ipodMusicPlayer,它都不會收到遠程通知。

  2. 如果您使用AVAudioPlayer(蘋果推薦的播放器爲您的應用中的大多數聲音),您可以輕鬆獲得遠程通知,但它本身無法訪問iPod庫。

  3. AVAudioPlayer可以使用資產URL進行初始化,並且iPod庫(MPMediaItem類型)中的曲目確實有一個URL屬性,該URL屬性返回一個NSURL實例,該文檔顯示其明確用於AVAsset對象,但是當您嘗試用該NSURL初始化AVAudioPlayer,它失敗。 (我以前在iPod中的「正在播放」跟蹤這是一個MP3,它沒有返回一個有效的NSURL對象,但初始化失敗。更糟糕的是,當它是一個Audible.com文件時,NSURL產權單位出返回nil)。

  4. 如果您嘗試使用AVAudioPlayer的實例來獲取遠程事件(例如,使用空白聲音文件),則同時使用MPMusicPlayer類播放iPod音樂,您可以通過遙控器訪問,直到您真正開始播放iPod這是自從您的音頻會話取消激活並且系統音頻會話變爲活動狀態之後您丟失的時間。

  5. 如果您嘗試與#4相同,但您將音頻會話的類別設置爲可混合變體,則您的會話不會停用,但是一旦iPod開始播放,您仍然失去遙控功能。

總之,只要MPMusicPlayer正在播放時,我似乎無法獲得遠程的事件,我不知道任何其他方式來播放從其他iPod的圖書館含量比使用MPMusicPlayer。

任何關於如何解決這個建議將受到歡迎。創意或平面瘋狂。不要在意,只要它有效。

有人嗎?任何人? Bueller? Bueller?

M

回答

16

哈!解決了!我知道這是可能的! (感謝Async-games.com支持!)

下面介紹如何在您的應用程序播放iPod中的音樂,背景的支持,並與您的應用程序接收遙控器的通知。

你必須使用AVPlayer(但不是AVAudioPlayer。不知道這是爲什麼!)使用從庫拾取器(或MPMusicPlayerController中的當前項或其他地方)獲得的MPMediaItem的資產URL進行初始化,然後將音頻會話的類別設置爲可播放(請勿啓用混音覆蓋或您將失去遠程事件! )並將相應的按鍵添加到您的info.plist文件中,告訴操作系統您的應用程序想要支持背景音頻。

完成並完成!

這使您可以在後臺播放iPod庫中的項目(出於某種原因Audible.com文件除外!),並仍然可以獲取遠程事件。因爲這是你的音頻播放器,它與iPod應用程序分離並且會中斷iPod,因此你必須做更多的工作,但那些是休息時間!

該死的,但我只是希望它與Audible.com文件一起工作。 (對於那些感興趣的,它沒有的原因是一個可聽文件的資產URL返回零。臭!但是你可以做什麼!)

+0

Marquel,任何想法爲什麼Audible.com文件都以這種方式被破壞? – Genericrich 2011-05-24 14:54:05

+0

我的猜測是它們沒有被破壞,而是Audible這樣做,所以你不能寫一個'Audible book ripping'應用程序,但這純粹是一種猜測。我從來沒有找到官方的理由。太臭了,因爲它殺了我的產品。讓我知道你是否曾經找到答案。 (另外,如果你喜歡,可以投這個問題。) – MarqueIV 2011-05-25 04:59:08

+2

哇。感謝這個令人難以置信的詳細解釋寫得相當好。並組織得很漂亮。我在隨便的音樂遊戲中播放用戶的音頻文件,以響應他們的提示選擇。我也使用'[MPMusicPlayerController iPodMusicPlayer]'播放音頻文件,但意識到這是多麼俗氣。我試圖找出如何爲'applicationMusicPlayer'啓用背景,但無法弄清楚。這提供了我需要的答案的100%。你在晚上救了我。非常感謝你的難以置信的答案。你得到很多upvotes :) – 2011-08-19 04:16:19

0

有沒有辦法解決這個問題。如果用戶的iPod應用正在播放iPod選擇,則所有遠程事件都將轉到iPod,而不是您的應用。

+0

我知道這一點。同樣,這不是問題。應用程序播放的唯一時間是當您使用MPMusicPlayer與ipodMusicPlayer。 applicationMusicPlayer是您應用程序中的一個實例。但即使是這樣,這仍然不能解釋爲什麼當你使用AVAudioPlayer時,它肯定與應用程序無關,你不能使用MPMediaItem中的資源URL,因爲MPMediaItem是docs明確聲明的目的。 同樣,我試圖讓用戶從庫中播放文件。它不必與iPod應用程序一起使用。 – MarqueIV 2010-07-07 21:44:54

+0

似乎這是可能的!看看這個...... http://www.engadget。com/2010/07/08/ios-4-adds-direct-access-to-itunes-library-iphone-dj-apps-about/ – MarqueIV 2010-07-09 00:22:54

0

一個想到我注意到關於MPMediaItemPropertyAssetURL的是,雖然返回的對象是NSURL但absoluteString是這樣的:

的iPod庫://item/item.mp3 ID = 580807975475997900

這是不是AVAudioPlayer想要的東西。 AVAudioPlayer需要的是從具有有效文件路徑的文件創建的NSURL對象。

而我不知道如何從MPMediaItem獲取文件路徑。所以我想可能AVPlayer是如果你不想使用MPMusicPlayer來播放iPod音軌的話。

+0

是的,但正如我所說的,不能用它來播放Audible文件,這會破壞我們整個項目。 – MarqueIV 2010-11-16 04:44:13

2

這對於OP來說可能不會有任何用處,但是對於通過谷歌搜索找到這個頁面的人來說,無論如何我都會發布它。

另一種(但比較難看)的方法,如果你只在音樂遙控器的事件感興趣,還是希望能夠發揮audible.com文件...

只要繼續使用MPMusicPlayer和跟蹤其通知(現在播放和狀態已更改)。要繼續在後臺接收這些通知,您可以執行各個地方描述的「後臺線程魔術」,以防止您的應用被暫停。您不會直接接收遙控器(因爲iPod播放器正在接收它們),但通過跟蹤「正在播放」中的更改,您可以推斷出ControlPreviousTrack和ControlNextTrack事件,並且通過跟蹤playbackState,您可以推斷出TogglePlayPause命令。 (但是,公平地說,如果iOS編程正確,後臺線程無所事事應該幾乎不消耗電池)。

另一種選擇:使用MPMoviePlayer?我已經檢查過它在後臺工作正常,並且應該接收遠程控制事件。它可以本地播放MPMediaItem,所以希望Audible.com文件也是如此...

相關問題