AVFoundation是基于Core Audio、Core Media、Core Animation的视听媒体框架。在AVFoundation框架之上还提供了更高层次的媒体框架,比如iOS的UIKit(UIImagePickerController)、AVKit。
如果能满足任务需求,应该尽量使用更高层次的API,比如仅简单的播放电影,可以使用AVKit框架,记录音频,你可以使用AVAudioRecorder。
AVFoundation框架主要包含两个方面,一是视频处理API,一是音频处理API。
AVFoundation可以实现视频录制和播放,音频录制和播放。下面代码为简化版,没有做任何控制,仅做演示功能。通过代码的阅读,我们可以对AVFoundation有一个简单的了解。
视频录制
AVFoundation可以实现视频录制。需要用到一下几个类:AVCaptureDevice、AVCaptureInput、AVCaptureOutput、AVCaptureSession、AVCaptureVideoPreviewLayer。
capture.jpg
//摄像头,firstObject为后置摄像头,lastObject为前置摄像头
NSArray *videoDevice = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputVideo = [AVCaptureDeviceInput deviceInputWithDevice:[videoDevice firstObject] error:nil];
//麦克风
AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput *inputAudio = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
//初始化视频文件输出
output = [[AVCaptureMovieFileOutput alloc]init];
//初始化会话
AVCaptureSession *session = [[AVCaptureSession alloc]init];
if ([session canAddInput:inputAudio]) {
[session addInput:inputAudio];
}
if ([session canAddInput:inputVideo]) {
[session addInput:inputVideo];
}
if ([session canAddOutput:output]) {
[session addOutput:output];
}
AVCaptureVideoPreviewLayer *preLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
preLayer.frame = self.view.bounds;
[self.view.layer addSublayer:preLayer];
-(void)record {
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"video.mov"];
[output startRecordingToOutputFileURL:[NSURL fileURLWithPath:path] recordingDelegate:nil];
}```
####播放视频
        视频播放可以简要分为三个步骤:AVPlayerItem资源,AVPlayer播放器,AVPlayerLayer展示。
``` bash
NSURL *url = [[NSBundle mainBundle]URLForResource:@"1.mov" withExtension:nil];
AVAsset *asset = [AVAsset assetWithURL:url];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view.layer addSublayer:playerLayer];
[player play];```
####音频录制和播放
       设置文件存储路径,设置录音的设置,比如采样率、录音质量、录音通道数等,然后开始录制。
```bash
//录音
[[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryRecord error:nil];
NSString *fileString = [NSTemporaryDirectory() stringByAppendingString:@"record.wav"];
NSURL *filePathUrl = [NSURL fileURLWithPath:fileString];
NSMutableDictionary *recordSetting = [NSMutableDictionary new];
[recordSetting setValue:[NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
AVAudioRecorder *recorder = [[AVAudioRecorder alloc]initWithURL:filePathUrl settings:recordSetting error:nil];
reco
if ([recorder isRecording]) {
[recorder stop];
}
//播放录音
[[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryPlayback error:nil];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:filePathUrl error:nil];
if ([audioPlayer play]) {
NSLog(@"success player");
}
常用API
上面对AVFoundation有了一个简单的了解,下面对API中几个重要的类做一下说明。
AVAsset
AVAsset是不可变的抽象类,用来表示一个音视频媒体。里面包含资源时长,播放速率,音量等基本信息。里面也包含轨道信息,元数据,章节元数据,媒体选择,懒惰加载相关的属性。
AVAssetTrack
AVAssetTrack 可以翻译为轨道,AVAsset可以对应多个轨道,例如视频播放,至少需要两个轨道,一个播放声音,一个播放画面。mediaType可以判断轨道类型。
AVAssetReader
从AVAsset的实例中获取媒体数据。
AVAssetWriter
将媒体数据写入一个新的文件,并为其指定类型。
AVPlayer
播放器,可以设置开始播放,暂停播放,播放速率等信息。
AVPlayerItem
播放源。
AVPlayerLayer
播放容器。
AVAudioRecorder
音频录制。
AVAudioPlayer
音频播放。
AVCaptureDevice
输入设备,例如摄像头和麦克风。
AVCaptureInput
输入数据源
AVCaptureOutput
输出数据源
AVCaptureSession
协调输入输出之间的数据流
AVCaptureVideoPreviewLayer
摄像头预览
网友评论