Eri*_*sen 8 iphone cocoa objective-c avfoundation avassetwriter
如何计算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;
}
}
}
}];
Run Code Online (Sandbox Code Playgroud)
我可以在循环中拉动(或轮询)以确定我完成了多少x?
谢谢.
Jon*_*etz 19
样本缓冲区上有几个时间戳.您可以通过以下呼叫获得演示时间戳:
CMTime presTime = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用它来确定您进入输入缓冲区的源的距离.presTime/duration应该给出一个代表近似进度的0.0到1.0的值.如果您需要更精确,可以尝试使用CMSampleBufferGetDuration()来计算样本缓冲区中样本的持续时间.
如果演示时间不起作用,请查看标题中附近的其他时间戳.
您可以使用下面的代码跟踪进度。您需要视频的总时长,然后使用下面的代码。
let asset = AVAsset(url: urlToCompress);
let duration = asset.duration
let durationTime = CMTimeGetSeconds(duration)
Run Code Online (Sandbox Code Playgroud)
现在,您需要计算压缩视频的当前时间戳。
let timeStamp = CMSampleBufferGetPresentationTimeStamp(sample!)
let timeSecond = CMTimeGetSeconds(timeStamp)
let per = timeSecond / durationTime
print("Duration --- \(per)")
DispatchQueue.main.async {
self.progress.progress = Float(per)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3654 次 |
| 最近记录: |