2011-10-03 55 views
11

我試圖同步到iPad上用openGL繪製的動畫視頻,並有兩件事情我不知道該怎麼做:同步視頻OpenGL的動畫

  1. 查找當前正在播放的視頻幀。
  2. 確保更新的視頻和更新的OpenGL繪圖發生在同一時間,即使輕微的同步問題可能會導致視覺工件。
+0

通過什麼方式,你播放視頻?使用內置的封閉視頻播放器視圖或控制器,還是通過AVFoundation逐幀拖出幀,然後將它們從某處推出? – Tommy

+0

我正在通過MPMoviePlayerController播放視頻。然後,我可以使用與幀速率相乘的CurrentPlaybackTime來獲取幀數,​​但問題在於視頻以不同於我的opengl渲染器的幀率播放。有沒有辦法將兩者同步,這樣我就可以在渲染下一個視頻幀之前始終確保我的opengl圖層在視頻中的每幀之上呈現? – sinsro

+0

您是否找到解決方案?我有同樣的問題。 –

回答

3

不知道它會工作,但不是使用MPMoviePlayerController你可以使用一個AVPlayer使用和AVSynchronizedLayerAVPlayerLayer的一個你的OpenGL層定時同步。

你可以創建視頻播放器這樣的:

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]]; 

然後創建一個AVSynchronizedLayer層,並同步其與playerLayer

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

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

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