2011-09-13 4 views
4

사용자가 최대 6 개의 비디오 클립을 2 초 동안 기록 할 수있는 응용 프로그램을 작성하고 있습니다. 비디오 클립이 기록되면 사용자는 6 개의 버튼 (각 클립마다 하나씩)을 사용하여 비디오 클립을 재생할 수 있습니다. 사용자는 6 개의 클립 사이를 전환하여 동영상을 녹화 할 수 있습니다. 문제는 사용자가 버튼을 누를 때 6 개의 클립 사이를 거의 즉각적으로 전환해야한다는 것입니다. 그렇지 않으면 클립을 사용하여 장난을 치는 환상이 상실됩니다.이 기능은 앱 스토어의 CamBox라는 앱과 다소 유사합니다.AVFoundation을 사용하여 비디오간에 빠른 전환

먼저 사용자가 버튼을 누를 때마다 AVPlayer의 AvPlayerItem에서 AVAsset이있는 모든 클립을 초기화하려고했습니다. 플레이어의 출력이 내 메인보기의 AVPlayerLayer로 전달되었습니다. 문제는 재생을로드하고 시작하는 데 걸리는 시간이 매우 길어서 사용자가 버튼을 빠르게 연속해서 누르면 비디오가 지연된다는 것입니다.

나는 5 개의 AVPlayers 및 5 개의 AVPlayerLayers를 사용하여 모든 클립을 미리로드하려고했습니다. 5 개의 PlayerLayers가 메인 뷰에 삽입되고 사용자가 버튼을 누르면 현재 재생중인 AVPlayer가 일시 정지되고 되감기되며 현재 표시된 AVPlayerLayer가 숨겨집니다. 새 AVPlayer가 시작되고 해당 AVPlayerLayer가 표시됩니다. 그것은 꽤 괜찮은 나의 첫 번째 솔루션보다 훨씬 빠르지 만 순식간이지만 문제는 사용자가 마지막 두 개를 플레이하는 버튼을 누르는 것보다 클립이 4 클립 만 미리로드 할 수 있다는 것입니다.

- (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 해요 : 아래는 클립

-(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 개 버튼의 이벤트 핸들러는 다음과 같습니다를 미리로드하려면 코드입니다 , 그러나 대안은 무엇인가. 아무도 아이디어가 있니? 미리 감사드립니다.

+0

6 개의 클립이 순서에 관계없이 재생됩니까? –

+0

아니요. 실제로 사용자가 임의의 순서로 여섯 개의 버튼을 눌러 결정합니다. 나는 애니메이션 ImageViews를 사용하여 비디오를 시뮬레이트하지 않았으므로 몇 가지 추가 코드가 필요하지만 괜찮습니다. – blackpool

+0

사용자가 * 모든 * 버튼을 * 누를 수 있습니까? 또는 예 : 일단 버튼을 누르면, 사용자는 나머지 5 개를 누른 다음 4 개를 누를 수 있습니다. – superjos

답변

0

대답은 iphone-smooth-transition-from-one-video-to-another입니다.이 로직을 구현하는 데 사용할 수있는 라이브러리와 애니메이션 클립을 시작하는 3 개의 버튼이있는 예제 앱이 나와 있습니다. 각 클립에는 관련 사운드 효과가 있습니다.