2015-02-07 35 views
0

首先,爲了避免在這裏發佈大量的代碼,我創建了一個非常基本的例子 - 我的 - 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]; 
} 
+0

這是不可能的初始化'AVAudioPlayer'遠程URL直接?這似乎是最簡單的方法,除了下載和緩存它,然後從磁盤播放它。 – SevenBits 2015-02-07 18:14:36

+0

這就是我最初嘗試的方法,它確實是最簡單的方法,但是它會在點擊我的UITableViewCell和呈現播放器視圖之間造成一點點滯後。我們正在處理小文件,所以也許這不是什麼大不了的事情..只是試圖做到這一點「正確」的方式 – NightMICU 2015-02-07 18:15:52

+0

@SevenBits請參閱我的最初擺動更新.. – NightMICU 2015-02-07 18:20:37

回答

0

如果你很在意小的延時,然後下載並緩存它最好的解決方案。您需要下載音頻文件,然後在本地播放。通常,只有在音頻非常獨特且無法在本地存儲的情況下,才能從網絡播放或流式傳輸。

要實現這樣的事情(未測試的代碼):

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
NSFileHandle *hFile = [NSFileHandle fileHandleForWritingAtPath:self.localPath]; 
//did we succeed in opening the existing file? 
if (!hFile) { //nope->create that file! 
    [[NSFileManager defaultManager] createFileAtPath:self.localPath contents:nil attributes:nil]; 
    //try to open it again... 
    hFile = [NSFileHandle fileHandleForWritingAtPath:self.localPath]; 
} 
//did we finally get an accessable file? 
if (!hFile) { 
    NSLog("could not write to file %@", self.localPath); 
    return; 
} 

@try { 
    //seek to the end of the file 
    [hFile seekToEndOfFile]; 
    //finally write our data to it 
    [hFile writeData:data]; 
} @catch (NSException * e) { 
    NSLog("exception when writing to file %@", self.localPath); 
    result = NO; 
} 
    [hFile closeFile]; 
} 

當所有數據接收完畢,開始你的聲音:

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.localPath error:nil]; 
+0

我的應用程序的普通用戶將每天下載這幾個 - 如果可能,我想避免填滿他們的設備。 – NightMICU 2015-02-07 18:27:13

+0

哦,並且很抱歉進一步解釋。在我的簡單例子中,它是一個單一的音頻文件,實際上會有很多。通過點擊一個Table View行來訪問每個行,並且每天添加幾個 – NightMICU 2015-02-07 18:28:32

+0

@NightMICU這顯然取決於你的應用程序,但是你可以有一個輸入/輸出隊列 - 一旦用戶下載了一個音頻文件,被刪除以爲新的空間騰出空間。然後,您可以避免佔用太多空間,同時節省帶寬。 – SevenBits 2015-02-07 18:29:27