iOS 流媒体 MP3 文件
iOS Streaming MP3 File
我是 iOS 的新开发人员,我正在编写一个应用程序来处理来自网站上 mp3 文件的流式音频。
我想在流式传输音频时播放它,并且我希望用户能够浏览音频。
我看到其他帖子使用
NSData *songData=[NSData dataWithContentsOfURL:url];
[[AVAudioPlayer alloc] initWithData:songData error:nil];
但是 dataWithContentsOfURL: 是同步的,会阻塞主线程并且不会流式传输,这不是我想要的。
理想情况下,我正在寻找某种方法,以便在接收到数据字节时可以访问它们,将它们存储在缓冲区中,然后在我得到其余数据
我不确定是否有办法用 AVPlayer 做到这一点,或者我是否需要研究 Core Audio 等。
有人能告诉我正确的方向吗?
这里是苹果提供的接收流和解析流的例子。
AVPlayer
支持蒸。 AVAudioPlayer
没有。
类似于此片段,假设您已经创建了一个名为 songPlayer
:
的 属性
AVPlayer *player = [AVPlayer playerWithURL:url];
self.songPlayer = player;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.songPlayer currentItem]];
[self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
- (void)playerItemDidReachEnd:(NSNotification *)notification {
// code here when song reached the end
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == self.songPlayer && [keyPath isEqualToString:@"status"])
{
if (self.songPlayer.status == AVPlayerStatusFailed) {
NSLog(@"AVPlayer Failed");
} else if (self.songPlayer.status == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayerStatusReadyToPlay");
[self.songPlayer play];
} else if (self.songPlayer.status == AVPlayerItemStatusUnknown) {
NSLog(@"AVPlayer Unknown");
}
}
}
我是 iOS 的新开发人员,我正在编写一个应用程序来处理来自网站上 mp3 文件的流式音频。
我想在流式传输音频时播放它,并且我希望用户能够浏览音频。
我看到其他帖子使用
NSData *songData=[NSData dataWithContentsOfURL:url];
[[AVAudioPlayer alloc] initWithData:songData error:nil];
但是 dataWithContentsOfURL: 是同步的,会阻塞主线程并且不会流式传输,这不是我想要的。
理想情况下,我正在寻找某种方法,以便在接收到数据字节时可以访问它们,将它们存储在缓冲区中,然后在我得到其余数据
我不确定是否有办法用 AVPlayer 做到这一点,或者我是否需要研究 Core Audio 等。
有人能告诉我正确的方向吗?
这里是苹果提供的接收流和解析流的例子。
AVPlayer
支持蒸。 AVAudioPlayer
没有。
类似于此片段,假设您已经创建了一个名为 songPlayer
:
AVPlayer *player = [AVPlayer playerWithURL:url];
self.songPlayer = player;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.songPlayer currentItem]];
[self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
- (void)playerItemDidReachEnd:(NSNotification *)notification {
// code here when song reached the end
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == self.songPlayer && [keyPath isEqualToString:@"status"])
{
if (self.songPlayer.status == AVPlayerStatusFailed) {
NSLog(@"AVPlayer Failed");
} else if (self.songPlayer.status == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayerStatusReadyToPlay");
[self.songPlayer play];
} else if (self.songPlayer.status == AVPlayerItemStatusUnknown) {
NSLog(@"AVPlayer Unknown");
}
}
}