![](/img/trans.png)
[英]AVAudioPlayer: MP3 file not playing on device, but works in Simulator (iOS 6)
[英]MP3 playing using AVAudioPlayer not working on device
我在iOS 4.2的3GS iPhone上測試我的應用程序
我使用以下代碼在我的IBAction中播放聲音。 它在模擬器(iPad和iPhone)中完美運行 - 我聽到了聲音。
NSString *pathToMusicFile1 = [[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"mp3"];
NSError *error;
alarmSound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile1] error:&error];
NSLog(@"Song1 Loaded");
if (alarmSound == nil) {
NSLog(@"Error playing sound");
} else {
alarmSound.numberOfLoops = 20;
alarmSound.volume = 1.0;
[alarmSound play];
}
我已經將所有聲明正確(標題和框架等),因為我可以在模擬器中聽到聲音。
我還檢查過我的手機沒有處於靜音模式! 我聽到了通用iphone GUI的其他聲音。 (來自日期選擇器的例子)。
我還清理了所有目標並刪除了應用程序以重新安裝。
有什么想法有什么不對?!
所以,我也有這個問題 - 我很確定它是同一個......
我們已經在應用程序商店中安裝了一年左右的應用程序,最近我們需要更改一些內容,盡管沒有任何功能。
突然,聲音停止工作 - 最新的sdk版本(版本4.0)和設備上的模擬器(再次運行iOS 4)。
總是對我們有用的代碼就是這個......
NSString *sound_file;
if ((sound_file = [[NSBundle mainBundle] pathForResource:@"track1" ofType:@"mp3"])){
NSURL *url = [[NSURL alloc] initFileURLWithPath:sound_file];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
audioPlayer.delegate = self;
[url release];
[audioPlayer prepareToPlay];
[audioPlayer play];
}
最后,我發現你現在需要設置AVAudioSession播放的類型,以便通過揚聲器播放聲音,就像它已經做到的那樣! 將以下代碼行放入app appid applicationDidFinishLaunching事件處理程序中......
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
不要忘記在你的app delegate .h文件中添加include(顯然你還需要導入AVFoundation框架,如果還沒有這樣做的話)...
#import <AVFoundation/AVAudioSession.h>
希望這會讓你的聲音在設備上播放。
不要因為我認為可能是一個單獨的問題而變得明白,那聲音仍然沒有在模擬器中播放。 我見過其他帖子暗示這是事實,但我不確定這是多么普遍。 我發現如果我選擇iPad 3.2作為我的模擬器,它至少可以解決這個問題。 歡樂!
對我來說似乎很瘋狂的是,這肯定會影響到大量的人,但很難找到關於某些應該是一個眾所周知的問題的信息或建議 - 畢竟,我在論壇上看到過很多帖子似乎沒有得到回答。
無論如何,希望這有助於其他人。
將“audioPlayer”變量作為屬性非常重要 。 否則使用ARC,它會在有機會玩之前釋放!
我花了半個小時和一些谷歌搜索這個A-ha時刻。
我的聲音現在完美無缺!
我的問題是iOS在文件有機會播放之前自動釋放我的AVAudioPlayer實例。 奇怪的是,這只發生在MP3而非AU文件中。 解決方法是不將其設置為自動釋放,然后在委托方法中釋放它...
- (void)playSound:(NSString *)sound
{
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:sound ofType:@""]] error:NULL];
audioPlayer.delegate = self;
[audioPlayer play];
}
...然后在委托方法中......
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
[player release];
}
......現在很棒。
你試過[NSURL URLWithString:pathToMusicFile1];
而不是fileURLWithPath:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.