在iOS開發中,主要使⽤用四種⽅式來播放音頻:php
System Sound Services是最底層也是最簡單的聲音播放服務, 經過調用AudioServicesPlaySystemSound 這個函數就能夠播放一些簡單的音頻文件緩存
使用場景 : 適合播放一些很小的提示或者警告音網絡
侷限性:session
一、聲音長度小於30秒框架
二、格式 : IMA4, WAVless
三、不能控制播放的進度iphone
四、調用方法後當即播放聲音ide
五、沒有循環播放和立體聲音播放函數
OpenAL : 跨平臺的開源音頻處理藉口ui
優點:
支持更多的格式
能夠播聽任意長度的音頻
支持循環播放
能夠同步播放多個音頻文件
控制播放進度以及從音頻的任意一點開始播放
- (void)playSystemAudio { // 系統聲音ID列表http://iphonedevwiki.net/index.php/AudioServices // 直接播放系統指定ID的聲音 // AudioServicesPlaySystemSound(1002); SystemSoundID soundID; //用NSBundle來返回音頻文件路徑 NSString *path = [[NSBundle mainBundle] pathForResource:@"msg" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; //創建SystemSoundID對象,可是這裏要傳地址(加&符號)。 第一個參數須要一個CFURLRef類型的url參數,要新建一個NSString來作橋接轉換(bridge),而這個NSString的值,就是上面的音頻文件路徑 // 將本地的聲音註冊爲系統聲音 AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID); // 播放系統聲音 // AudioServicesPlaySystemSound(soundID); // 播放提示音,帶震動 AudioServicesPlayAlertSound(soundID); }
使⽤用簡單方便,但只能播放本地音頻,不支持流媒體播放。⽀持的⾳頻格式有:
AAC
AMR(AdaptiveMulti-Rate, aformatforspeech) ALAC(AppleLossless)
iLBC(internetLowBitrateCodec, anotherformatforspeech) IMA4(IMA/ADPCM)
linearPCM(uncompressed)
μ-lawanda-law
MP3(MPEG-1audiolayer3
AVAudioPlayer不能夠播放網絡URL,可是能夠播放NSData,因此咱們能夠經過網絡URL去建立NSData,而後在經過AVAudioPlayer來播放NSData,但此法並不可取,由於AVAudioPlayer只能播放一個完整的文件,並不支持流式播放,因此必須是緩衝完才能播放,因此若是網絡文件過大抑或是網速不夠豈不是要等好久?因此播放網絡音頻咱們通常用音頻隊列。
步驟一:AVAudioPlayer 包含在 AVFoundation 框架中,因此開發的時候首先導入音頻的框架 AVFoundation.framework
引入頭文件
#import <AVFoundation/AVFoundation.h>
步驟二:
建立一個AVAudioPlayer之後你就能夠對它的各類屬性進行訪問或設置了 。
- (AVAudioPlayer *)audioPlayer { if (!_audioPlayer) { // 設置後臺播放,先要在info.plist 文件中添加 Required background modes項而且添加item: App plays audio or streams audio/video using AirPlay AVAudioSession *session = [[AVAudioSession alloc] init]; [session setActive:YES error:nil]; [session setCategory:AVAudioSessionCategoryPlayback error:nil]; //從budle路徑下讀取音頻文件 NSString *path = [[NSBundle mainBundle] pathForResource:@"貳佰-狗日的青春" ofType:@"mp3"]; //把音頻文件轉換成url格式 NSURL *url = [NSURL fileURLWithPath:path]; _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; //設置代理 _audioPlayer.delegate = self; //設置最大音量 self.progressView.maximumValue = _audioPlayer.duration; //音量 0.0 ~ 1.0 之間 _audioPlayer.volume = 0.5; //預播放 [_audioPlayer prepareToPlay]; [self showAudioInfo]; } return _audioPlayer; }
iOS4.0之後,可使用AVPlayer播放本地音頻和支持流媒體播放,但提供接口較
少,處理音頻不夠靈活
- (void)palyerCurrentTime:(NSTimer *)timer { // 獲取播放的時間進度:currentTime float timeValue = (float)self.player.currentItem.currentTime.value / self.player.currentItem.currentTime.timescale; NSLog(@"當前時間:%f",timeValue); // 獲取在線播放的媒體加載好的時間: loadedTimeRanges NSValue *loadTimeValue = [self.player.currentItem.loadedTimeRanges lastObject]; CMTimeRange timeRange; [loadTimeValue getValue:&timeRange]; NSLog(@"loadTime:%f",(float)timeRange.duration.value/timeRange.duration.timescale); }
音頻隊列主要處理流媒體播放,提供了強⼤且靈活的API接口(C函數的接口), 但處理起來也較爲複雜
最適合開發遊戲的音頻
OpenAL 包含三個 實體:Listener(聽者)、Source(音源)、 Buffer(緩存)
Audio Queue Services 主要用來實現錄製音頻,爲了簡化音頻文件的處理,一般還須要使用到AudioFileServices
② 開發步驟
1.獲取device
2.將context關聯到device
3.將數據放入buffer
4.將buffer連接到一個source
5.播放source
功能說明:
簡單的實現了播放流式PCM數據的功能
使用方法: (.h文件內也有詳細說明)
1. 導入OpenAL.framework
2. alloc/init方法建立對象
3. 調用initOpenAL方法初始化OpenAL
4. 使用insertPCMDataToQueue:size:方法將PCM數據加載到緩衝隊列裏, 會自動播放
5. 不用的時候, 先調用clean方法關閉OpenAL而後再銷燬對象. (不clean的話, 下次初始化會有問題)
iOS裏面視頻播放用的是AVPlayer (包含在AVFoundation框架內) 與AVAudioPlayer有點相似, 可是AVPlayer的功能更增強大, 它能夠用來播放音頻也能夠用來播放視頻. 並且在播放音頻方面AVPlayer能夠直接播放網絡音頻.
MPMoviePlayerController 與AVAudioPlayer有點相似,前者播放視頻,後者播放音頻,不過也有很大不一樣,MPMoviePlayerController 能夠直接經過遠程URL初始化,而AVAudioPlayer則不能夠。
2、屬性設置
1.控制器樣式
可使用下列樣式:
MPMovieControlModeDefault 顯示播放/暫停、音量和時間控制
MPMovieControlModeVolumeOnly 只顯示音量控制
MPMovieControlModeHidden 沒有控制器
2.屏幕寬高比例
你可使用下列寬高比值:
MPMovieScallingModeNone 不作任何縮放
MPMovieScallingModeAspectFit 適應屏幕大小,保持寬高比
MPMovieScallingModeAspectFill 適應屏幕大小,保持寬高比,可裁剪
MPMovieScallingModeFill 充滿屏幕,不保持寬高比
AVPlayerLayer(負責視頻的可視區域,視頻的播放模式,注意是CALayer,不能接受觸摸)
AVPlayerItem(表示AVPlayer播放的資源對象,能夠監聽其狀態)
//使用相機前先斷定設備是否能夠 if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
相機拍照設置
// 是否能夠編輯 self.imagePicker.allowsEditing = YES; // 修改相機呈現視圖的transform self.imagePicker.cameraViewTransform = CGAffineTransformMakeRotation(M_PI_2); /* 設置攝像頭的模式 UIImagePickerControllerCameraDeviceRear, 後置 UIImagePickerControllerCameraDeviceFront 前置 */ self.imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear; // 設置閃光燈,默認自動 self.imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
攝影設置
// 媒體類型 self.imagePicker.mediaTypes = @[(NSString *)kUTTypeMovie]; // 相機模式爲 video self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo; // 視頻的質量 self.imagePicker.videoQuality = UIImagePickerControllerQualityType640x480; [self presentViewController:self.imagePicker animated:YES completion:NULL]; } else { NSLog(@"相機不可用!"); }