首页 > 代码库 > iOS陆哥开发笔记(七) (AVFoundation简单介绍)

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)保存视频到相簿

iOS陆哥开发笔记(七) (AVFoundation简单介绍)