iOS陆哥开发笔记 (AVFoundation简单介绍)
Posted yutingliuyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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简单介绍)的主要内容,如果未能解决你的问题,请参考以下文章
IOS开发中AVFoundation中AVAudioPlayer的使用