【发布时间】:2011-09-13 17:58:38
【问题描述】:
我正在编写一个应用程序,用户可以在其中录制多达 6 个视频剪辑,每个剪辑的持续时间为 2 秒。录制视频剪辑时,用户可以使用 6 个按钮播放它们 - 每个剪辑一个。然后,用户可以通过在 6 个剪辑之间切换来录制电影。问题是,当用户按下按钮时,我需要在 6 个剪辑之间进行近乎瞬时的切换 - 否则会失去播放剪辑的错觉 - 该功能有点类似于 App Store 中名为 CamBox 的应用。
我首先尝试在每次用户按下按钮时使用 AVPlayer 中的 AvPlayerItem 中的 AVAsset 初始化每个剪辑。在我的主视图中,播放器的输出指向 AVPlayerLayer。问题是加载和开始播放所需的时间很长,这意味着当用户快速连续按下按钮时视频会滞后。
我决定尝试使用 5 个 AVPlayer 和 5 个 AVPlayerLayers 预加载所有剪辑。 5 个 PlayerLayer 被插入到我的主视图中,当用户按下按钮时,当前播放的 AVPlayer 会暂停并倒带,并且当前可见的 AVPlayerLayer 会被隐藏。新的 AVPlayer 启动并显示相应的 AVPlayerLayer。它工作得很好,比我的第一个解决方案快得多,虽然不是即时的,但问题是我只能预加载 4 个剪辑,这意味着当用户按下播放最后两个的按钮时,它会滞后很长时间。下面是我预加载剪辑的代码
-(void)loadVideos
{
layers = [[NSMutableArray alloc] initWithCapacity:6];
players = [[NSMutableArray alloc] initWithCapacity:6];
for(int i = 1; i < 7; i++)
{
NSURL* fileURL = [NSURL fileURLWithPath:[self getFileName:i]];
AVPlayerItem* avPlayerItem = [[[AVPlayerItem alloc] initWithURL:fileURL] autorelease];
[avPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
AVPlayer *avPlayer = [[[AVPlayer alloc] initWithPlayerItem:avPlayerItem] autorelease];
[avPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
[avPlayer addObserver:self forKeyPath:@"currentItem" options:0 context:nil];
AVPlayerLayer* layer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
layer.frame = self.playerView.bounds;
[playerView.layer addSublayer:layer];
[layers addObject:layer];
[players addObject:avPlayer];
layer.hidden = YES;
}
}
6 个按钮的事件处理程序如下所示:
- (IBAction)takeBtnClicked:(id)sender {
int tag = ((UIButton*)sender).tag;
AVPlayer* player;
AVPlayerLayer* layer;
if (layerIndex > -1) {
player = [players objectAtIndex:layerIndex];
layer = [layers objectAtIndex:layerIndex];
[player pause];
layer.hidden = YES;
[player seekToTime:kCMTimeZero];
}
layerIndex = tag-1;
player = [players objectAtIndex:layerIndex];
layer = [layers objectAtIndex:layerIndex];
[player play];
layer.hidden = NO;
}
我很确定 4 个预加载视频剪辑的限制是硬件限制,但有什么替代方案。有人有什么想法吗? 提前致谢。
【问题讨论】:
-
这 6 个片段是否按任何顺序播放?
-
不,不是——用户通过按随机顺序按六个按钮来决定。我没有使用动画 ImageViews 模拟视频,虽然它需要一些额外的代码,但它工作正常。..
-
是否允许用户按any顺序按any按钮?或者例如一旦按下一个按钮,用户只能按下剩余的 5 个,然后是 4 个,以此类推?
-
在哪里可以找到更好的解决方案?我正在做类似的事情并发现同样的问题......
标签: ios video avfoundation avplayer