我想在 iOS 设备上以慢动作显示视频。
我的视图包含一个视频(约 2 秒长)和一个滑块。
用户可以在电影中逐帧移动滑块和步进(向前和向后)。
MPMoviePlayerController缺乏逐帧步进的能力。
我读到了MVAssetReader,但我不知道如何使用它。
我没有固定的帧率,所以它应该从视频的元数据中提取这些信息。我真的需要展示每一帧。
有人可以给我一个线索吗?
我想在 iOS 设备上以慢动作显示视频。
我的视图包含一个视频(约 2 秒长)和一个滑块。
用户可以在电影中逐帧移动滑块和步进(向前和向后)。
MPMoviePlayerController缺乏逐帧步进的能力。
我读到了MVAssetReader,但我不知道如何使用它。
我没有固定的帧率,所以它应该从视频的元数据中提取这些信息。我真的需要展示每一帧。
有人可以给我一个线索吗?
AV Player Demo WWDC 2010 示例代码的示例代码可以帮助您完成任务
从视频中剪切缩略图在 WWDC 2010 AV Editing with AV Foundation Framework 和许多其他关于使用示例代码编辑音频和视频的内容中进行了解释
如果您有开发者帐户(付费),那么您可以在 iTunes 上观看视频
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