2011-03-15 73 views
6

流为了加载一个声音文件,我有我的应用程序下面的代码:与AVAudioplayer

- (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”流式传输声音文件,或者如果所有文件都被缓存。

我在我的应用程序中有很多精灵,所以我想尽量减少用于声音的内存空间。

THX对您有所帮助

回答

6

使用AVAudioPlayer播放的声音将从存储器实时流式传输。缺点是,您可能偶尔会注意到由于启动而导致的小滞后。如果您使用OpenAL,声音将全部加载到内存中。

ObjectAL文档 - 这是一个旨在简化在iPhone上播放声音和效果的库中,对此类事件进行了很好的讨论。

+0

太棒了!谢谢。我已经在OpenAL中实现了一个良好的流媒体。不幸的是,自IOS 4.3以来出现了错误,我必须更改API。 – Klem 2011-03-16 09:45:43

+0

关于ios 4.3的OpenAL错误在这里详细说明:https://devforums.apple.com/message/396043#396043 – Klem 2011-03-16 09:47:24

6

如果你要流在你的应用程序的音频,你可以用它代替使用AVAudioPlayer

https://github.com/mattgallagher/AudioStreamer

对于这种球员,你不需要把从玩家声音文件在你的包中,你可以把它们放在服务器上并使用url来传输音频。

希望,这将有助于你。

3

" The AVAudioPlayer class does not provide support for streaming audio based on HTTP URL's. The URL used with initWithContentsOfURL: must be a File URL (file://). That is, a local path".

https://developer.apple.com/library/ios/qa/qa1634/_index.html

但你可以解决 - 例如异步写入到本地文件,和init AVAudioPlayer这个文件的URL,它会工作。

+0

你可以做 NSData * data = [NSData dataWithContentsOfURL:soundUrl]; AVAudioPlayer * player = [[AVAudioPlayer alloc] initWithData:data error:nil]; 基本上它会将数据流到内存中,AVAudioPlayer将播放内存中的数据 – 2014-06-10 10:44:08

+0

@GiaDang是的,但是你的线程会挂起,直到音频文件被dataWithContentsOfURL:方法完全下载为止,而不是在内部播放一秒钟或两秒钟,并在播放时继续缓冲,就像AVPlayer一样。因此,这不仅会花费很长时间,但如果您不将此代码放在后台线程上,应用程序将*完全冻结*直到歌曲下载完成。总而言之,我不认为这是最好的解决方案。 – 2016-05-16 19:21:09