2013-05-15 116 views
0

我正在使用AVAudioPlayerNSFileHandle進行音頻流式傳輸。基本思想是我將流式音頻數據保存到帶有文件系統的設備上,然後使用AVAudioPlayer回放剛剛保存的文件。即使正在進行流式傳輸,AVAudioPlayer仍然可以播放該文件。AVAudioPlayer不會在後臺開始播放

我有一個UIButton開始流式傳輸/下載。當下載的數據累積到特定數量的字節時,將自動播放AVAudioPlayer(觸發「播放」方法AVAudioPlayer)。我的問題是:我點擊按鈕開始流式傳輸/下載,然後很快按下iPhone的主頁按鈕,使我的應用程序轉到後臺。下載繼續在後臺工作,但AVAudioPlayer的「播放」方法返回「NO」,這意味着「播放」方法不播放音頻。

我加入AVAudioSession相關的代碼,以我的音頻播放器的init方法:

- (id) initWithURL:(NSString *) downloadedMusicURL 
{ 
    if ((self = [super init])) 
    {  
     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

     CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)downloadedMusicURL, kCFURLPOSIXPathStyle, FALSE); 

     audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:CFBridgingRelease(url) error:nil]; 

     AVAudioSession *session = [AVAudioSession sharedInstance]; 
     [session setActive:YES error:nil]; 
     [session setCategory:AVAudioSessionCategoryPlayback error:nil]; 
    } 

    return self; 
} 

另外在info.plist中我增加了一個項目「應用程序播放音頻」爲重點「所需的背景模式」。然而,「戲劇」在後臺仍然沒有被正確調用。我還錯過了什麼?提前致謝。

回答

0

- (void)applicationDidEnterBackground:(UIApplication *)application

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask = 0; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
[app endBackgroundTask:bgTask]; 
}]; 
AudioSessionSetActive(false); 

使用此代碼和- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

AudioSessionInitialize (NULL,NULL,NULL,NULL); 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,sizeof (sessionCategory),&sessionCategory); 
AudioSessionSetActive(true); 

希望這可以幫助使用此代碼。

+0

這是,如果你想完成一個漫長的任務,將只允許最多10分鐘。額外的時間後,您可以完成您的任務。 – rckoenes

+0

根據我的項目我有很長的任務,所以我用這個 – iEinstein

+0

我沒有添加上面的代碼,但它仍然無法正常工作。馬特上面的評論是有道理的。 – stspb

2

您的應用無法在後臺開始播放音頻。這是有道理的。想想如果用戶沒有使用的應用可能突然開始發出聲音,該設備會是什麼樣子!請記住,對於用戶來說,將應用程序發送到後臺是退出該應用程序的天真等價物。你的應用程序不能像殭屍似的從死裏復活,並開始製造噪音!

背景音頻設置允許您的應用程序,而被在前臺生成音頻繼續這樣做時,它然後進入後臺。然後它可以繼續負責音頻(如果它接收到遠程事件),直到其他應用程序發出聲音;之後,你的應用程序再次退出運行,直到它被帶到前臺併產生聲音。

所以你需要開始播放一些聲音之前你的應用程序進入後臺,如果你想這個工作。

+0

有道理,並感謝您的評論,馬特。 – stspb

+0

嗨!馬特我認爲這是有道理的,但我們不能只在背景中產生音頻? – iEinstein

+0

這不可能是真的。音樂應用程序(Spotify,Pandora)可以後臺播放,即使在應用程序停止播放後播放的歌曲結束後,也可以繼續播放歌曲。 – jmstone617

0

面對這個問題。讓我建議您使用AVAudioSessionCategoryOptionMixWithOthers與-setCategory:withOptions:error :.此外,在設置類別之後激活會話可能是有意義的,而不是之前。

1
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid; 
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 

/* 而 在Info.plist文件 所需的背景模式:應用程序播放音頻 */