美文网首页
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