【问题标题】:Synchronize video to openGL animation将视频同步到openGL动画
【发布时间】:2011-10-03 06:20:12
【问题描述】:

我正在尝试将视频同步到在 iPad 上使用 openGL 绘制的动画,但有两件事我不知道该怎么做:

  1. 查找当前正在播放的视频帧。
  2. 确保视频更新和 openGL 绘图更新同时发生,因为即使是轻微的同步问题也可能导致视觉伪影。

【问题讨论】:

  • 你通过什么方式播放视频?使用内置的封闭式视频播放器视图或控制器,还是通过 AVFoundation 将帧一一拉出,然后将它们推到某个地方?
  • 我正在通过 MPMoviePlayerController 播放视频。然后我可以使用 CurrentPlaybackTime 乘以帧速率来获得显示的帧数,但问题是视频以与我的 opengl 渲染器不同的帧速率播放。有没有办法同步这两者,以便在渲染下一个视频帧之前始终确保我的 opengl 层渲染在视频中的每一帧之上?
  • 您找到解决方案了吗?我也有同样的问题。
  • 使用 OpenGL 渲染视频,这是唯一确定的方法。其他任何事情都可以解决。
  • 关于将视频渲染为 OpenGL 纹理的评论,这可能是您最好的选择。可以在此博客文章中找到一个展示如何将视频帧从文件推送到纹理的示例:modejong.com/blog/…

标签: ios ipad video opengl-es


【解决方案1】:

不确定它是否有效,但您可以使用AVPlayerAVSynchronizedLayer 来将您的OpenGL 层时序与AVPlayerLayer 同步,而不是使用MPMoviePlayerController

您可以像这样创建视频播放器:

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

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 2011-09-25
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多