我正在捕获摄像头的视频,并将其写入电影中。 问题是,在导出后,电影前面会有几秒黑屏(相对于实际录制开始时间)。
我认为这与[self.assetWriter startSessionAtSourceTime:kCMTimeZero];
有关。
我曾经通过在samplebuffer委托方法中使用一个frameStart变量来解决一半的问题。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
frameStart++;
if (self.startRecording == YES) {
static int64_t frameNumber = 0;
if(self.assetWriterInput.readyForMoreMediaData) {
[self.pixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:CMTimeMake(frameNumber, 25)];
}
frameNumber++;
}
}
当用户按下按钮时,调用此方法:
[self.assetWriter startSessionAtSourceTime:CMTimeMake(frameStart,25)];
这个可以,但只能用一次……如果我想录制第二个视频,黑帧问题就会再次出现。
此外,当我观看输出的视频时,帧率是25fps,正如我想要的那样。但是视频看起来像是加速了一样。好像帧之间的空间不够。因此,电影的播放速度大约是两倍。
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:640], AVVideoWidthKey, [NSNumber numberWithInt:480], AVVideoHeightKey, AVVideoCodecH264, AVVideoCodecKey, nil];
self.assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings];
self.assetWriterInput.expectsMediaDataInRealTime = YES;
latestTimestamp
,它不断从captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
方法中的最后一帧获取时间戳。然后当用户按下按钮时,我执行[self.assetWriter startSessionAtSourceTime:self.latestFrameTimeStamp];
这个方法可以工作,但我猜应该有更好的方法。 - Ramin Afshar-(void) buttonPressed
。然后我在其中调用此方法[self.assetWriter startSessionAtSourceTime:timestamp];
。那么我该如何以良好的方式将委托方法中的最后一个timestamp
传递到我的按钮按下方法中呢? - Ramin Afsharself.recording = YES;
。在捕获委托方法中,您可以检查if (self.recording && self.assetWriter.status != AVAssetWriterStatusWriting) {[self.assetWriter startWriting]; [self.assetWriter startSessionAt...]; ...}
。这样,它将在第一个样本到达时开始录制。 - Frank Rupprecht