我试图了解视频文件中CMTime和fps的功能。我试图使用for循环在AVPlayer中呈现视频的每个帧。我知道使用AVPlayer的播放方法可以轻松完成此任务。但我想知道帧的确切显示方式。我创建了一个for循环,并尝试通过不断更新AVPlayer的seekToTime方法逐个呈现每个帧。我能够开发出一个解决方案,但它没有显示所有帧,视频看起来很生涩。
这是我的代码:
users
这里,播放器是AVPlayer的实例,资产是我试图呈现的帧的视频资产。 我也尝试过使用CMTimeMakeSeconds(t,asset.duration.timescale),但没有用。
请提出你的建议。 谢谢。
答案 0 :(得分:0)
每秒帧数在视频文件中通常不是常量 - 帧发生时会发生帧。如果您想知道何时可以使用mocha test.js -R nyan
和AVAssetReader
类检查帧的演示时间戳:
AVAssetReaderTrackOutput
在您的代码中,您错误地对视频时间轴进行了采样。以下是如何以30 fps采样(如上所述,这可能与实际帧边界不对应):
let reader = try! AVAssetReader(asset: asset)
let videoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]
let trackReaderOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings:nil)
reader.addOutput(trackReaderOutput)
reader.startReading()
while let sampleBuffer = trackReaderOutput.copyNextSampleBuffer() {
// pts shows when this frame is presented
// relative to the start of the video file
let pts = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
}