gpt4 book ai didi

ios - 检测 AVAsset 中的当前关键帧间隔

转载 作者:行者123 更新时间:2023-12-01 18:40:53 29 4
gpt4 key购买 nike

我正在开发一个播放视频并允许用户在视频中向前和向后滑动的应用程序。擦洗必须顺利进行,所以我们总是用 SDAVAssetExportSession 重写视频具有视频压缩属性 AVVideoMaxKeyFrameIntervalKey:@1这样每一帧都将是一个关键帧,并允许平滑的反向擦洗。这很好用,并提供流畅的播放。该应用程序使用来自各种来源的视频,可以在 android 或 iOS 设备上录制,甚至可以从 Web 下载并添加到应用程序中,因此我们最终会得到完全不同的编码,其中一些已经适合擦洗(每帧是关键帧)。有没有办法检测视频文件的关键帧间隔,这样我就可以避免不必要的视频处理?我浏览了很多 AVFoundation 的文档,并没有看到明显的方法来获取这些信息。感谢您对此的任何帮助。

最佳答案

如果您可以通过创建 AVAssetReaderTrackOutput 快速解析文件而无需解码图像无 outputSettings .您遇到的帧样本缓冲区有一个附件数组,其中包含一个包含有用信息的字典,包括该帧是否依赖于其他帧,或者其他帧是否依赖于它。我会将前者解释为表示关键帧,尽管它给了我一些低数字(一个文件中有 4% 的关键帧?)。无论如何,代码:

let asset = AVAsset(url: inputUrl)
let reader = try! AVAssetReader(asset: asset)

let videoTrack = asset.tracks(withMediaType: AVMediaTypeVideo)[0]
let trackReaderOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: nil)

reader.add(trackReaderOutput)
reader.startReading()

var numFrames = 0
var keyFrames = 0

while true {
if let sampleBuffer = trackReaderOutput.copyNextSampleBuffer() {
// NB: not every sample buffer corresponds to a frame!
if CMSampleBufferGetNumSamples(sampleBuffer) > 0 {
numFrames += 1
if let attachmentArray = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, false) as? NSArray {
let attachment = attachmentArray[0] as! NSDictionary
// print("attach on frame \(frame): \(attachment)")
if let depends = attachment[kCMSampleAttachmentKey_DependsOnOthers] as? NSNumber {
if !depends.boolValue {
keyFrames += 1
}
}
}
}
} else {
break
}
}

print("\(keyFrames) on \(numFrames)")

注:这仅适用于本地文件 Assets 。

p.s.你没有说你是如何擦洗或玩耍的。一个 AVPlayerViewControllerAVPlayer ?

关于ios - 检测 AVAsset 中的当前关键帧间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333313/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com