####思路 1.开启CADisplayLink 定时器来录制视频 CADisplayLink 刷新频率比- (void)session:(ARSession \*)session didUpdateFrame:(ARFrame \*)frame方法要快 而且更加符合需求 2.在录制视频的第一帧的时候开始录制音频 ####注意 在Info.plist文件里加入下面2个key NSMicrophoneUsageDescription NSPhotoLibraryAddUsageDescript
, 我们会拿到视频和音频的数据流,用AVAssetWriter写入文件,这一步需要我们自己实现。 你需要在这个协议的方法里面去开始通过 AVAssetWriter 对象 startWriting 开始写入数据 8、当写完数据之后就会走AVAssetWriter的finishWritingWithCompletionHandler AVAssetWriter 需要 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 两个单独的输出,拿到各自的输出数据后,然后自己进行相应的处理。 可配参数不一致,AVAssetWriter可以配置更多的参数。 使用 AVAssetWriter 对象可以将样本缓存写入文件” 这样就把这两种之间的优劣进行了一个比较,希望看到这文章的每一个同行都能有收获吧。 Demo地址
需要注意的是,一个 AVAssetWriter 实例只能对应写一个文件,如果要写入多个文件,需要创建多个 AVAssetWriter 实例。 addInput:[91]:给 AVAssetWriter 添加一个 AVAssetWriterInput。注意必须在 AVAssetWriter 开始写入之前添加。 必须在配置好 AVAssetWriter 添加完 AVAssetWriterInput 做好准备后再调用这个方法。 如果 AVAssetWriter 已经创建了输出文件,调用这个方法会删除这个文件。 language=objc [89]AVAssetWriter: https://developer.apple.com/documentation/avfoundation/avassetwriter
需要注意的是,一个 AVAssetWriter 实例只能对应写一个文件,如果要写入多个文件,需要创建多个 AVAssetWriter 实例。 addInput:[107]:给 AVAssetWriter 添加一个 AVAssetWriterInput。注意必须在 AVAssetWriter 开始写入之前添加。 必须在配置好 AVAssetWriter 添加完 AVAssetWriterInput 做好准备后再调用这个方法。 如果 AVAssetWriter 已经创建了输出文件,调用这个方法会删除这个文件。 language=objc [105] AVAssetWriter: https://developer.apple.com/documentation/avfoundation/avassetwriter
具备接收图像数据输入,也就是渲染的终点,在GPUImage里,有四大组件,使用的比较多的GPUImageMovieWriter和GPUImageView 3.1、GPUImageMovieWriter 封装了AVAssetWriter ,可以逐帧从帧缓存的渲染结果中读取数据,最后通过AVAssetWriter将视频保存到指定的路径 3.2、GPUImageView 继承UIView,通过输入的纹理,执行一遍渲染流程 3.3、GPUImageRawDataOutput
AVCaptureDeviceInput *audioInput; 麦克风输入 AVCaptureAudioDataOutput *audioOutput; 麦克风输出 AVAssetWriter ; [_videoCamera startCameraCapture]; 开始录制 unlink([pathToMovie UTF8String]); // 如果已经存在文件,AVAssetWriter
exportPresetsCompatibleWithAsset 可以导出可配置格式的列表; Error相关 AVAssetWriter AVAssetWriter经常报出错误 AVAssetWriter startSessionAtSourceTime: Cannot call method when status is 0 查看文档,知道status=0表示未知,可知应该是没有初始化成功AVAssetWriter
AVCaptureConnection 拍照——AVCaptureStillImageOutput 音频——AVCaptureAudioDataOutput 视频——AVCaptureVideoDataOutput 生成视频文件——AVAssetWriter videoOut]){ [_captureSession addOutput:videoOut]; _videoOutput = videoOut; } 生成视频文件——AVAssetWriter 、AVAssetWriterInput AVAssetWriter:用于对媒体资源进行编码并讲其写入到容器文件中,比如一个QuickTime文件。 AVAssetWriterInputPixelBufferAdaptor:这个类在生成视频文件时提供最优性能,不过Demo没有使用该类,有兴趣的可以去研究一下 // 初始化一个assetWriter NSError *error; _assetWriter = [[AVAssetWriter [self showError:_assetWriter.error]; return NO; } return YES; } 通过上面的代码,我们就准备好了一个AVAssetWriter
3.1 音视频基础API 在合成的过程中,我们使用到了AVAssetWriter这个类。 AVAssetWriter可以将多媒体数据从多个源进行编码(比如接下来的多张图片和一个BGM进行合成)并写入指定文件格式的容器中,比如我们熟知的MPEG-4文件。 3.1.1 AVAssetWriter 与AVAssetWriterInput AVAssetWriter通常由一个或多个AVAssetWriterInput对象构成,将AVAssetWriterInput if (success) { NSLog(@"append buffer success"); } } 3.1.3 设置输入输出参数,以及多媒体数据的采样 第一步:创建AVAssetWriter 对象,传入生成视频的路径和格式 AVAssetWriter *assetWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath
generateCGImageesAsynchronouslyForTimes:completionHandler: AVAssetExportSession 可以将 AVAsset 媒体文件内容由指定的预设格式进行输出 AVAssetWriter 相比 AVAssetExportSession AVAssetReader + AVAssetWriter 可以有更细粒度的配置,比如我们可以将 CMSampleBuffer 经过特效处理后写入文件
初始化 AVAssetWriter 时可以设置 outputFileTypeProfile = AVFileTypeProfileMPEG4AppleHLS 即可打开 MP4 分段转码。 assetWriter_ = [[AVAssetWriter alloc] initWithContentType:[UTType typeWithIdentifier:AVFileTypeMPEG4]
AVFoundation.AVAssetTrack import AVFoundation.AVAssetTrackGroup import AVFoundation.AVAssetTrackSegment import AVFoundation.AVAssetWriter AVURLAsset和代理方法得到加载的内容 AVAssetTrack资源的分轨 AVAssetTrackGroup这里面封装了一组资源的分轨 AVAssetTrackSegment表示资源分轨的一段 AVAssetWriter
AVFoundation.AVAssetTrack import AVFoundation.AVAssetTrackGroup import AVFoundation.AVAssetTrackSegment import AVFoundation.AVAssetWriter
我们总结的大致内容如下: 1、视频录制 AVCaptureSession + AVCaptureMovieFileOutput 2、视频录制 AVCaptureSession + AVAssetWriter 3、AVCaptureSession + AVCaptureMovieFileOutput 与 AVCaptureSession + AVAssetWriter 的区别 这是这个系列总结文章的第三篇 /* 这里需要注意的一点就是在重复的路径上保存文件是不行的,可以选择在点击开始的时候删除之前的 也可以这样按照时间命名不同的文件保存 在后面的 AVAssetWriter
我们总结的大致内容如下: 1、视频录制 AVCaptureSession + AVCaptureMovieFileOutput 2、视频录制 AVCaptureSession + AVAssetWriter 3、AVCaptureSession + AVCaptureMovieFileOutput 与 AVCaptureSession + AVAssetWriter 的区别 这是这个系列总结文章的第三篇 /* 这里需要注意的一点就是在重复的路径上保存文件是不行的,可以选择在点击开始的时候删除之前的 也可以这样按照时间命名不同的文件保存 在后面的 AVAssetWriter
通过 AVFoundation 框架,可以使用 AVAssetWriter 和 AVAssetWriterInput 类来实现编码视频。
建议在Session -startRunning后才添加,避免影响摄像头启动时间 添加AVCaptureVideoPreviewLayer,为用户提供拍摄预览界面 创建MMovieWriter,里面包含AVAssetWriter MovieWriter写入文件,同时把下面这行代码注释,错误不再出现了: //m_writer.movieFragmentInterval = CMTimeMakeWithSeconds(1.0, 1000); // AVAssetWriter
} @property (nonatomic, strong, readwrite) KFMuxerConfig *config; @property (nonatomic, strong) AVAssetWriter if (_muxWriter) { return YES; } // 使用 AVAssetWriter 作为封装器,类型使用 AVFileTypeMPEG4。 _muxWriter = [[AVAssetWriter alloc] initWithURL:self.config.outputURL fileType:AVFileTypeMPEG4 error:
GPUImageMovieWriter将视频输出到磁盘,通过设置、使用AVAssetWriter,在newFrameReadyAtTime:中实现功能。 ?
总结 旋转图像的的数据是个耗性能的操作,如果是用AVAssetWriter写QuickTime movie文件,更好的做法是设置AVAssetWriterInput的transform属性,而不是修改AVCaptureVideoDataOutput