2011-07-28 35 views
11

我想從URL獲取音頻流並在iPhone上播放它。不幸的是,只有C#如何播放該流,但我需要在iPhone框架中實現Objective C。我嘗試過使用不同的音頻框架,但都不成功。這是什麼在C#中:從URI獲取音頻流並在iPhone上播放它

response = httpWebRequest.GetResponse(); 
      using (Stream stream = response.GetResponseStream()) 
      { 
       using (SoundPlayer player = new SoundPlayer(stream)) 
       { 
        player.PlaySync(); 
       } 
      } 

我應該做什麼目標C中獲取從該網址流音頻?在該URL中,我沒有mp3文件或其他東西,我只是得到一個流。可能我必須以某種方式將該流下載到iPhone音頻文件,然後播放它以消除滯後。

我嘗試這樣做:

AVPlayer *player = [AVPlayer playerWithURL:url]; 
[player play]; 

這:

AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: url error:nil]; 

    [theAudio setVolume :0.50]; //setting the volume 

    [theAudio play]; 

但是都沒有成功。 我測試了我的網址,它在瀏覽器中運行良好。

這是工作的代碼:

NSData *_objectData = [NSData dataWithContentsOfURL:url]; 
    NSError *error; 

    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:_objectData error:&error]; 
    audioPlayer.numberOfLoops = 0; 
    audioPlayer.volume = 1.0f; 
    [audioPlayer prepareToPlay]; 

    if (audioPlayer == nil) 
     NSLog(@"%@", [error description]); 
    else 
     [audioPlayer play]; 

回答

14
NSString* resourcePath = url; //your url 
NSData *_objectData = [NSData dataWithContentsOfURL:[NSURL URLWithString:resourcePath]]; 
NSError *error; 

app.audioPlayer = [[AVAudioPlayer alloc] initWithData:_objectData error:&error]; 
app.audioPlayer.numberOfLoops = 0; 
app.audioPlayer.volume = 1.0f; 
[app.audioPlayer prepareToPlay]; 

if (app.audioPlayer == nil) 
    NSLog(@"%@", [error description]); 
else 
    [app.audioPlayer play]; 
+53

但它首先將所有數據下載到NSData對象。它不是流媒體。 –

+3

它不會做音頻流,請分享一些鏈接到音頻流 – AsifHabib

+0

它不能在線播放。它仍然下載。如果你的mp3是一個巨大的文件。 RIP這段代碼會給你一生的時間等待。 – vichhai

8

查找到AVPlayer班,AVFoundation框架的一部分......這是Objective-C的(IOS)類使用音頻流。

0
MPMoviePlayerController *player; 
player = [[MPMoviePlayerController alloc] init] ; 
player.view.frame = CGRectMake(0, 0, 0, 0); 
player.movieSourceType = MPMovieSourceTypeStreaming; 
player.view.hidden = YES; 
[self.view addSubview: [wikiMusicPlayer view]]; 

NSString *address = Your URL; 
address = [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

NSURL *url = [NSURL URLWithString:address]; 
[wikiMusicPlayer setContentURL:url]; 
[wikiMusicPlayer prepareToPlay]; 
[wikiMusicPlayer setShouldAutoplay: NO]; 
[wikiMusicPlayer play]; 
+1

什麼是wikiMusicPlayer? – Mohit

13

嘿,我面對的音頻流的這個問題的無線電應用。我尋找答案,他們沒有工作。 AVAudioPlayer不是這裏使用的類。使用NSData對象下載URL的內容不是解決方案,因爲它下載內容,然後代碼進一步執行。它類似於下載mp3,然後在播放器上本地播放。

[NSData dataWithContentsOfURL:[NSURL URLWithString:resourcePath]]; //Downloads the contents of the url and in case of radio the url's content is unlimited. The program gets frozen on executing this. 

改爲使用AVPlayer類。

此代碼工作在我的無線應用

AVPlayer *objAVPlayer = [[AVPlayer alloc] initWithURL:url]; 
[objAVPlayer play]; 

此代碼的URL不下載的內容,但它起到將根據收到的數據流。

+0

你確定嗎?你從哪裏讀到這個消息?我瘦AVPlayer下載完整的數據包,然後播放音頻 –

+0

@Sergey Stadnik它取決於URL是一個流URL。如果你使用NSData作爲流URL,它會一直填充數據緩衝區,直到流完成。這對於無線電風格的播放來說並不理想。如果您想要爲流式網址播放廣播風格,AVPlayer會爲我們帶來理想的效果。 –

+0

我試圖從Bropbox播放音樂,並使用帶有URL的AVPlayer,並且每次我從開始等待4到5秒... IDK爲什麼。音軌大小 - 4 MB。有任何想法嗎? –