从URI获取音频流并在iPhone上播放

12

我希望能够从 URL 获取音频流并在 iPhone 上播放。不幸的是,只有一个 C# 的例子可以播放该流,但我需要在 Objective C 和 iPhone 框架中实现它。我已经尝试使用不同的音频框架,但都没有成功。以下是 C# 代码:

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

我应该在Objective-C中怎么做才能从那个URL获取流媒体音频?在这个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];

两种方法都没有奏效。我已经测试了我的 URL,在浏览器中可以正常工作。

这是最终奏效的代码:

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];
4个回答

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];

54
但它首先将所有数据下载到NSData对象中。它不是流式传输。 - Tushar Jain
3
它不支持音频流,请分享一些音频流链接。 - AsifHabib
它不能在线播放,仍需下载。如果你的MP3文件很大,那么这段代码将让你等待一辈子。 - vichhai
@MonikaPatel 是的,我做了。 - AsifHabib
@AsifHabib 如果您不介意的话,能否与我分享您的演示文稿? - Monika Patel
使用了开源库!类似这样的库有很多可用,比如 https://github.com/mattgallagher/AudioStreamer。 - AsifHabib

14

嘿,我在制作一款无线电应用程序时遇到了音频流的问题。我已经搜索了答案但它们都不起作用。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中的内容,而是边接收边播放流。


你确定吗?你在哪里读到这个信息的?我认为AVPlayer会下载完整的数据包,然后再播放音频。 - Sergey Stadnik
@Sergey Stadnik 这取决于URL是否为流媒体URL。如果您使用NSData来处理流媒体URL,则它会不断填充数据缓冲区,直到流结束。这对于类似广播的播放并不理想。如果您想要流媒体URL的广播样式播放,AVPlayer可以给我们所需的效果。 - Rohan Bhale
我尝试使用AVPlayer和URL从Dropbox播放音乐,每次都需要等待4-5秒钟才能开始...不知道为什么。音频轨道大小为4 MB。有什么想法吗? - Sergey Stadnik
据我所知,Dropbox 下载不是流式传输,因此在您的情况下 AVPlayer 将下载并播放。@Sergey Stadnik - Rohan Bhale
也许吧,但我见过很多应用程序,在点击后立即从数据库播放音频。他们是如何做到的? - Sergey Stadnik
@SergeyStadnik 我需要看一下这个。如果我找到有用的东西,我会回复你的。 - Rohan Bhale

8

请查看AVFoundation框架的AVPlayer类,这是iOS中用于流媒体音频的Objective-C类。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接