2011-07-28 36 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。有任何想法吗? –