首先,爲了避免在這裏發佈大量的代碼,我創建了一個非常基本的例子 - 我的 - https://github.com/opheliadesign/AudioTest。使用NSURLSession播放遠程音頻,代碼批評
我是iOS開發的新手,我在理解在遠程服務器上加載和播放靜態MP3文件的最佳方式時遇到了一些麻煩。音頻是而不是流媒體直播,不到一兆字節 - 平均約30秒(他們是無線電發送)。
有人建議我使用NSURLSession加載MP3文件,然後在完成塊中播放它。這似乎是工作,但我有一種感覺,我可以更好地處理它,只是不知道如何。這裏是我搶的音頻和開始播放塊:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
NSLog(@"View loaded");
// Register to receive notification from AppDelegate when entering background
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopPlayingAudio) name:@"stopPlayingAudio" object:nil];
// Assign timer to update progress
self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSeekBar) userInfo:nil repeats:YES];
// Demo recording URL
NSString *recordingUrl = @"https://s3.amazonaws.com/tevfd-recording/All_Fire_and_EMS_2015-02-0214_48_33_630819.mp3";
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:recordingUrl] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
NSLog(@"No error..");
self.player = [[AVAudioPlayer alloc]initWithData:data error:nil];
// Setup slider for track position
self.slider.minimumValue = 0;
self.slider.maximumValue = self.player.duration;
[self.player prepareToPlay];
[self.player play];
}
}]resume];
}
例如,有一個滑塊,當它被移動,更新玩家的位置。我在完成塊中初始化AVAudioPlayer,但在頭文件中爲它創建一個屬性。如果玩家尚未初始化,是否可以移動滑塊導致崩潰?如果是這樣,我應該如何處理這個更好?
此外,我有一個計時器,更新AVAudioPlayer播放時的滑塊位置。當軌道到達終點時,計時器繼續 - 顯然這是潛在的記憶問題。不知道處理這種情況的最佳方式,我還希望用戶能夠在完成後再次開始播放錄製內容,例如,如果他們將滑塊移到右側。
我已搜索和搜索,似乎無法找到任何與我正在做的具體相關的任何事情。任何幫助將不勝感激。
UPDATE 這是我第一次開始使用,但我經歷點擊一個UITableView細胞以及呈現加載視圖之間有些滯後/播放的音頻。幾個建議NSURLSession。
- (void)viewDidLoad {
[super viewDidLoad];
// Get the URL
NSURL *callAudioURL = [NSURL URLWithString:[self.call objectForKey:@"url"]];
NSData *callAudioData = [NSData dataWithContentsOfURL:callAudioURL];
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithData: callAudioData error:nil];
self.player = audio;
self.slider.minimumValue = 0;
self.slider.maximumValue = self.player.duration;
[[self player] play];
self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSeekBar) userInfo:nil repeats:YES];
}
這是不可能的初始化'AVAudioPlayer'遠程URL直接?這似乎是最簡單的方法,除了下載和緩存它,然後從磁盤播放它。 – SevenBits 2015-02-07 18:14:36
這就是我最初嘗試的方法,它確實是最簡單的方法,但是它會在點擊我的UITableViewCell和呈現播放器視圖之間造成一點點滯後。我們正在處理小文件,所以也許這不是什麼大不了的事情..只是試圖做到這一點「正確」的方式 – NightMICU 2015-02-07 18:15:52
@SevenBits請參閱我的最初擺動更新.. – NightMICU 2015-02-07 18:20:37