如何跟踪AVAssetWriter写作的进展如何?
-
26-09-2019 - |
题
如何计算AVAssetWriter过程的进度?所以,如果我有这样的:
[assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
while (1){
if ([assetWriterInput isReadyForMoreMediaData]) {
CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer];
if (sampleBuffer) {
[assetWriterInput appendSampleBuffer:sampleBuffer];
CFRelease(sampleBuffer);
} else {
[assetWriterInput markAsFinished];
break;
}
}
}
}];
我能在循环过程中拉(或轮询)要弄清楚如何Y的许多X我已经完成了?
感谢。
解决方案
在样品缓冲液中对他们几个时间戳。你可以得到展现时间戳与调用:
CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
您可以再使用它来确定你是到源的输入缓冲区多远。 presTime /持续时间应该给你代表的大致进度0.0到1.0的值。如果需要更精确你可以尝试因素,在样品中的样本的持续时间缓冲使用CMSampleBufferGetDuration()。
如果您在其他时间戳记在头看看附近的演示时间不工作。
其他提示
可以跟踪使用下面的代码的进展。你需要视频的总时长,你会得到使用下面的代码。
let asset = AVAsset(url: urlToCompress);
let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)
现在,你需要计算压缩视频的当前时间戳。
let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
self.progress.progress = Float(per)
}
不隶属于 StackOverflow