在iOS中不使用播放方法显示视频帧

时间:2016-09-24 20:56:50

标签: ios avfoundation avplayer frame-rate cmtime

我试图了解视频文件中CMTime和fps的功能。我试图使用for循环在AVPlayer中呈现视频的每个帧。我知道使用AVPlayer的播放方法可以轻松完成此任务。但我想知道帧的确切显示方式。我创建了一个for循环,并尝试通过不断更新AVPlayer的seekToTime方法逐个呈现每个帧。我能够开发出一个解决方案,但它没有显示所有帧,视频看起来很生涩。

这是我的代码:

users

这里,播放器是AVPlayer的实例,资产是我试图呈现的帧的视频资产。 我也尝试过使用CMTimeMakeSeconds(t,asset.duration.timescale),但没有用。

请提出你的建议。 谢谢。

1 个答案:

答案 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)
}