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

在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) 保存視頻到相簿
發佈了32 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章