사용자가 최대 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 개 버튼의 이벤트 핸들러는 다음과 같습니다를 미리로드하려면 코드입니다 , 그러나 대안은 무엇인가. 아무도 아이디어가 있니? 미리 감사드립니다.
6 개의 클립이 순서에 관계없이 재생됩니까? –
아니요. 실제로 사용자가 임의의 순서로 여섯 개의 버튼을 눌러 결정합니다. 나는 애니메이션 ImageViews를 사용하여 비디오를 시뮬레이트하지 않았으므로 몇 가지 추가 코드가 필요하지만 괜찮습니다. – blackpool
사용자가 * 모든 * 버튼을 * 누를 수 있습니까? 또는 예 : 일단 버튼을 누르면, 사용자는 나머지 5 개를 누른 다음 4 개를 누를 수 있습니다. – superjos