2011-09-13 20 views
4

私は、最大6つのビデオクリップをそれぞれ2秒間録音できるアプリケーションを作成しています。ビデオクリップが記録されると、ユーザーは6つのボタン(各クリップに1つずつ)を使用してビデオクリップを再生できます。ユーザーは、6つのクリップを切り替えることでムービーを録画できます。問題は、ユーザーがボタンを押したときに6つのクリップ間を瞬間的に切り替える必要があることです。そうでなければクリップで遊ぶという錯覚は失われます。機能はApp StoreのCamBoxというアプリに多少似ています。AVFoundationを使用したビデオ間の高速切り替え

最初に、AVPlayerのAvPlayerItemのAVAssetを持つすべてのクリップをユーザーがボタンを押すたびに初期化しようとしました。プレイヤーの出力はメインビューのAVPlayerLayerに向けられていました。問題は、再生を開始して再生するのに要する時間が非常に長いことです。これは、ユーザーがボタンを連続して押したときにビデオが遅れることを意味します。

私は、5つのAVPlayersと5つのAVPlayerLayersを使用してすべてのクリップをプリロードしようとしました。 5つのPlayerLayersがメインビューに挿入され、ユーザーがボタンを押すと、現在再生中のAVPlayerが一時停止して巻き戻され、現在表示されているAVPlayerLayerが非表示になります。新しいAVPlayerが起動され、対応するAVPlayerLayerが表示されます。それは私の最初の解決策よりはるかに高速であることはかなり綺麗ですが、瞬時ではありませんが、問題は、ユーザーが最後の2つのボタンを押したときよりも4クリップの意味があることです。下記の6つのボタンのイベントハンドラは次のようになり、クリップ

-(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; 
    }  
} 

をプリロードするために私のコードです:

- (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つのプリロードビデオクリップの制限は、ハードウェアの制限であることをprette確信していますしかし、代替は何ですか。誰にもアイデアはありますか? ありがとうございます。

+0

6つのクリップは順不同で再生されていますか? –

+0

いいえ、本当に - ユーザーは、6つのボタンをランダムな順序で押して決定します。アニメーション化されたImageViewを使用してビデオをシミュレートしていないので、いくつかの追加コードが必要ですが正常に動作します。 – blackpool

+0

*任意の*ボタンで*任意の*ボタンを押すことができますか?例えば、一度ボタンを押すと、ユーザーは残りの5、次に4などしか押すことができません。 – superjos

答えて

0

答えはiphone-smooth-transition-from-one-video-to-anotherです。このロジックを実装するためのライブラリと、アニメーションクリップを開始する3つのボタンを備えたサンプルアプリケーションを示しています。各クリップには関連するサウンドエフェクトもあります。

関連する問題