2011-10-03 19 views
11

Próbuję zsynchronizować wideo do animacji sporządzonej przy użyciu OpenGL na iPadzie, a tam są dwie rzeczy, nie jestem pewien jak to zrobić:Synchronizacja video OpenGL animacji

  1. Znajdź aktualnie odtwarzanego klatkę wideo.
  2. Upewnij się, że aktualizacja wideo i aktualizacja rysunku OpenGL następuje dokładnie w tym samym czasie, ponieważ nawet niewielki problem z synchronizacją może powodować artefakty wizualne.
+0

w jaki sposób grasz wideo? Korzystając z wbudowanego widoku lub kontrolera zamkniętego odtwarzacza wideo, czy wyciągasz ramki jeden po drugim przez AVFoundation, a następnie je gdzieś spychasz? – Tommy

+0

Odtwarzam wideo przez MPMoviePlayerController. Mogę następnie użyć CurrentPlaybackTime pomnożonego przez ilość klatek na sekundę, aby uzyskać numer klatki, ale problem polega na tym, że wideo odtwarzane jest z inną szybkością klatek niż mój renderer OpenGL. Czy istnieje sposób na zsynchronizowanie tych dwóch elementów, aby zawsze upewnić się, że moja warstwa warstwy otwartej renderuje się na górze każdej klatki w filmie, zanim zostanie wyświetlona następna klatka wideo? – sinsro

+0

Czy znalazłeś rozwiązanie tego problemu? Mam ten sam problem. –

Odpowiedz

3

Nie wiem, to będzie działać, ale zamiast używać MPMoviePlayerController można użyć AVPlayer i obsłudze i AVSynchronizedLayer zsynchronizować OpenGL warstwy taktowanie z jednym AVPlayerLayer „s.

Można by stworzyć odtwarzacz wideo tak:

NSURL *videoURL = [NSURL fileURLWithPath:@"your_url"]; 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:nil]; 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 

UIView *playerView = [[UIView alloc] initWithFrame:frame]; 
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 
[playerLayer setFrame:[[playerView layer] bounds]]; 

następnie utworzyć AVSynchronizedLayer warstwę i zsynchronizować go z playerLayer:

AVSynchronizedLayer *syncLayer = [AVSynchronizedLayer synchronizedLayerWithPlayerItem:playerItem]; 
[syncLayer addSublayer:yourGlView.layer]; 

[playerView.layer addSublayer:playerLayer]; 
[playerView.layer addSublayer:syncLayer]; 

[self.view addSubview:playerView]; 
...