我正在尝试使用 AVAssetWriter
, AVCaptureSession
, AVCaptureOutput
和 AVAssetWriterInput
捕获视频 .
这是 AVCaptureOutput
的委托方法,我在这里添加缓冲区:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
if (self.assetWriter.status != AVAssetWriterStatusWriting) {
CMTime startTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
[self.assetWriter startWriting];
[self.assetWriter startSessionAtSourceTime:startTime];
}
if ([captureOutput isKindOfClass:AVCaptureVideoDataOutput.class] && self.videoWriterInput.isReadyForMoreMediaData) {
[self.videoWriterInput appendSampleBuffer:sampleBuffer];
}
else if ([captureOutput isKindOfClass:AVCaptureAudioDataOutput.class] && self.audioWriterInput.isReadyForMoreMediaData) {
[self.audioWriterInput appendSampleBuffer:sampleBuffer];
}
}
和完成写作的方法:
- (void)finishCurrentWriting {
[self.videoWriterInput markAsFinished];
[self.audioWriterInput markAsFinished];
__weak ViewController *weakSelf = self;
[self.assetWriter finishWritingWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf runVideo];
});
}];
}
当我'm ending writing video into file, I' m试图通过 MPMoviePlayerController
播放时 . 数据可用,因为文件大小很大,但由于某些原因,视频的持续时间为零 . 我究竟做错了什么?
添加了带有测试代码的repository . 这是用于HLS流媒体,所以现在它应该制作15s视频,之后显示在屏幕底部的播放器中(现在播放器只是黑色,视频持续时间为0) .
2 回答
确保在完成后调用
[AVAssetWriter finishWritingWithCompletionHandler:]
.您应该使用您收到的第一个缓冲区的演示时间戳来调用
startSessionAtSourceTime
.您可以删除
[self.assetWriter endSessionAtSourceTime:kCMTimeZero];
.您将会话结束时间设置为零,使录制时间为0秒...