`
xujinquan19
  • 浏览: 150710 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iPhone 应用开发:音频播放

阅读更多

 iPhone 应用开发:音频播放

 

 

在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。在我做过的几个应用中,每个都涉及到音效,所以在这里做个简单的归纳,很多都是引用自《iPhone Application Programming Guide》(需要有 Apple ID 才能打开链接),加了一些实际使用的经验。

iPhone OS 主要提供以下了几种播放音频的方法:

System Sound Services
AVAudioPlayer 类
Audio Queue Services
OpenAL

 

 

1. System Sound Services

System Sound Services 是最底层也是最简单的声音播放服务,调用 AudioServicesPlaySystemSound这个方法就可以播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或者警告音,因为它有很多限制:

■ 声音长度要小于 30 秒
■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
■ 打包成 .caf, .aif, 或者 .wav 的文件
■ 不能控制播放的进度
■ 调用方法后立即播放声音
■ 没有循环播放和立体声控制

另外,它还可以调用系统的震动功能,方法也很简单。具体的代码可以参考官方的示例 SysSound
,但是官方的示例只有一些简单的用法,从文档中我们发现可以通过AudioServicesAddSystemSoundCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数我们可以解决不少问题,比如可以克服 System Sound Services 本身不支持循环播放的问题。以下代码可以实现一个在程序中循环播放的背景音乐:

view plaincopy to clipboardprint?
static void completionCallback (SystemSoundID  mySSID) {  
    // Play again after sound play completion  
    AudioServicesPlaySystemSound(mySSID);  
}  
- (void) playSound {  
    // Get the main bundle for the app  
    CFBundleRef mainBundle;  
    SystemSoundID soundFileObject;  
    mainBundle = CFBundleGetMainBundle ();  
      
    // Get the URL to the sound file to play  
    CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (  
                                                         mainBundle,  
                                                         CFSTR ("background"),  
                                                         CFSTR ("wav"),  
                                                         NULL  
                                                         );  
    // Create a system sound object representing the sound file  
    AudioServicesCreateSystemSoundID (  
                                      soundFileURLRef,  
                                      &soundFileObject  
                                      );  
    // Add sound completion callback  
    AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,  
                                           completionCallback,  
                                           (void*) self);  
    // Play the audio  
    AudioServicesPlaySystemSound(soundFileObject);  
      

static void completionCallback (SystemSoundID  mySSID) {
    // Play again after sound play completion
    AudioServicesPlaySystemSound(mySSID);
}
- (void) playSound {
    // Get the main bundle for the app
    CFBundleRef mainBundle;
    SystemSoundID soundFileObject;
    mainBundle = CFBundleGetMainBundle ();
   
    // Get the URL to the sound file to play
    CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (
                                                         mainBundle,
                                                         CFSTR ("background"),
                                                         CFSTR ("wav"),
                                                         NULL
                                                         );
    // Create a system sound object representing the sound file
    AudioServicesCreateSystemSoundID (
                                      soundFileURLRef,
                                      &soundFileObject
                                      );
    // Add sound completion callback
    AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
                                           completionCallback,
                                           (void*) self);
    // Play the audio
    AudioServicesPlaySystemSound(soundFileObject);
   
}

 

 

2. AVAudioPlayer 类

AVAudioPlayer 是 AVFoundation.framework 中定义的一个类,所以使用要先在工程中引入 AVFoundation.framework。我们可以把 AVAudioPlayer 看作是一个高级的播放器,它支持广泛的音频格式,主要是以下这些格式:

■ AAC
■ AMR(AdaptiveMulti-Rate, aformatforspeech)
■ ALAC(AppleLossless)
■ iLBC(internetLowBitrateCodec, anotherformatforspeech)
■ IMA4(IMA/ADPCM)
■ linearPCM(uncompressed)
■ µ-lawanda-law
■ MP3(MPEG-1audiolayer3

AVAudioPlayer 可以播放任意长度的音频文件、支持循环播放、可以同步播放多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等,更高级的功能可以参考 AVAudioPlayer 的文档。要使用 AVAudioPlayer 的对象播放文件,你只需为其指定一个音频文件并设定一个实现了AVAudioPlayerDelegate 协议的 delegate 对象。这里举一个简单的例子,和上一个例子一样,实现一直循环播放的背景音乐:

view plaincopy to clipboardprint?
(void) playBackgroundSoundEffect {  
    NSString *soundFilePath =   
    [[NSBundle mainBundle] pathForResource: @"background"   
                                    ofType: @"wav"];   
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];   
    AVAudioPlayer *newPlayer =   
    [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL  
                                           error: nil];  
    [fileURL release];  
    self.player = newPlayer;   
    [newPlayer release];  
    [self.player prepareToPlay];  
      
    [self.player setDelegate: self];  
    self.player.numberOfLoops = -1;    // Loop playback until invoke stop method  
    [self.player play];  

(void) playBackgroundSoundEffect {
    NSString *soundFilePath =
    [[NSBundle mainBundle] pathForResource: @"background"
                                    ofType: @"wav"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
    AVAudioPlayer *newPlayer =
    [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                           error: nil];
    [fileURL release];
    self.player = newPlayer;
    [newPlayer release];
    [self.player prepareToPlay];
   
    [self.player setDelegate: self];
    self.player.numberOfLoops = -1;    // Loop playback until invoke stop method
    [self.player play];
}

可以看到,只要将 AVAudioPlayer 的 numberOfLoops 属性设为负数,音频文件就会一直循环播放直到调用 stop 方法。

AVAudioPlayer 同样支持 Callback,这是 AVAudioPlayerDelegate 的一个可选 delegate 方法:

view plaincopy to clipboardprint?
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {   
    if (player == self.player && flag == YES) {   
        NSLog(@"Playback finish.");  
    }   

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
    if (player == self.player && flag == YES) {
        NSLog(@"Playback finish.");
    }
}

另外,你可以随时控制 AVAudioPlayer 对象的播放、暂停以及停止,通过判断对象的状态,分别调用play、pause 和 stop 方法即可:

view plaincopy to clipboardprint?
- (IBAction) playOrPause: (id) sender {   
    // if playing, pause   
    if (self.player.playing) {   
        [self.player pause];   
    // if stopped or paused, start playing   
    } else {   
        [self.player play];   
    } 
- (IBAction) playOrPause: (id) sender {
    // if playing, pause
    if (self.player.playing) {
        [self.player pause];
    // if stopped or paused, start playing
    } else {
        [self.player play];
    }


虽然 AVAudioPlayer 可以播放很多格式,但是我们在实际开发过程中还是最好使用一些没有压缩的格式,比如 WAVE 文件,这样可以减少系统处理单元的资源占用,以便更好的完成程序的其他功能。另外,在使用 AVAudioPlayer 连续播放 mp3 这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。

 

 

3. Audio Queue Services

如果以上两种音频播放的解决方案都无法满足你的需求,那么我想你肯定需要使用 Audio Queue Services。使用 Audio Queue Services 对音频进行播放,你可以完全实现对声音的控制。例如,你可以在声音数据从文件读到内存缓冲区后对声音进行一定处理再进行播放,从而实现对音频的快速/慢速播放的功能。

因为 Audio Queue Services 相对复杂很多,Apple 官方已经把它整理为一本书了,具体可以参考 Audio Queue Services Programming Guide 和 SpeakHere 的程序示例。

 

 

4. OpenAL

OpenAL 是一套跨平台的开源的音频处理接口,与图形处理的 OpenGL 类似,它为音频播放提供了一套更加优化的方案。它最适合开发游戏的音效,用法也与其他平台下相同。

iPhone 支持 OpenAL 1.1,我没有在实际开发中使用过,具体的文档可以参考 OpenAL 的网站http://openal.org 和 oalTouch 的程序示例。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/favormm/archive/2010/01/19/5212221.aspx#

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xujinquan19/archive/2010/12/07/6060814.aspx

分享到:
评论

相关推荐

    iPhone简易音频播放程序

    在iOS平台上开发一款iPhone简易音频播放程序,涉及到的知识点涵盖了Objective-C编程语言、Apple的UIKit框架、AVFoundation框架以及多媒体处理。以下是对这些关键领域的详细解释: 1. **Objective-C编程语言**:作为...

    iPhone开发秘籍:第2版(The iPhone Developer's Cookbook)

    - **音频与视频处理**:利用AVFoundation框架处理音频和视频文件,包括播放、录制和编辑功能。 - **图像处理**:使用Core Image框架进行图像滤镜效果的添加,以及如何使用Core Graphics进行更精细的图像绘制操作。 -...

    ios源码Last.fm的官方iPhone应用程序:支持500多万首音乐.zip

    【描述】:“ios源码Last.fm的官方iPhone应用程序:支持500多万首音乐.zip”描述了这个压缩包的内容,即Last.fm的iOS应用源代码,它能够接入并播放海量音乐。这表明源代码包含了处理音乐搜索、播放、推荐、用户个性...

    苹果官方iPhone应用高级开发课程(16集)

    资源名称:苹果官方iPhone应用高级开发课程(16集)资源...高效iPhone应用开发 2【】[iPhone应用开发高级课程]04.iPhone音频开发【】[iPhone应用开发高级课 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    iPhone/iPad 开发:录音及声音播放

    在iOS平台上,开发针对iPhone和iPad的应用时,录音和声音播放是常见的功能需求。这篇文章将深入探讨如何在iOS应用中实现这些功能,主要基于Apple的AVFoundation框架。AVFoundation是苹果提供的一套强大的多媒体处理...

    iPhone应用开发指南 英文高清带书签完全版

    ### iPhone应用开发指南知识点概述 本指南主要针对的是希望为iPhone平台开发应用程序的开发者们,提供了详尽的技术指导与规范。下面将从几个关键部分来深入解析这份文档中所涵盖的重要知识点。 #### 一、版权与...

    iPhone游戏开发入门经典:也适用于iPad源码

    AVFoundation框架提供了音频播放和处理的功能,开发者需要了解如何导入、播放和控制游戏中的音效。 在iOS应用的生命周期管理和内存管理方面,本书也会进行讲解。例如,如何在用户离开游戏时正确保存进度,以及如何...

    iPhone应用开发从入门到精通

    《iPhone应用开发从入门到精通》是一本针对初学者与进阶者的全面指南,旨在帮助读者逐步掌握iOS应用开发的核心技能。这本书深入浅出,采用循序渐进的方式讲解了从基础概念到高级实践的全过程。 在iOS开发领域,...

    iPhone与iPad开发实战:iOS经典应用剖析pdf(附源码)

    《iPhone与iPad开发实战:iOS经典应用剖析》是一本深入探讨iOS应用开发的专业书籍,针对苹果公司的iPhone和iPad设备,提供了丰富的实践经验和详尽的技术解析。这本书不仅涵盖了基础的iOS编程概念,还深入剖析了多个...

    Iphone应用程序开发之播放器

    在iOS平台上,开发一款iPhone应用程序,尤其是涉及到媒体播放功能,是一项技术含量较高的任务。本教程主要聚焦于"Iphone应用程序开发之播放器",这将带领我们深入探讨如何为iPhone构建一个功能完备、用户友好的...

    iPhone应用程序编程指南(中文版)

    - **开发环境要求**:开发iPhone应用程序需要在运行MacOS X v10.5或更高版本的Intel Mac电脑上进行,并且需要下载和安装iPhone SDK。 - **开发工具**:Xcode是主要的开发工具,用于编写代码、调试和打包应用程序;...

    iPhone Game Development: Developing 2D & 3D games in Objective-C

    即使你已经具备一些iPhone应用开发经验,游戏开发也要求开发者掌握全新的技能。作者通过详细的例子和清晰的解释,引导读者了解如何为iPhone和iPod Touch解决特定的技术设计问题,并提出优化不同类型游戏性能的方法。...

    iphone/ipad开发:编写声控红旗飘飘

    1. **Objective-C或Swift编程**:iPhone和iPad应用主要使用Objective-C或Swift语言进行开发。Objective-C是早期的苹果开发语言,而Swift是近年来推出的更现代、更安全的语言,具有更高的开发效率。根据项目的具体...

    iOS软件开发 iOS软件外包 iPhone开发 iPad开发 html5开发 android开发

    移动办公应用开发专指为移动设备开发的办公自动化软件,这些应用通常包括日历管理、任务和项目跟踪、邮件收发、文档编辑等功能,以支持企业的移动办公需求。 根据上述知识点,上海诸君信息科技有限公司能够为不同...

    小程序ios音频播放没声音问题的解决

    在开发微信小程序时,实现音频播放功能是一个基础且常见的需求。特别是针对iOS平台,开发者可能遇到...开发者应该意识到,在音频播放等关键功能上,细致的测试和对API深入的理解是解决问题和优化应用不可或缺的一部分。

    iphone应用开发毕业论文模型.doc

    本文主要探讨的是基于苹果iOS平台的iPhone应用开发,特别是在毕业设计论文的背景下。iOS是由苹果公司为iPhone、iPod touch、iPad以及Apple TV等设备开发的操作系统,它源自于Darwin,属于类Unix的商业操作系统。自...

    iphone开发 mp3下载播放

    在iOS平台上进行iPhone应用开发时,处理音频文件,特别是MP3格式的下载和播放是常见的需求。MP3是一种广泛使用的音频编码格式,以其高效的压缩比和高质量的音质深受喜爱。本节将深入探讨如何在iPhone应用中实现MP3...

Global site tag (gtag.js) - Google Analytics