美文网首页
AVFoundation

AVFoundation

作者: roy_pub | 来源:发表于2017-06-23 17:10 被阅读38次
AVFoundation stack on iOS.png

        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

      摄像头预览

相关文章

网友评论

      本文标题:AVFoundation

      本文链接:https://www.haomeiwen.com/subject/plnqcxtx.html