首页 文章

使用AVAssetWriter捕获的视频的持续时间为零

提问于
浏览
0

我正在尝试使用 AVAssetWriterAVCaptureSessionAVCaptureOutputAVAssetWriterInput 捕获视频 .

这是 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 回答

  • 1

    确保在完成后调用 [AVAssetWriter finishWritingWithCompletionHandler:] .

    您应该使用您收到的第一个缓冲区的演示时间戳来调用 startSessionAtSourceTime .

    您可以删除 [self.assetWriter endSessionAtSourceTime:kCMTimeZero]; .

  • 0
    [self.assetWriter endSessionAtSourceTime:kCMTimeZero];
    

    您将会话结束时间设置为零,使录制时间为0秒...

相关问题