iOS陸哥開發筆記(七) (AVFoundation簡單介紹)

weixin_34037977發表於2017-07-28

在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) 儲存視訊到相簿

相關文章