音频文件介绍
有两类主要的音频文件格式:
无损格式,例如WAV,PCM,TTA,FLAC,AU,APE,TAK,WavPack(WV) ,CAF
有损格式,例如MP3,Windows Media Audio(WMA),Ogg Vorbis(OGG),AAC
移动音频文件
作为移动设备音频文件应该原则上比较小,一般的格式:
WAV、由于无损压缩效果最好。
MP3、有损压缩,文件比较小,由于去除的是人类无法感应到的声音,效果也很好。这是目前常用格式。
AAC、压缩比例更大,比MP3文件还要小。
CAF(Core Audio Format)是Apple专用的无损压缩格式。
Core Audio
高级API,易用
System Sound API –播放短声音、警告音等。
AVFoundation 可以播放长时间声音,简单易用。
低级API,能够对音频有更多的控制
Audio Toolbox – 录制、播放、音频流有全面的控制。
OpenAL – 播放立体声,常用于游戏。
System Sound API
System Sound 可以播放“短的”声音,所谓短声音就是5秒以内。 不循环、没有声音控制、立即播放。
播放格式限制:
1 线性PCM 和 IMA4
2 .caf .aif 或 .wav
播放“短声音”
播放“短声音”主要就是两个步骤:
注册声音
AudioServicesCreateSystemSoundID ((CFURLRef)fileURL, &myID);
播放声音
AudioServicesPlaySystemSound (myID);
监听完成事件方法
AudioServicesAddSystemSoundCompletion
清除播放sound ID
SystemSoundID myID;
AudioServicesDisposeSystemSoundID (myID);
震动
也可以通过System Sound API让iPhone震动,但是iPod touch不能震动。
震动可以通过指定一个特殊的system sound ID—— kSystemSoundID_Vibrate实现。
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
实例
SystemSoundServices
添加AudioToolbox.framework框架
SystemSoundServicesViewController.h文件
#import <UIKit/UIKit.h>
#include <AudioToolbox/AudioToolbox.h>
@interface SystemSoundServicesViewController : UIViewController;
- (IBAction) playSystemSound;
- (IBAction) vibrate;
@end
- (IBAction) playSystemSound
{
NSURL* system_sound_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"BeepGMC500" ofType:@"wav"]];
SystemSoundID system_sound_id;
AudioServicesCreateSystemSoundID(
(CFURLRef)system_sound_url,
&system_sound_id
);
// Register the sound completion callback.
AudioServicesAddSystemSoundCompletion(
system_sound_id,
NULL, // uses the main run loop
NULL, // uses kCFRunLoopDefaultMode
MySoundFinishedPlayingCallback, // the name of our custom callback function
NULL // for user data, but we don't need to do that in this case, so we just pass NULL
);
// Play the System Sound
AudioServicesPlaySystemSound(system_sound_id);
}
AudioServicesAddSystemSoundCompletion方法5个参数,第一参数SystemSoundID,第二参数是是否使用循环,第三个参数是循环模式,第四个参数是回调函数,就是当播放完成时候回调的方法,第五个参数是为回调函数提供参数。
这里回调的方法是C语言风格的函数:MySoundFinishedPlayingCallback。
回调函数
void MySoundFinishedPlayingCallback(SystemSoundID sound_id, void* user_data){
震动方法调用
// Vibrate on action
- (IBAction) vibrate
{
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}