我正在使用AVCaptureVideoDataOutput
来抓取帧,处理它们,然后使用AVAssetWriter
将它们写入MOV文件。我知道要设置数据输入的最小帧速率,我只需要写
myDataOutput.minFrameDuration = someCMTime;
如何获得给定周期
的实际帧持续时间 - (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
我需要实际持续时间,以便我可以为资产编写者输入准确的持续时间。我一直在使用CMSampleBufferGetDuration(sampleBuffer)
,但收效甚微。知道如何获得这个价值吗?
这是我当前的captureOutput方法实现:
- (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
if([writerInput isReadyForMoreMediaData])
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
if(imageBuffer){
totalTime = CMTimeAdd(totalTime, CMSampleBufferGetDuration(sampleBuffer));
if([adaptor appendPixelBuffer:imageBuffer withPresentationTime:totalTime]){
NSLog(@"frame added");
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
}else{
NSLog(@"frame NOT added");
}
}else{
NSLog(@"no buffer");
}
}else{
NSLog(@"writerinput not ready");
}
}
答案 0 :(得分:1)
最后,问题是我使用AVAssetWriterInputPixelBufferAdaptor
,这需要用户设置演示时间。相反,我最后只是通过在appendBuffer
AVAssetWriterInput
来直接添加框架