在AVFoundation框架中AVAudioRecorder類專門處理錄音操作,支持多種音頻格式。下面是常用的屬性和方法:
屬性 | 說明 |
@property(readonly, getter=isPlaying) BOOL playing | 是否正在播放,只讀 |
@property(readonly) NSUInteger numberOfChannels | 音頻聲道數,只讀 |
@property(readonly) NSTimeInterval duration | 音頻時長 |
@property(readonly) NSURL *url | 音頻文件路徑,只讀 |
@property(readonly) NSData *data | 音頻數據,只讀 |
@property float pan | 立體聲平衡,如果爲-1.0則完全左聲道,如果0.0則左右聲道平衡,如果爲1.0則完全爲右聲道 |
@property float volume | 音量大小,範圍0-1.0 |
@property BOOL enableRate | 是否允許改變播放速率 |
@property float rate | 播放速率,範圍0.5-2.0,如果爲1.0則正常播放,如果要修改播放速率則必須設置enableRate爲YES |
@property NSTimeInterval currentTime | 當前播放時長 |
@property(readonly) NSTimeInterval deviceCurrentTime | 輸出設備播放音頻的時間,注意如果播放中被暫停此時間也會繼續累加 |
@property NSInteger numberOfLoops | 循環播放次數,如果爲0則不循環,如果小於0則無限循環,大於0則表示循環次數 |
@property(readonly) NSDictionary *settings | 音頻播放設置信息,只讀 |
@property(getter=isMeteringEnabled) BOOL meteringEnabled | 是否啓用音頻測量,默認爲NO,一旦啓用音頻測量可以通過updateMeters方法更新測量值 |
對象方法 | 說明 |
- (instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError | 使用文件URL初始化播放器,注意這個URL不能是HTTP URL,AVAudioPlayer不支持加載網絡媒體流,只能播放本地文件 |
- (instancetype)initWithData:(NSData *)data error:(NSError **)outError | 使用NSData初始化播放器,注意使用此方法時必須文件格式和文件後綴一致,否則出錯,所以相比此方法更推薦使用上述方法或- (instancetype)initWithData:(NSData *)data fileTypeHint:(NSString *)utiString error:(NSError **)outError方法進行初始化 |
- (BOOL)prepareToPlay; | 加載音頻文件到緩衝區,注意即使在播放之前音頻文件沒有加載到緩衝區程序也會隱式調用此方法。 |
- (BOOL)play; | 播放音頻文件 |
- (BOOL)playAtTime:(NSTimeInterval)time | 在指定的時間開始播放音頻 |
- (void)pause; | 暫停播放 |
- (void)stop; | 停止播放 |
- (void)updateMeters | 更新音頻測量值,注意如果要更新音頻測量值必須設置meteringEnabled爲YES,通過音頻測量值可以即時獲得音頻分貝等信息 |
- (float)peakPowerForChannel:(NSUInteger)channelNumber; | 獲得指定聲道的分貝峯值,注意如果要獲得分貝峯值必須在此之前調用updateMeters方法 |
- (float)averagePowerForChannel:(NSUInteger)channelNumber | 獲得指定聲道的分貝平均值,注意如果要獲得分貝平均值必須在此之前調用updateMeters方法 |
@property(nonatomic, copy) NSArray *channelAssignments | 獲得或設置播放聲道 |
代理方法 | 說明 |
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag | 音頻播放完成 |
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error | 音頻解碼發生錯誤 |
會話類型 | 說明 | 是否要求輸入 | 是否要求輸出 | 是否遵從靜音鍵 |
AVAudioSessionCategoryAmbient | 混音播放,可以與其他音頻應用同時播放 | 否 | 是 | 是 |
AVAudioSessionCategorySoloAmbient | 獨佔播放 | 否 | 是 | 是 |
AVAudioSessionCategoryPlayback | 後臺播放,也是獨佔的 | 否 | 是 | 否 |
AVAudioSessionCategoryRecord | 錄音模式,用於錄音時使用 | 是 | 否 | 否 |
AVAudioSessionCategoryPlayAndRecord | 播放和錄音,此時可以錄音也可以播放 | 是 | 是 | 否 |
AVAudioSessionCategoryAudioProcessing | 硬件解碼音頻,此時不能播放和錄製 | 否 | 否 | 否 |
AVAudioSessionCategoryMultiRoute | 多種輸入輸出,例如可以耳機、USB設備同時播放 | 是 | 是 | 否 |
MPMusicPlayerController
下面先來看一下MPMusicPlayerController的常用屬性和方法:
屬性 | 說明 |
@property (nonatomic, readonly) MPMusicPlaybackState playbackState |
播放器狀態,枚舉類型: MPMusicPlaybackStateStopped:停止播放 MPMusicPlaybackStatePlaying:正在播放 MPMusicPlaybackStatePaused:暫停播放 MPMusicPlaybackStateInterrupted:播放中斷 MPMusicPlaybackStateSeekingForward:向前查找 MPMusicPlaybackStateSeekingBackward:向後查找 |
@property (nonatomic) MPMusicRepeatMode repeatMode |
重複模式,枚舉類型: MPMusicRepeatModeDefault:默認模式,使用用戶的首選項(系統音樂程序設置) MPMusicRepeatModeNone:不重複 MPMusicRepeatModeOne:單曲循環 MPMusicRepeatModeAll:在當前列表內循環 |
@property (nonatomic) MPMusicShuffleMode shuffleMode |
隨機播放模式,枚舉類型: MPMusicShuffleModeDefault:默認模式,使用用戶首選項(系統音樂程序設置) MPMusicShuffleModeOff:不隨機播放 MPMusicShuffleModeSongs:按歌曲隨機播放 MPMusicShuffleModeAlbums:按專輯隨機播放 |
@property (nonatomic, copy) MPMediaItem *nowPlayingItem | 正在播放的音樂項 |
@property (nonatomic, readonly) NSUInteger indexOfNowPlayingItem | 當前正在播放的音樂在播放隊列中的索引 |
@property(nonatomic, readonly) BOOL isPreparedToPlay | 是否準好播放準備 |
@property(nonatomic) NSTimeInterval currentPlaybackTime | 當前已播放時間,單位:秒 |
@property(nonatomic) float currentPlaybackRate | 當前播放速度,是一個播放速度倍率,0表示暫停播放,1代表正常速度 |
類方法 | 說明 |
+ (MPMusicPlayerController *)applicationMusicPlayer; | 獲取應用播放器,注意此類播放器無法在後臺播放 |
+ (MPMusicPlayerController *)systemMusicPlayer | 獲取系統播放器,支持後臺播放 |
對象方法 | 說明 |
- (void)setQueueWithQuery:(MPMediaQuery *)query | 使用媒體隊列設置播放源媒體隊列 |
- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection | 使用媒體項集合設置播放源媒體隊列 |
- (void)skipToNextItem | 下一曲 |
- (void)skipToBeginning | 從起始位置播放 |
- (void)skipToPreviousItem | 上一曲 |
- (void)beginGeneratingPlaybackNotifications | 開啓播放通知,注意不同於其他播放器,MPMusicPlayerController要想獲得通知必須首先開啓,默認情況無法獲得通知 |
- (void)endGeneratingPlaybackNotifications | 關閉播放通知 |
- (void)prepareToPlay | 做好播放準備(加載音頻到緩衝區),在使用play方法播放時如果沒有做好準備回自動調用該方法 |
- (void)play | 開始播放 |
- (void)pause | 暫停播放 |
- (void)stop | 停止播放 |
- (void)beginSeekingForward | 開始向前查找(快進) |
- (void)beginSeekingBackward | 開始向後查找(快退) |
- (void)endSeeking | 結束查找 |
通知 |
說明 (注意:要想獲得MPMusicPlayerController通知必須首先調用beginGeneratingPlaybackNotifications開啓通知) |
MPMusicPlayerControllerPlaybackStateDidChangeNotification | 播放狀態改變 |
MPMusicPlayerControllerNowPlayingItemDidChangeNotification | 當前播放音頻改變 |
MPMusicPlayerControllerVolumeDidChangeNotification | 聲音大小改變 |
MPMediaPlaybackIsPreparedToPlayDidChangeNotification |
準備好播放 |
MPMoviePlayerController
在iOS中播放視頻可以使用MediaPlayer.framework種的MPMoviePlayerController類來完成,它支持本地視頻和網絡視頻播放。這個類實現了MPMediaPlayback協議,因此具備一般的播放器控制功能,例如播放、暫停、停止等。但是MPMediaPlayerController自身並不是一個完整的視圖控制器,如果要在UI中展示視頻需要將view屬性添加到界面中。下面列出了MPMoviePlayerController的常用屬性和方法:
屬性 | 說明 |
@property (nonatomic, copy) NSURL *contentURL | 播放媒體URL,這個URL可以是本地路徑,也可以是網絡路徑 |
@property (nonatomic, readonly) UIView *view | 播放器視圖,如果要顯示視頻必須將此視圖添加到控制器視圖中 |
@property (nonatomic, readonly) UIView *backgroundView | 播放器背景視圖 |
@property (nonatomic, readonly) MPMoviePlaybackState playbackState |
媒體播放狀態,枚舉類型: MPMoviePlaybackStateStopped:停止播放 MPMoviePlaybackStatePlaying:正在播放 MPMoviePlaybackStatePaused:暫停 MPMoviePlaybackStateInterrupted:中斷 MPMoviePlaybackStateSeekingForward:向前定位 MPMoviePlaybackStateSeekingBackward:向後定位 |
@property (nonatomic, readonly) MPMovieLoadState loadState |
網絡媒體加載狀態,枚舉類型: MPMovieLoadStateUnknown:位置類型 MPMovieLoadStatePlayable: MPMovieLoadStatePlaythroughOK:這種狀態如果shouldAutoPlay爲YES將自動播放 MPMovieLoadStateStalled:停滯狀態 |
@property (nonatomic) MPMovieControlStyle controlStyle |
控制面板風格,枚舉類型: MPMovieControlStyleNone:無控制面板 MPMovieControlStyleEmbedded:嵌入視頻風格 MPMovieControlStyleFullscreen:全屏 MPMovieControlStyleDefault:默認風格 |
@property (nonatomic) MPMovieRepeatMode repeatMode; |
重複播放模式,枚舉類型: MPMovieRepeatModeNone:不重複,默認值 MPMovieRepeatModeOne:重複播放 |
@property (nonatomic) BOOL shouldAutoplay | 當網絡媒體緩存到一定數據時是否自動播放,默認爲YES |
@property (nonatomic, getter=isFullscreen) BOOL fullscreen | 是否全屏展示,默認爲NO,注意如果要通過此屬性設置全屏必須在視圖顯示完成後設置,否則無效 |
@property (nonatomic) MPMovieScalingMode scalingMode |
視頻縮放填充模式,枚舉類型: MPMovieScalingModeNone:不進行任何縮放 MPMovieScalingModeAspectFit:固定縮放比例並且儘量全部展示視頻,不會裁切視頻 MPMovieScalingModeAspectFill:固定縮放比例並填充滿整個視圖展示,可能會裁切視頻 MPMovieScalingModeFill:不固定縮放比例壓縮填充整個視圖,視頻不會被裁切但是比例失衡 |
@property (nonatomic, readonly) BOOL readyForDisplay | 是否有相關媒體被播放 |
@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes |
媒體類別,枚舉類型: MPMovieMediaTypeMaskNone:未知類型 MPMovieMediaTypeMaskVideo:視頻 MPMovieMediaTypeMaskAudio:音頻 |
@property (nonatomic) MPMovieSourceType movieSourceType |
媒體源,枚舉類型: MPMovieSourceTypeUnknown:未知來源 MPMovieSourceTypeFile:本地文件 MPMovieSourceTypeStreaming:流媒體(直播或點播) |
@property (nonatomic, readonly) NSTimeInterval duration | 媒體時長,如果未知則返回0 |
@property (nonatomic, readonly) NSTimeInterval playableDuration | 媒體可播放時長,主要用於表示網絡媒體已下載視頻時長 |
@property (nonatomic, readonly) CGSize naturalSize | 視頻實際尺寸,如果未知則返回CGSizeZero |
@property (nonatomic) NSTimeInterval initialPlaybackTime | 起始播放時間 |
@property (nonatomic) NSTimeInterval endPlaybackTime | 終止播放時間 |
@property (nonatomic) BOOL allowsAirPlay | 是否允許無線播放,默認爲YES |
@property (nonatomic, readonly, getter=isAirPlayVideoActive) BOOL airPlayVideoActive | 當前媒體是否正在通過AirPlay播放 |
@property(nonatomic, readonly) BOOL isPreparedToPlay | 是否準備好播放 |
@property(nonatomic) NSTimeInterval currentPlaybackTime | 當前播放時間,單位:秒 |
@property(nonatomic) float currentPlaybackRate | 當前播放速度,如果暫停則爲0,正常速度爲1.0,非0數據表示倍率 |
對象方法 | 說明 |
- (instancetype)initWithContentURL:(NSURL *)url | 使用指定的URL初始化媒體播放控制器對象 |
- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated | 設置視頻全屏,注意如果要通過此方法設置全屏則必須在其視圖顯示之後設置,否則無效 |
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option |
獲取在指定播放時間的視頻縮略圖,第一個參數是獲取縮略圖的時間點數組;第二個參數代表時間點精度,枚舉類型: MPMovieTimeOptionNearestKeyFrame:時間點附近 MPMovieTimeOptionExact:準確時間 |
- (void)cancelAllThumbnailImageRequests | 取消所有縮略圖獲取請求 |
- (void)prepareToPlay | 準備播放,加載視頻數據到緩存,當調用play方法時如果沒有準備好會自動調用此方法 |
- (void)play | 開始播放 |
- (void)pause | 暫停播放 |
- (void)stop | 停止播放 |
- (void)beginSeekingForward | 向前定位 |
- (void)beginSeekingBackward | 向後定位 |
- (void)endSeeking | 停止快進/快退 |
通知 | 說明 |
MPMoviePlayerScalingModeDidChangeNotification | 視頻縮放填充模式發生改變 |
MPMoviePlayerPlaybackDidFinishNotification | 媒體播放完成或用戶手動退出,具體完成原因可以通過通知userInfo中的key爲MPMoviePlayerPlaybackDidFinishReasonUserInfoKey的對象獲取 |
MPMoviePlayerPlaybackStateDidChangeNotification | 播放狀態改變,可配合playbakcState屬性獲取具體狀態 |
MPMoviePlayerLoadStateDidChangeNotification | 媒體網絡加載狀態改變 |
MPMoviePlayerNowPlayingMovieDidChangeNotification | 當前播放的媒體內容發生改變 |
MPMoviePlayerWillEnterFullscreenNotification | 將要進入全屏 |
MPMoviePlayerDidEnterFullscreenNotification | 進入全屏後 |
MPMoviePlayerWillExitFullscreenNotification | 將要退出全屏 |
MPMoviePlayerDidExitFullscreenNotification | 退出全屏後 |
MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification | 當媒體開始通過AirPlay播放或者結束AirPlay播放 |
MPMoviePlayerReadyForDisplayDidChangeNotification | 視頻顯示狀態改變 |
MPMovieMediaTypesAvailableNotification | 確定了媒體可用類型後 |
MPMovieSourceTypeAvailableNotification | 確定了媒體來源後 |
MPMovieDurationAvailableNotification | 確定了媒體播放時長後 |
MPMovieNaturalSizeAvailableNotification | 確定了媒體的實際尺寸後 |
MPMoviePlayerThumbnailImageRequestDidFinishNotification | 縮略圖請求完成之後 |
MPMediaPlaybackIsPreparedToPlayDidChangeNotification | 做好播放準備後 |
UIImagePickerController拍照和視頻錄製
下面看一下在iOS如何拍照和錄製視頻。在iOS中要拍照和錄製視頻最簡單的方法就是使用UIImagePickerController。UIImagePickerController繼承於UINavigationController,前面的文章中主要使用它來選取照片,其實UIImagePickerController的功能不僅如此,它還可以用來拍照和錄製視頻。首先看一下這個類常用的屬性和方法:
屬性 | 說明 |
@property(nonatomic) UIImagePickerControllerSourceType sourceType |
拾取源類型,sourceType是枚舉類型: UIImagePickerControllerSourceTypePhotoLibrary:照片庫 ,默認值 UIImagePickerControllerSourceTypeCamera:攝像頭 UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿 |
@property(nonatomic,copy) NSArray *mediaTypes | 媒體類型,默認情況下此數組包含kUTTypeImage,所以拍照時可以不用設置;但是當要錄像的時候必須設置,可以設置爲kUTTypeVideo(視頻,但不帶聲音)或者kUTTypeMovie(視頻並帶有聲音) |
@property(nonatomic) NSTimeInterval videoMaximumDuration | 視頻最大錄製時長,默認爲10 s |
@property(nonatomic) UIImagePickerControllerQualityType videoQuality |
視頻質量,枚舉類型: UIImagePickerControllerQualityTypeHigh:高清質量 UIImagePickerControllerQualityTypeMedium:中等質量,適合WiFi傳輸 UIImagePickerControllerQualityTypeLow:低質量,適合蜂窩網傳輸 UIImagePickerControllerQualityType640x480:640*480 UIImagePickerControllerQualityTypeIFrame1280x720:1280*720 UIImagePickerControllerQualityTypeIFrame960x540:960*540 |
@property(nonatomic) BOOL showsCameraControls | 是否顯示攝像頭控制面板,默認爲YES |
@property(nonatomic,retain) UIView *cameraOverlayView | 攝像頭上覆蓋的視圖,可用通過這個視頻來自定義拍照或錄像界面 |
@property(nonatomic) CGAffineTransform cameraViewTransform | 攝像頭形變 |
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode |
攝像頭捕獲模式,捕獲模式是枚舉類型: UIImagePickerControllerCameraCaptureModePhoto:拍照模式 UIImagePickerControllerCameraCaptureModeVideo:視頻錄製模式 |
@property(nonatomic) UIImagePickerControllerCameraDevice cameraDevice |
攝像頭設備,cameraDevice是枚舉類型: UIImagePickerControllerCameraDeviceRear:前置攝像頭 UIImagePickerControllerCameraDeviceFront:後置攝像頭 |
@property(nonatomic) UIImagePickerControllerCameraFlashMode cameraFlashMode |
閃光燈模式,枚舉類型: UIImagePickerControllerCameraFlashModeOff:關閉閃光燈 UIImagePickerControllerCameraFlashModeAuto:閃光燈自動 UIImagePickerControllerCameraFlashModeOn:打開閃光燈 |
類方法 | 說明 |
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType |
指定的源類型是否可用,sourceType是枚舉類型: UIImagePickerControllerSourceTypePhotoLibrary:照片庫 UIImagePickerControllerSourceTypeCamera:攝像頭 UIImagePickerControllerSourceTypeSavedPhotosAlbum:相簿 |
+ (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType | 指定的源設備上可用的媒體類型,一般就是圖片和視頻 |
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice |
指定的攝像頭是否可用,cameraDevice是枚舉類型: UIImagePickerControllerCameraDeviceRear:前置攝像頭 UIImagePickerControllerCameraDeviceFront:後置攝像頭 |
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice | 指定攝像頭的閃光燈是否可用 |
+ (NSArray *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice |
獲得指定攝像頭上的可用捕獲模式,捕獲模式是枚舉類型: UIImagePickerControllerCameraCaptureModePhoto:拍照模式 UIImagePickerControllerCameraCaptureModeVideo:視頻錄製模式 |
對象方法 | 說明 |
- (void)takePicture | 編程方式拍照 |
- (BOOL)startVideoCapture | 編程方式錄製視頻 |
- (void)stopVideoCapture | 編程方式停止錄製視頻 |
代理方法 | 說明 |
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info | 媒體拾取完成 |
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker | 取消拾取 |
擴展方法(主要用於保存照片、視頻到相簿) | 說明 |
UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo) | 保存照片到相簿 |
UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(NSString *videoPath) | 能否將視頻保存到相簿 |
void UISaveVideoAtPathToSavedPhotosAlbum(NSString *videoPath, id completionTarget, SEL completionSelector, void *contextInfo) |
保存視頻到相簿 |