使用 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 是从磁盘流式传输文件,还是一次将其全部加载到内存中?

我可以在 iOS 上使用 AV Foundation Framework 流式传输 .mp3 链接吗?

从网络服务器流式传输音频

在 Mac 上流式传输音频

将 AirPlay 添加到 AVAudioPlayer (Swift)