iOS Frame by Frame视频播放前进/后退

时间:2012-05-23 10:55:41

标签: ios video avfoundation frame timelapse

我想以慢动作在iOS设备上显示视频。

我的视图包含一个视频(约2秒长)和一个滑块。

用户可以逐帧移动滑块并逐步(向前和向后)穿过电影。

MPMoviePlayerController缺乏逐帧步骤的能力。

我读到了MVAssetReader,但我没有具体的想法如何使用它。

我没有固定的帧率,因此它应该从视频的元数据中获取此信息。我真的需要展示每一帧。

有人能给我一些线索吗?

2 个答案:

答案 0 :(得分:3)

AV播放器演示WWDC 2010示例代码的示例代码可以帮助您完成任务

使用AV Foundation Framework在WWDC 2010 AV编辑中解释视频切割缩略图以及使用示例代码编辑音频和视频的许多其他事项

如果您有开发者帐户(付费),那么您可以在iTunes上观看视频

答案 1 :(得分:1)

AVFoundation是一个非常强大的框架,但需要比MPMoviePlayerController更多的输入和理解。我强烈建议Dinesh建议观看WWDC视频,查看示例代码并阅读文档。该文档对于获得概念性理解非常有用,但在涉及实际视频格式的细节时,它缺少一些细节。为此,示例代码和实验很好。

如果你想逐帧前进,那么我认为AVPlayerItem stepByCount:是你要走的路。

// Setup a PlayerItem and a Player
NSURL* movieURL = [NSBundle URLForResource:@"movie" withExtension:@"mov" subdirectory:@"" inBundleWithURL:[NSBundle mainBundle].bundleURL];
AVURLAsset* movieAsset = [AVURLAsset assetWithURL:movieURL];
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:movieAsset];
AVPlayer* player = [AVPlayer playerWithPlayerItem:playerItem];

// setup the layer so you can see it
AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:playerLayer];

// Verify our assumptions, in production code you should do something better
NSAsset(player.currentItem.canStepForward, @"Assume this format can step forward");    
NSAsset(player.currentItem.canStepBackward, @"Assume this format can step backward");


[player.currentItem stepByCount:1];  // step forward a frame

[player.currentItem stepByCount:-1];  // step backward a frame