如何在解码 video.mp4 时获取 iOS 中每个视频帧的时间戳

Gam*_*ads 6 objective-c decoder ios avassetreader cmsamplebufferref

场景:
我正在编写一个iOS 应用程序来尝试解码videoFile.mp4. 我使用AVAssetReaderTrackOutputAVAssetReader来解码视频文件中的帧。这非常有效。videoFile.mp4我基本上使用以下核心逻辑来获取每一帧。

代码:

AVAssetReader * videoFileReader;
AVAssetReaderTrackOutput * assetReaderOutput = [videoFileReader.outputs objectAtIndex:0];
CMSampleBufferRef sampleBuffer = [assetReaderOutput copyNextSampleBuffer];
Run Code Online (Sandbox Code Playgroud)

sampleBuffer这里是每个视频帧的缓冲区。

问题:

  • 如何在这里获取每个视频帧的时间戳?
  • 换句话说,更详细的是,我如何sampleBuffer获得每个返回的时间戳copyNextSampleBuffer

PS:请注意,我需要以毫秒
为单位的时间戳。

Gam*_*ads 5

我终于得到了我的问题的答案。以下2行可以获取从返回的帧时间戳sampleBuffercopyNextSampleBuffer

CMTime frameTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
double frameTimeMillisecs = CMTimeGetSeconds(frameTime) * 1000;
Run Code Online (Sandbox Code Playgroud)

时间戳在 中返回seconds。因此将其乘以1000转换为milliseconds