2011-09-13 60 views
4

我正在編寫一個應用程序,用戶最多可以錄製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個預裝視頻剪輯方面的限制是硬件限制,但另一種選擇是什麼。有人有任何想法嗎? 在此先感謝。

+0

6個剪輯是否以任意順序播放? –

+0

不是真的 - 用戶按隨機順序按六個按鈕來決定。我沒有使用動畫ImageViews模擬視頻,雖然它需要一些額外的代碼,但工作正常。 – blackpool

+0

用戶是否被允許按任意*按鈕中的任意*按鈕?或者例如一旦按下一個按鈕,用戶只能按下其餘的5,然後按4,等等? – superjos

回答