我正在編寫一個應用程序,用戶最多可以錄製6個視頻剪輯,每個視頻剪輯的持續時間爲2秒。錄製視頻剪輯時,用戶可以使用6個按鈕進行播放 - 每個剪輯一個。用戶可以通過在6個剪輯之間切換來錄製電影。問題是,當用戶按下按鈕時,我需要在6個片段之間進行近乎瞬時的切換 - 否則播放片段的錯覺就會丟失 - 功能與App Store中名爲CamBox的應用程序有點類似。使用AVFoundation在視頻之間快速切換
我每次用戶按下按鈕時,首先嚐試用AVPlayer中的AVPlayerItem初始化每個剪輯和AVAsset。玩家的輸出是在我的主視圖中指向AVPlayerLayer的。問題是加載和開始播放的時間很長,這意味着當用戶連續按下按鈕時,視頻滯後。
我決定嘗試使用5個AVPlayers和5個AVPlayerLayers預加載所有剪輯。 5 PlayerLayers被插入到我的主視圖中,當用戶按下按鈕時,當前正在播放的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;
}
我prette確定的4個預裝視頻剪輯方面的限制是硬件限制,但另一種選擇是什麼。有人有任何想法嗎? 在此先感謝。
6個剪輯是否以任意順序播放? –
不是真的 - 用戶按隨機順序按六個按鈕來決定。我沒有使用動畫ImageViews模擬視頻,雖然它需要一些額外的代碼,但工作正常。 – blackpool
用戶是否被允許按任意*按鈕中的任意*按鈕?或者例如一旦按下一個按鈕,用戶只能按下其餘的5,然後按4,等等? – superjos