2012年4月11日

iPhone iOS4 聲音與震動(vibration and sound) 第一集

拜了Google大神,在網路上找了很久,都沒有對聲音與震動做完整的解釋。
分聲音與震動兩部分來說:

聲音的播放
   Q:iOS聲音的播放有方式有哪些?
   Google大神:

  1. System Sound Services
    它是最底層也是最簡單的聲音播放服務,呼叫 AudioServicesPlaySystemSound 這個方法就可以播放一些簡單的聲音檔,注意:此方法只適合播放一些很小的提示或者警告音,因為它有很多限制:
    •  聲音長度要小於 30 秒
    •  In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
    •  打包成 .caf, .aif, 或者 .wav 的文件
    •  不能控制播放的進度
    •  調用方法後立即播放聲音
    •  沒有循環播放和立體聲控制(可透過AudioServicesAddSystemSoundCompletion設定)
         詳細資料請看連結
  1. AVAudioPlayer
    AVAudioPlayer是 AVFoundation.framework 中定義的一個Class,所以使用之前要先在Project中加入AVFoundation.framework。
    AVAudioPlayer類似一個進階的播放器,它支援較廣泛的聲音檔格式,主要是以下這些格式:
    • AAC
    • AMR(AdaptiveMulti-Rate, aformatforspeech)
    • ALAC(AppleLossless)
    • iLBC(internetLowBitrateCodec, anotherformatforspeech)
    • IMA4(IMA/ADPCM)
    • linearPCM(uncompressed)
    • µ-lawanda-law
    • MP3(MPEG-1audiolayer3 
        詳細資料請看連結
    
    Q:有沒有 SystemSound Services 的範例?
    Google大神:
   - (void) showReminder{
    SystemSoundID sysSoundId = 0;
    NSString *path = [[NSBundle mainBundlepathForResource:@"alarm" ofType:@"caf"];
    NSURL *filepath = [NSURL fileURLWithPath: path];
    AudioServicesCreateSystemSoundID((__bridge_retained CFURLRef) filepath, &sysSoundId);
    AudioServicesPlaySystemSound(sysSoundId);
    AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
   }



    Q:為什麼我編譯會失敗啊出現 Unknown type name 'SystemSoundID' 的訊息
    Google大神:請在你的.h檔 加上

    #include


    Q:加上那一行還是不行啊,出現 Undefined symbols for architecture armv7:
  "_AudioServicesPlayAlertSound", referenced from: xxx 阿?
    Google大神:
         請在 framework 裡面加上AudioToolBox.framework
         作法:在Project上點右鍵->選擇Target底下的BuildPhase -> Link Binary With Libraries
         再加入AudioToolBox.framework

       

    Q6:編譯都過了,執行後,為什麼沒有聲音?
    Google大神:請檢查檔案格式,跟Encoding 編碼的方法,還有要記得開聲音喔。
                        另外,可以在Terminal裏使用Developer的工具轉檔,
                        利用轉檔工具把它轉為CAF格式這樣就萬無一失了。
                        輸入
                 afconvert -f caff -d LEI16@44100 -c 1 jj01.mp3 jj01.caf
                 



    Q7:那AVAudioPlayer的範例呢?
    Google大神:

      NSString *soundFilePath = 
    [[NSBundle mainBundle] pathForResource: @"as01" 
                                    ofType: @"caf"]; 
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 
    AVAudioPlayer *newPlayer = 
    [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                           error: nil];
    self.player = newPlayer; 
    [self.player prepareToPlay];
    
    self.player.delegate=self;
    self.player.numberOfLoops = -1;    // Loop playback until invoke stop method
    [self.player play];  

 



沒有留言:

張貼留言