<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
    在 iPhone 應用或者是游戲的開發過程中,對聲音的支持是必不可少的。沒有音效的軟件是殘缺的,用戶體驗也會大打折扣,下面是自己對iPhone音頻的一點總結。
    iPhone OS 音頻分類:
       (1)High level, easy to use
         •System Sound API - short sounds
         •AVAudioPlayer class - ObjC, simple API
        (2)Lower level, takes more effort but much more control
         •Audio Toolbox - recording and playback, streaming, full control
         •Audio Units - processing audio
         •OpenAL
    Sound effects音響效果:
       •Button Clicks
        •Alert Sounds
        •Short Sounds Accompanying User Actions
    iPhone OS 主要提供以下了幾種播放音頻的方法:
       •System Sound Services
         •AVAudioPlayer 類
       •Audio Queue Services
         •OpenAL
        1. System Sound Services
            System Sound Services 是最底層也是最簡單的聲音播放服務,調用 AudioServicesPlaySystemSound 這個方法就可以播放一些簡單的音頻文件,使用此方法只適合播放一些很小的提示或者警告音,因為它有很多限制:
        ■ 聲音長度要小于 5 秒(一說小于30秒)
          ■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
        ■ 打包成 .caf, .aif, 或者 .wav 的文件
        ■ 不能控制播放的進度
        ■ 調用方法后立即播放聲音
        ■ 沒有循環播放和立體聲控制
        另外,它還可以調用系統的震動功能,方法也很簡單。具體的代碼可以參考官方的示例SysSound,但是官方的示例只有一些簡單的用法,從文檔中我們發現 可以通過 AudioServicesAddSystemSoundCompletion 方法為音頻播放添加 CallBack 函數,有了 CallBack 函數我們可以解決不少問題,比如可以克服 System Sound Services 本身不支持循環播放的問題。以下代碼可以實現一個在程序中循環播放的背景音樂:
    1. static void completionCallback (SystemSoundID  mySSID) {
    2.     // 音頻重放
    3.     AudioServicesPlaySystemSound(mySSID);
    4. }
    5. - (void) playSound {
    6.     // 獲得 main bundle
    7.     CFBundleRef mainBundle;
    8.     SystemSoundID soundFileObject;
    9.     mainBundle = CFBundleGetMainBundle ();
    10.     // 獲得聲音文件的URL
    11.     CFURLRef soundFileURLRef  = CFBundleCopyResourceURL (
    12.                                                          mainBundle,
    13.                                                          CFSTR ("background"),
    14.                                                          CFSTR ("wav"),
    15.                                                          NULL
    16.                                                          );
    17.     // 創建 system sound 對象
    18.     AudioServicesCreateSystemSoundID (
    19.                                       soundFileURLRef,
    20.                                       &soundFileObject
    21.                                       );
    22.     // 播放結束回調
    23.     AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
    24.                                            completionCallback,
    25.                                            (void*) self);
    26.     // 播放音頻
    27.     AudioServicesPlaySystemSound(soundFileObject);
    28.    
    29. }
    復制代碼
    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 對象。這里舉一個簡單的例子,和上一個例子一樣,實現一直循環播放的背景音樂:
    1. - (void) playBackgroundSoundEffect {
    2.     NSString *soundFilePath =
    3.     [[NSBundle mainBundle] pathForResource: @"background"
    4.                                     ofType: @"wav"];
    5.     NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
    6.     AVAudioPlayer *newPlayer =
    7.     [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
    8.                                            error: nil];
    9.     [fileURL release];
    10.     self.player = newPlayer;
    11.     [newPlayer release];
    12.     [self.player prepareToPlay];
    13.     [self.player setDelegate: self];
    14.     self.player.numberOfLoops = -1;    // 循環播放音頻,直到調用Stop方法
    15.     [self.player play];
    16. }
    復制代碼
    可 以看到,只要將 AVAudioPlayer 的 numberOfLoops 屬性設為負數,音頻文件就會一直循環播放直到調用 stop 方法。AVAudioPlayer 同樣支持 Callback,這是 AVAudioPlayerDelegate 的一個可選 delegate 方法:
    1. - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
    2.     if (player == self.player && flag == YES) {
    3.         NSLog(@"Playback finish.");
    4.     }
    5. }
    復制代碼
    另外,你可以隨時控制 AVAudioPlayer 對象的播放、暫停以及停止,通過判斷對象的狀態,分別調用 play、pause 和 stop 方法即可:

    1. -(IBAction) playOrPause: (id) sender {
    2.     // 音頻控制邏輯
    3.     if (self.player.playing) {
    4.         [self.player pause];
    5.     } else {
    6.         [self.player play];
    7.     }
    復制代碼
    雖 然 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 的程序示例。
    附件即: oalTouch.rar (1.51 MB) 源代碼
    posted on 2010-10-01 21:47 seal 閱讀(396) 評論(0)  編輯  收藏 所屬分類: iPhone
    主站蜘蛛池模板: 99ee6热久久免费精品6| 一级毛片免费在线| 精品一区二区三区免费毛片爱| 又粗又黄又猛又爽大片免费| 亚洲国产AV一区二区三区四区| 成人免费看黄20分钟| 欧洲 亚洲 国产图片综合| 成人免费a级毛片| 亚洲精品国产高清在线观看| 大地资源二在线观看免费高清| 亚洲 欧洲 自拍 另类 校园| 女人被男人躁的女爽免费视频| 亚洲午夜无码久久久久软件 | 国产 亚洲 中文在线 字幕| 最近免费中文字幕大全高清大全1| 亚洲成在人天堂在线| 8x8x华人永久免费视频| 亚洲女人影院想要爱| 成人午夜大片免费7777| 亚洲AV成人精品一区二区三区| 日韩亚洲国产二区| 日韩电影免费在线观看网站| 久久亚洲一区二区| 99在线精品视频观看免费| 亚洲性色AV日韩在线观看| 亚洲国产电影av在线网址| 最近免费中文字幕MV在线视频3| 久久久无码精品亚洲日韩按摩| 日韩在线播放全免费| 亚洲精品第一国产综合亚AV| 免费永久看黄在线观看app| 中文字字幕在线高清免费电影| 老色鬼久久亚洲AV综合| 麻豆国产入口在线观看免费 | 亚洲国产精品成人精品无码区在线| 免费在线中文日本| 精品久久久久久亚洲精品| 免费在线观看毛片| 日韩精品人妻系列无码专区免费| 亚洲三级在线观看| 亚洲无人区午夜福利码高清完整版|