我想在 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