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

在iOS中不使用播放方法显示视频帧,ios,avfoundation,avplayer,frame-rate,cmtime,Ios,Avfoundation,Avplayer,Frame Rate,Cmtime,我试图理解视频文件中CMTime和fps的功能。我试图在AVPlayer中使用for循环呈现视频的每一帧。我知道使用AVPlayer的播放方法可以轻松完成此任务。但我想知道帧是如何精确显示的。我创建了一个for循环,并试图通过不断更新AVPlayer的seekToTime方法一个接一个地呈现每个帧。我能够开发一个解决方案,但它没有显示所有的帧和视频看起来不稳定 这是我的代码: for(float t=0; t < asset.duration.value; t++) { CMTim

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

这是我的代码:

for(float t=0; t < asset.duration.value; t++)
{
    CMTime tt = CMTimeMake(t, asset.duration.timescale);
    [self.player seekToTime:tt];
    NSLog(@"%lld, %d",tt.value, tt.timescale);
}
for(浮动t=0;t
这里,player是AVPlayer的实例,asset是视频资源,我试图展示其帧。 我也尝试过使用CMTimeMakeSeconds(t,asset.duration.timescale),但没有成功

请给出你的建议。
谢谢。

在视频文件中,每秒帧数通常不是一个常数-帧数在发生时发生。如果您想知道这是什么时候,可以使用
avassetrader
avassetradertrackoutput
类检查帧的显示时间戳:

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)
}
在代码中,您对视频时间线的采样不正确。以下是以30 fps的速度采样的方式(如上所述,这可能与实际帧边界不符):

for(CMTime t=kCMTimeZero;CMTimeCompare(t,asset.duration)<0;t=CMTimeAdd(t,CMTimeMake(1,30))){
[玩家搜索时间:t];
}

在视频文件中,每秒帧数通常不是一个常数-帧数在发生时发生。如果您想知道这是什么时候,可以使用
avassetrader
avassetradertrackoutput
类检查帧的显示时间戳:

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)
}
在代码中,您对视频时间线的采样不正确。以下是以30 fps的速度采样的方式(如上所述,这可能与实际帧边界不符):

for(CMTime t=kCMTimeZero;CMTimeCompare(t,asset.duration)<0;t=CMTimeAdd(t,CMTimeMake(1,30))){
[玩家搜索时间:t];
}

我正在尝试创建一个平滑的视频洗涤器,就像iOS照片应用程序中的一样。我认为Avassetrader应该做我的工作。你能推荐一些我可以开始阅读AVAsstReader的资源吗?我能找到的唯一资源是在苹果的网站上,关于拍摄视频时处理单个帧的内容。我正在寻找从相机卷中选择的视频获得单独的帧。谢谢。我正在尝试创建一个平滑的视频洗涤器,就像iOS照片应用程序中的一样。我认为Avassetrader应该做我的工作。你能推荐一些我可以开始阅读AVAsstReader的资源吗?我能找到的唯一资源是在苹果的网站上,关于拍摄视频时处理单个帧的内容。我正在寻找从相机卷中选择的视频获得单独的帧。谢谢