使用 AVAudioplayer 进行流式传输
Posted
技术标签:
【中文标题】使用 AVAudioplayer 进行流式传输【英文标题】:Streaming with an AVAudioplayer 【发布时间】:2011-03-15 13:47:55 【问题描述】:为了加载声音文件,我的应用程序中有以下代码:
- (id) init:(NSString*)a_filename ext:(NSString*)a_ext
...
NSString *t_soundFilePath = [CFileLoader getPathForResource:filename WithExtension:ext];
NSURL *t_fileURL = [[[NSURL alloc] initFileURLWithPath: t_soundFilePath] autorelease];
player = [[AVAudioPlayer alloc] initWithContentsOfURL: t_fileURL error: nil];
[player prepareToPlay];
...
我加载的所有声音都在我的包中,所以我想知道方法“initwithcontentsofurl”是流式传输声音文件还是缓存所有文件。
我的应用中有很多精灵,所以我想尽量减少用于声音的内存空间。
感谢您的帮助
【问题讨论】:
【参考方案1】:我使用AVPlayer(不是 AVAudioPlayer)流式传输背景音频。
【讨论】:
【参考方案2】:使用 AVAudioPlayer 播放的声音从存储中实时流式传输。缺点是您偶尔会在启动时注意到一个小的延迟。如果您使用 OpenAL,声音会完全加载到内存中。
ObjectAL 文档中对这类事情进行了很好的讨论 - 一个旨在简化 iPhone 上播放声音和效果的库。
【讨论】:
太棒了!谢谢。我已经在 OpenAL 中实现了一个声音流媒体。不幸的是,自 ios 4.3 以来出现了错误,我必须更改 API。 ios 4.3 上的 OpenAL 错误在此处详细介绍:devforums.apple.com/message/396043#396043【参考方案3】:如果你想在你的应用中串流音频,你可以使用下面的播放器而不是使用 AVAudioPlayer
https://github.com/mattgallagher/AudioStreamer
对于这个播放器,您不需要将声音文件放在您的捆绑包中,您可以将它们放在服务器上并使用 url 流式传输音频。
希望对你有帮助。
【讨论】:
【参考方案4】:" AVAudioPlayer 类不支持流式音频 基于 HTTP URL 的。与 initWithContentsOfURL: 一起使用的 URL 必须是 文件 URL (file://)。即本地路径”。
https://developer.apple.com/library/ios/qa/qa1634/_index.html
但是您可以解决 - 例如异步写入本地文件,并使用此文件 URL 初始化 AVAudioPlayer,它会起作用。
【讨论】:
你可以做 NSData *data = [NSData dataWithContentsOfURL:soundUrl]; AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error:nil];基本上它将数据流式传输到内存中,而 AVAudioPlayer 将从内存中的数据播放 @GiaDang 是的,但是您的线程将挂起,直到通过 dataWithContentsOfURL: 方法完全下载音频文件,而不是在一两秒内播放并在播放时缓冲继续,就像 AVPlayer 一样。因此,这不仅需要很长时间,而且如果您不将此代码放在后台线程上,应用程序将在歌曲下载完成之前完全冻结。总而言之,我认为这不是最好的解决方案。以上是关于使用 AVAudioplayer 进行流式传输的主要内容,如果未能解决你的问题,请参考以下文章
AV音频播放器。音频文件的可选重定向。在 _audio 我得到空
AVAudioPlayer 是从磁盘流式传输文件,还是一次将其全部加载到内存中?